我在Apache Camel中有2条路线,MultimapRoute(在程序开始时根据数据库查询的结果初始化Multimap对象)和UpdatingRoute(用于更新数据库的监听器,其中Multimap对象已更新)当数据库更新时)。我想确保首先运行MultimapRoute,并按顺序处理来自UpdatingRoute的所有更改。我还想确保解决所有并发问题。
这是MultimapRoute类:
public class MultimapRoute implements org.apache.camel.Processor {
static Multimap<String, String> m = new ArrayListMultimap<String, String>();
static ReentrantLock l = new ReentrantLock();
public void process(Exchange exchange) throws Exception {
try {
l.lock();
//Query the database and fill out the map initially
} finally {
if (l.isHeldByCurrentThread()) l.unlock();
}
}
}
这是UpdatingRoute类:
public class UpdatingRoute implements org.apache.camel.Processor {
public void process(Exchange exchange) throws Exception {
try {
l.lock();
//Update the database based on latest event
} finally {
if (MultimapRoute.l.isHeldByCurrentThread())
MultimapRoute.l.unlock();
}
}
}
我不确定这种多线程方法的线程安全性或其他问题是什么,或者如何使程序成为线程安全的。但我被告知这不是处理这个特定应用程序的多线程的正确方法。非常感谢你的帮助。
答案 0 :(得分:2)
首先,您需要以两种方式在两条路线之间进行沟通以实现此目的:
我想确保首先运行MultimapRoute,并按顺序处理来自UpdatingRoute的所有更改。
为此,我建议您使用基于Condition
的{{1}}。
现在,问题的第二部分:
我不确定这种多线程方法的线程安全或其他问题是什么,或者如何使程序成为线程安全的。
首先,您需要清楚地了解您希望如何使其成为线程安全的。我猜 - 你想确保没有线程能够访问地图ReentrantLock
,而某些线程成功启动m
方法(我的意思是,获得锁定)。为此,请尝试更改您访问地图的方式。我的意思是,现在它没问题,但是在这两个类之外可以看到对地图的引用。以下是我的建议,实施了两个想法:
process()