JMS onMessage()和并发

时间:2010-10-24 11:47:10

标签: java concurrency jms java-ee-6

我有一个独立的JMS应用程序,可以订阅几个不同的JMS主题。每个主题都有自己的会话和onMessage()侦听器。每个onMessage()方法都会更新一个公共当前值表 - 所有onMessage()方法都会更新相同的当前值表。

我已经读过onMessage方法实际上是在JMS提供程序的线程上调用的。所以,我的问题是:如果所有这些onMessage()方法都在一个单独的线程上调用而不是我的应用程序,那么这是否会出现并发问题,因为所有这些线程都会更新一个常见的CVT?好像我需要以某种方式同步访问CVT?

1 个答案:

答案 0 :(得分:4)

对您的问题的简短回答:是的,当您的JMS代码更新一些常见的内存中对象时,您需要注意并发问题。

但是,我不确定“常用电流值表”是什么意思?如果这是一些数据库表,那么数据库应该为您处理并发问题。

编辑:原来,“常用当前值表”是常见的内存中对象。正如我之前提到的,在这种情况下,您需要自己处理并发问题(Java concurrency tutorial)。

这个问题主要有两种方法:

无论如何,强烈建议进行自己的测试为您选择最佳方法。

如果您要处理昂贵的创建非线程安全无状态过程代码(不涉及存储数据),那么您也可以使用对象池(例如Commons Pool),但是这样与您当前的问题无关。

JMS onMessage()方法始终由JMS提供程序的线程调用(也称为异步调用)。