java - spring集成jms channel 设置并发消费者导致数据损坏

标签 java concurrency spring-integration spring-jms

我正在使用 Spring Integration jms channel 来使用队列中的消息并对其进行处理。

这是我的 inbound-channel-config.xml

<jms:message-driven-channel-adapter id="jmsIn"
            destination="requestQueue"
            channel="routingChannel" 
            connection-factory="cachingConnectionFactory" 
            error-channel="errorChannel"
            concurrent-consumers="${jms_adapter_concurrent_consumers}" />

这里,当我将并发消费者设置为大于 1 的值时,我使用的消息在处理时会被损坏。我正在使用队列中的 XML 和 Json 消息,在解析数据时,我可以看到它的一些内容已更改并设置为某个随机值。

仅当并发消费者值设置为 1 时,上述配置才能正常工作。

我的问题是,当我将并发消费者设置为大于 1 的值时,是否必须手动同步(使线程安全)我的代码?

最佳答案

是的,您的代码必须是线程安全的。任何多线程代码都是如此。

但是,同步整个事情将有效地击败并发性。最好使用无状态代码(无字段),或使用线程安全变量(AtomicInteger 等),或将同步限制为小块。

如果同步整个监听器代码,则一次只能处理一个容器线程。

关于java - spring集成jms channel 设置并发消费者导致数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45271150/

相关文章:

java - java中循环和开关的使用

java - 初始化的非最终静态变量是线程安全的吗?

javascript - 异步函数中并发 Promise 的顺序如何工作?

spring-integration - 我如何在 spring-integration-aws 中使用 sqs-message-driven-channel-adapter

java - 从 firebase 获取数据时如何显示进度条?

java - 通过 GET 将 JSON 作为 Java 类传递给 Spring Controller

java - 具有多个模式/数据库的 spring-boot 应用程序中的实体管理器错误

multithreading - 在 Rust 中使用 Mutex 和 Condvar 进行缓冲

java - 使用 spring 集成确保关闭 jms 消费者的正确方法是什么?

java - 按需启动 Spring Integration 路由,而不是在上下文初始化期间启动