有一个'MyConsumer'类接收队列中的消息并对其进行处理。有两个要求:如何不使用Spring-JMS确认一条消息?
- 如果有一个消息包含无效内容,MyConsumer不应该承认这一点,但可以处理后续的邮件
- 时MyConsumer重新启动
未被消耗的消息将被重新传递我用spring-jms尝试了listener-container支持,但找不到符合第一个要求的解决方案。
我的代码:MyConsumer
<amq:queue id="destination" physicalName="org.springbyexample.jms.test"/>
<amq:connectionFactory id="jmsFactory" brokerURL="tcp://localhost:11111"/>
<bean id="jmsConsumerConnectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory"
p:targetConnectionFactory-ref="jmsFactory"/>
<bean id="jmsConsumerTemplate" class="org.springframework.jms.core.JmsTemplate"
p:connectionFactory-ref="jmsConsumerConnectionFactory"
p:defaultDestination-ref="destination"/>
<bean id="jmsMessageListener" class="test.MyConsumer"/>
<bean id="errorHandler" class="test.MyErrorHandler"/>
<jms:listener-container container-type="default"
connection-factory="jmsConsumerConnectionFactory"
error-handler="errorHandler"
acknowledge="client">
<jms:listener destination="org.springbyexample.jms.test" ref="jmsMessageListener"/>
</jms:listener-container>
类:
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("!!!!!!!!! get message: " + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
if (theNumberOfMessageIs(3)) {
throw new RuntimeException("something is wrong");
}
}
您可能会注意到,在listener-container
的acknowledge
是client
,实际上它有3个值:
- 自动(缺省)
- 客户
- 交易
我想所有的人,但没有一个适合我的要求。我的测试场景:
- 制片人把3个消息要排队
- 启动一个线程来监视队列中的消息计数,当计数的变化,打印
- 启动消费者,它将从队列接收消息,并对其进行处理
- 等待一段时间,把另外3个消息要排队
为auto
:
对于client
后
MyConsumer将承认:
MyConsumer将承认只有当没有例外onMessage
抛出。对于第三条消息,它会抛出异常,队列中会有一条消息未被消除。但是,当它获得第4消息,并且不会引发异常,在队列中的第三个消息将被disapeared
对于transacted
:
如果MyConsumer抛出的异常,该消息不会被承认和被重新交付几次。在此之后,该消息从队列
消失,但它们都不符合要求1.
我想:如果我需要寻找比Spring-JMS,或我的用法是错误的其他解决方案?
嗨@Freewind,你有达到你的要求吗? –