我有如下弹簧JMS消息监听器容器设置。
<beans:bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<beans:property name="connectionFactory" ref="amqConnectionFactory" />
<beans:property name="destination" ref="request.Queue" />
<beans:property name="messageListener" ref="messageListener" />
<beans:property name="sessionTransacted" value="true" />
<beans:property name="errorHandler" ref="inboundErrorHandler"/>
</beans:bean>
<beans:bean id="inboundErrorHandler" class="com.test.exception.MDPErrorHandler" />
监听器代码如下..
@Component
public class MyMessageListener implements MessageListener {
private static final Log LOG = LogFactory.getLogger(MyMessageListener.class);
@Autowired
private MessageHandler handler;
/**
* @see MessageListener#onMessage(Message)
*/
@Override
public void onMessage(Message inMessage) {
try
{
if (inMessage instanceof TextMessage) {
TextMessage msg = (TextMessage) inMessage;
handler.processRequest(msg.getText());
} else {
LOG.error("Message of wrong type: " + inMessage.getClass().getName());
}
} catch (Exception cause) {
LOG.error("Error while receiving message in MlaMessageListener.onMesage() ",cause);
}
}
}
我的错误处理程序如下..
public class MDPErrorHandler implements ErrorHandler {
/**
* @see org.springframework.util.ErrorHandler#handleError(java.lang.Throwable)
*/
@Override
public void handleError(Throwable t) {
LOG.warn("Inside MDPErrorHandler.handleError()*** ");
t.printStackTrace();
}
}
为什么我的错误处理程序在messageListener.onMessage()中发生任何异常/错误时不会自动调用?
我是否需要手动调用它?
答案 0 :(得分:0)
您不需要像这样配置容器。
只需将错误通道添加到入站适配器;当主流(incomingUpdateChannel-&gt;)发生异常时,ErrorMessage将被发送到错误通道。该消息的有效负载将是MessagingException,您可以提取失败的消息以尝试发送到您的故障队列。只需添加一个变换器(expresssion =&#34; payload.failedMessage&#34;),然后添加一个jms出站适配器。如果发送成功,则原始事务将提交。如果错误通道流引发异常,则将回滚原始消息。