我需要什么: 1. 通过 jms 发送消息。2. 保留消息,以便如果未从客户端和服务器重新启动处理,客户端会在服务器重新启动时获取消息。3. 从客户端接收消息的顺序应与发送这些消息的顺序相同。4.队列中有多个消费者,以便并行扩展和处理不同的消息。
我做了什么:我使用活动 mq 并具有以下弹簧配置
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="destination"/>
</bean>
<bean id="template" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="deliveryMode" value="2"/>
<property name="defaultDestination" ref="destination"/>
</bean>
<bean id="messageListener" class="InternalNotificationJMSConsumer"/>
<jms:listener-container connection-factory="pooledConnectionFactory" acknowledge="client" destination-type="queue" concurrency="5-10" container-type="simple" cache="none" client-id="client1" prefetch="1">
<jms:listener destination="destination" ref="messageListener" method="onMessage"/>
</jms:listener-container>
所以我有我的目的地和我的连接池。然后我创建一个spring jmstemplate并开始发送消息
template.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createObjectMessage(message);
}
});
然后我的接收器如下:
@Component
public class JMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
if (message instanceof ObjectMessage) {
....
}
}
我的问题:
一个。使用此配置的消息不是按顺序接收的。鉴于 listener-container.concurency 中的 xsd 注释,这是有道理的:“在主题侦听器或消息顺序很重要的情况下,将并发限制为 1;”。所以问题是我如何/是否可以保持订单但有多个消费者。
湾。消息确认。我需要的是,在处理完消息后,onMessage 返回,然后才将消息视为已确认并且不会重新传输。我没有事务管理器,因为我不在任何应用程序服务器中,并且希望尽可能避免这种情况。我只需要自己确认消息。这可能吗?