从MQ异步接收多个消息从MQ异步接收多个消息(Receiving multiple messages

2019-05-12 14:19发布

我用Spring + Hibernate的JPA +在我的应用程序。

我需要阅读从消息Websphere MQ和插入消息为DB。 有时可连续提供信息和邮件的数量有时非常少的,有时我们不能期望从消息Queue

目前,我被一个读消息之一,将它们插入到数据库。 但它没有太大的帮助在性能方面。

我的意思是当我有(在队列实施例300K消息)的消息的块我无法插入他们更快。 插入每秒DB实体的数量没有那么高。 因为我做的承诺为每一个实体。

我想使用Hibernate批量处理,这样我就可以在一个单一提交插入实体的名单。 (实施例:每承诺30至40的消息)

问题:

  1. 如何从队列中接收多条消息? (我已经检查了BatchMessageListenerContainer可能会有帮助。但我不能得到一些参考)

  2. 我应该分贝插入过程中分离出侧onMessage方法? 因此,该线程将被释放到集中并从队列中选择下一个消息可用?

  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();
        }
    }
}

Answer 1:

目前尚不清楚你的要求是什么。

在Spring Batch的项目提供了一个BatchMessageListenerContainer 。

适于与忠告拦截消息接收消息侦听容器通过配置提供。 为了使消息的配料在单个事务中,使用的TransactionInterceptor和建议链(具有或不具有在基类设定的事务管理器)的RepeatOperationsInterceptor。 代替接收单个消息并对其进行处理的,容器将然后使用RepeatOperations在相同的线程接收多个消息。 有RepeatOperations和事务拦截器使用。 如果事务拦截器使用XA然后使用XA连接工厂,否则TransactionAwareConnectionFactoryProxy到JMS会话与正在进行的交易(开放式两份的消息在出现故障后的可能性)同步。 在后一种情况下,你将不再需要提供在基类中的事务管理器 - 它只是变得在路上和防止与数据库事务同步JMS会话。



文章来源: Receiving multiple messages from MQ asynchronously