从MQ异步接收多条消息

时间:2019-03-11 17:23:54

标签: multithreading parallel-processing spring-batch spring-jms mq

我在应用程序中使用Spring + Hibernate + JPA。

我需要从Websphere MQ中读取消息,并将消息插入DB。 有时可能有连续的消息可用,有时消息的数量很少,有时我们期望没有来自Queue的消息。

当前,我正在逐一阅读消息并将其插入数据库。但这对性能没有太大帮助。

我的意思是当我有大量消息时(例如Queue中的300k消息),我无法更快地插入它们。每秒插入数据库的实体数量不是很高。因为我确实对每个实体都进行了承诺。

我想使用休眠批处理,以便可以在一次提交中插入实体列表。 (例如:每次提交30至40条消息)

问题:

  1. 如何从队列接收多条消息? (我检查过BatchMessageListenerContainer可能会有所帮助。但是我无法获得一些参考)

  2. 我应该在onMessage方法之外分离数据库插入过程吗?这样该线程将被释放到池中,并且可用于从Queue中提取下一条消息?

  3. 并行线程使用情况?

当前实施:

消息监听器:

<bean id="myMessageListener" class="org.mypackage.MyMessageListener">

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destinationName" ref="queue"/>
    <property name="messageListener" ref="myMessageListener"/>
    <property name ="concurrentConsumers" value ="10"/>
    <property name ="maxConcurrentConsumers" value ="50"/>        
</bean>

监听器类:

package org.mypackage.MyMessageListener;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;

import org.mypackage.service.MyService;

public class MyMessageListener implements MessageListener {

    @Autowired
    private MyService myService;

    @Override
    public void onMessage(Message message) {
        try {
             TextMessage textMessage = (TextMessage) message;
             // parse the message
             // Process the message to DB
        } catch (JMSException e1) {
             e1.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

不清楚您的要求是什么。

Spring Batch项目提供了BatchMessageListenerContainer

  

消息侦听器容器,用于通过配置提供的建议来拦截消息接收。   要在单个事务中启用消息批处理,请在通知链中使用TransactionInterceptor和RepeatOperationsInterceptor(在基类中设置或不设置事务管理器)。然后,容器将不使用接收单个消息并对其进行处理,而将使用RepeatOperations在同一线程中接收多个消息。与RepeatOperations和事务拦截器一起使用。如果事务拦截器使用XA,则使用XA连接工厂,或者使用TransactionAwareConnectionFactoryProxy来将JMS会话与正在进行的事务同步(在失败后增加重复消息的可能性)。在后一种情况下,您将不需要在基类中提供事务管理器-它仅在进行时就阻止了JMS会话与数据库事务的同步。