spring integration jms channel设置并发消费者导致数据损坏

时间:2017-07-24 00:35:14

标签: java concurrency spring-integration spring-jms

我正在使用spring integration jms通道来使用队列中的消息并对其进行处理。

这是我的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}" />

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

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

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

2 个答案:

答案 0 :(得分:2)

是的,您的代码必须是线程安全的。这就是任何多线程代码的情况。

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

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

答案 1 :(得分:0)

Vishal和我一起工作。

我必须提到正在使用缓存连接工厂,我在TWILIO VERIFICATION SDK FOR ANDROID - INTEGRATION GUIDE注意到了。

    <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的默认消息转换器中,因为在某些情况下,有效负载的部分是“”。

干杯 克里斯