【问题标题】:spring integration jms channel setting concurrent-consumers is causing data corruptionspring integration jms channel设置concurrent-consumers导致数据损坏
【发布时间】:2017-12-29 11:34:33
【问题描述】:

我正在使用 spring 集成 jms 通道来消费队列中的消息并进行处理。

这是我的入站通道配置.xml

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

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

上述配置只有在concurrent-consumers 值设置为1 时才能正常工作。

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

【问题讨论】:

标签: java concurrency spring-integration spring-jms


【解决方案1】:

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

但是,同步整个事物将有效地破坏并发性。最好使用无状态代码(无字段),或者使用线程安全变量(AtomicInteger 和朋友),或者限制同步到小块。

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

【讨论】:

  • 查看我的其他 cmets。
【解决方案2】:

Vishal 和我一起工作。

不得不提一下正在使用缓存连接工厂,我注意到在this post you discouraged its use

    <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="MQConnectionFactory" />
    <property name="sessionCacheSize" value="10"/>
</bean>


@Bean(name="MQConnectionFactory")
public ConnectionFactory connectionFactory() {

    if (factory == null) {
        factory = new MQConnectionFactory();
        try {
            factory.setHostName(env.getRequiredProperty(HOST));
            factory.setPort(Integer.parseInt(env.getRequiredProperty(PORT)));            
            factory.setQueueManager(env.getRequiredProperty(QUEUE_MANAGER));
            factory.setChannel(env.getRequiredProperty(CHANNEL));
            factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);  

        } catch (JMSException e) {
            throw new RuntimeException(e);
        }
    }
    return factory;
}

这会导致问题吗?到目前为止,问题似乎发生在 Spring Integration 的默认消息转换器中,因为在某些情况下,有效负载的一部分是“”。

干杯 克里斯

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 2015-07-08
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2013-11-04
    相关资源
    最近更新 更多