Java:在多个服务器之间同步线程

5
我有一个问题,需要对多个不同服务器上的多个线程进行处理同步,以便在Windows上的Java服务中使用。
在此应用程序中,我有多个消费者线程从同一个JMS队列中拉出消息。消息分为3或4组,我需要确保每组中的消息按顺序完全处理。我需要某种同步机制,以确保如果线程1拉出一条消息,那么线程2从该组中拉出下一条消息,线程2在开始处理其消息之前等待线程1完成处理。
有关线程的分布式同步机制的任何建议?任何类型的解决方案都是好的(JMS解决方案、分布式缓存等)。
注意:我们正在使用的JMS提供程序是ActiveMQ。
3个回答

8

你可能想考虑使用Hazelcast分布式锁。它超级轻便,易于使用并且是开源的。

java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor");
lock.lock ();
try {
// do your stuff
}finally {
   lock.unlock();
}

敬礼,

-talip

Hazelcast - 开源分布式队列、映射、集合、列表、锁。


8

ActiveMQ支持消息组,这应该正是你所需要的。


我已经简要地查看了它们。如果您不断创建新组,您知道消息组会发生什么吗?内部哈希表是否会不断增长?是否有一种方法可以“删除”或“过期”组,以便该组不会永远停留在内存中?顺便说一句,谢谢您的答案。 - Andy White
你可以关闭消息组(详见我链接的页面)。不过,我不确定创建新组的开销如何——最好直接从源代码中查看。 - andri

1

消息头中是否有类似于组ID的东西?如果有,消费者可以创建一个Selector按顺序处理组。

将组分配给特定的消费者可以通过哈希组标识符来完成,或者它们可以使用一些共识协议(如Paxos或虚拟同步)积极协调彼此(消息通过单独的队列发送)。


每个组都有一个“组ID”字段,可以用来将它们分组。然而,这个组ID来自外部方,因此消费者在收到第一条消息之前不会知道ID。 - Andy White
不确定这是否为您提供了任何有用的信息。我是一名中级JMS用户,所以我还没有使用选择器。 - Andy White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接