java - JMS onMessage() 和并发

标签 java concurrency jms java-ee-6

我有一个独立的 JMS 应用程序,它订阅了几个不同的 JMS 主题。每个主题都有自己的 session 和 onMessage() 监听器。每个 onMessage() 方法更新一个公共(public)当前值表 - 所有 onMessage() 方法更新同一个当前值表。

我读到 onMessage 方法实际上是在 JMS 提供者的线程上调用的。所以,我的问题是:如果所有这些 onMessage() 方法都是在与我的应用程序不同的线程上调用的,那么这是否会出现并发问题,因为所有这些线程都会更新一个通用的 CVT?似乎我需要以某种方式同步对 CVT 的访问?

最佳答案

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

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

编辑:事实证明“公共(public)当前值表”是一个公共(public)内存对象。正如我之前提到的,在这种情况下,您需要自己处理并发问题 (Java concurrency tutorial)。

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

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

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

JMS onMessage() 方法总是由 JMS 提供者的线程调用(也称为异步调用)。

关于java - JMS onMessage() 和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008066/

相关文章:

apache - 限制Apache2中的并发连接数

java - Oracle:Java 存储过程发送 JMS 消息

java - QueueConnectionFactory.createQueueConnection() 不返回或抛出异常

java - 我们可以使用 QueueBrowser 只从发送方浏览当前队列中的消息吗?

java - 尝试在 Raspberry Pi 上运行 Arduino IDE 时出错

java - Libgdx 将位图字体对齐到屏幕右上角

java - spring jpa安装程序无法更新数据库

java - 获取 jar 的所有导入类

c# - 并发文件写入

ios - NSManagedObjectContext - FetchRequest 死锁