【发布时间】:2019-08-02 02:02:32
【问题描述】:
我在我的应用程序中使用 Spring + Hibernate + JPA。
我需要从Websphere MQ 读取消息并将消息插入数据库。
有时可能会有连续的消息可用,有时消息的数量会非常少,有时我们可能无法期待来自Queue 的消息。
目前我正在一一阅读消息并将它们插入数据库。但在性能方面并没有多大帮助。
我的意思是当我有大量消息时(例如队列中的 30 万条消息),我无法更快地插入它们。每秒插入数据库的实体数量不是很高。因为我确实为每一个实体做出了承诺。
我想使用休眠批处理,以便我可以在单个提交中插入实体列表。 (例如:每次提交 30 到 40 条消息)
问题:
如何从队列接收多条消息? (我已经检查过 BatchMessageListenerContainer 可能会有所帮助。但我无法获得一些参考)
我应该将 db 插入过程与 onMessage 方法分开吗?那么该线程将被释放到池中并可用于从队列中挑选下一条消息?
并行线程使用情况?
当前实现:
消息监听器:
<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();
}
}
}
【问题讨论】:
-
为了能够批量插入,您需要一个要在一批中插入的项目列表。我认为您必须扩展队列以根据时间和/或大小为您交付一批订单。
-
@FlorianDe 在我的情况下,队列的发件人无法根据时间和/或大小发送一批订单。
-
我认为您必须根据mcve 更新您的问题。因为目前看不到您的实施细节时,很难阐明任何解决方案。
-
@FlorianDe,我通过添加我的实现代码更新了问题
标签: multithreading parallel-processing spring-batch spring-jms mq