java - JMS 1.1 : Load sharing client side for Point-to-Point mode

标签 java concurrency jms tibco-ems

我正在开发的 JMS 1.1 (TibcoJms 4.4.1) 遗留系统在服务器端建立了一个 JMS 队列(不是主题),用于 PTP 通信模式。消息项将不断地被服务器放入队列中。

我想要实现的是通过客户端的多个线程轮询这些数据。每个线程应该处理具有特定属性值的消息。

我猜想,我可以做到这一点的一种方法是实现一个 MessageListener 监听该队列,该队列充当“开关”,将收到的消息分发(推送)到客户端的每个线程进行处理。 或者我可以实现一个 MessageListener 监听服务器上的该队列,并将收到的消息放入客户端上的新队列中,每个线程将针对客户端队列进行轮询。

无论哪种方式,我认为我都需要在线程之间共享的客户端上使用一组额外的数据结构。

我的问题是是否有一种更直接的方法,涉及客户端处理器线程与服务器上的队列之间的直接通信,有点类似于一个主题的多个订阅者(尽管每个订阅者实际上并没有“共享负载”,而是获得相同的负载。这对于我的目的来说是可以接受的)。

在这种情况下,有人可以建议一些好的常见做法吗?

最佳答案

直接连接的概念取决于 JMS 实现的实际编码方式。 pub sub 或点对点本质上并不是更直接的联系。这确实取决于实现。

添加到您选择使用的 API。如果您有多个线程,请考虑这些线程是否是中断驱动的,以便可以使用多个消息监听器,每个监听器都有一个选择器。或者,使用选择器再次使用同步接收。

请记住,JMS 提供程序不是数据库,因此广泛使用选择器并不是一个好主意。他们只是没有所有属性的索引。如果这是一个问题,您将需要一个本地分布数据结构。

根据您所说的,不确定 pub sub 模型是否有帮助。听起来每条安装消息应该只有 1 个消费者。

关于java - JMS 1.1 : Load sharing client side for Point-to-Point mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25919108/

相关文章:

java - 包装类实例与对象上的锁

jakarta-ee - 在 WebLogic 10.3.5 中查找 JMS 队列时 JNDI 查找失败

java - 在运行时创建 DEEP 不可变对象(immutable对象)

java - 在 equal 的实现中使用 hashcode()

postgresql - 执行批量/复制批量插入时是否可以发生读取

java - thread.setPriority(0) 给出 IllegalArgumentException

jms - ActiveMQ 如何将未能发送给消费者的消息保留在队列/主题上?

java - JMS 消息未使用 spring JMSTemplate 接收?

java - 发送邮件时未找到受信任的证书,但该证书似乎在 keystore 中

java - 在 .jtl 文件中获取 jmeter Summariser 数据