我想使用Apache Camel JDBC组件来读取Oracle表。我希望Camel在分布式环境中运行以满足可用性问题。但是,我正在阅读的表与队列类似,所以我只希望在任何给定时间都有一个读取器,这样我就可以避免锁定问题(在Oracle中很乱)。
如果读者失败,我希望其他读者接管。
如何使用开箱即用的Camel组件实现这一目标?有可能吗?
答案 0 :(得分:2)
这取决于您的部署架构。例如,如果您在ServiceMix(或ActiveMQ)上以主/从配置(对于HA)部署Camel应用程序,那么在给定时间只有一个消费者将处于活动状态...
但是,如果您需要多次运行(为了可伸缩性而集群化),那么(默认情况下)它们将竞争/复制表中的读取,除非您编写自己的锁定逻辑。
使用Hazelcast Distributed Locking很容易。有一个camel-hazelcast组件,但它不支持锁API。一旦你configure your apps加入Hazelcast集群,那么只需要围绕任何需要为给定对象进行同步的代码的锁定API ...
import com.hazelcast.core.Hazelcast;
import java.util.concurrent.locks.Lock;
Lock lock = Hazelcast.getLock(myLockedObject);
lock.lock();
try {
// do something here
} finally {
lock.unlock();
}