如何使用Spring框架转换以下代码?
ConnectionFactory factory = new ConnectionFactory();
factory.setExceptionHandler(new BrokerExceptionHandler(logger, instance));
public final class BrokerExceptionHandler extends StrictExceptionHandler {
@Override
public void handleReturnListenerException(Channel channel, Throwable exception) {
logger.log(Level.SEVERE, "ReturnListenerException detected: ReturnListener.handleReturn", exception);
this.publishAlert(exception, "ReturnListener.handleReturn");
logger.log(Level.SEVERE, "Close application", exception);
System.exit(-1);
}
....
}
基本上,如果发生RabbitMQ异常,则需要指定一个自定义异常处理程序,然后停止应用程序
每次出现异常时,如何发布RabbitMq消息?
编辑
我以这种方式修改了配置类:
@Bean
SimpleMessageListenerContainer containerPredict(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerPredictAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDefaultRequeueRejected(false);
container.setErrorHandler(new BrokerExceptionHandler());
container.setQueueNames(getQueueName());
container.setMessageListener(listenerAdapter);
return container;
}
这是我的BrokerExceptionHandler类
public class BrokerExceptionHandler implements ErrorHandler {
private final Logger logger = Logger.getLogger(getClass().getSimpleName());
@Autowired
private Helper helper;
@Override
public void handleError(Throwable t) {
logger.log(Level.SEVERE, "Exception Detected. Publishing error alert");
String message = "Exception detected. Message: " + t.getMessage());
// Notify the error to the System sending a new RabbitMq message
System.out.println("---> Before convertAndSend");
rabbitTemplate.convertAndSend(exchange, routing, message);
System.out.println("---> After convertAndSend");
}
}
我可以在控制台中看到日志Exception Detected. Publishing error alert
和---> Before convertAdnSend
,但是没有发布新的警报,并且日志---> After convertAndSend
没有出现在控制台中。
这是日志:
2018-10-17 09:32:02.849错误1506 --- [tainer ****-1] BrokerExceptionHandler:检测到异常。发布错误警报
---> convertAndSend之前
2018-10-17 09:32:02.853信息1506 --- [tainer ****-1] osarlSimpleMessageListenerContainer:重新启动Consumer @ 4f5b08d:tags = [{amq.ctag-yUcUmg5BCo20ucG1wJZoWA = myechange}],频道=缓存的兔频道:AMQChannel(amqp://admin@XXX.XXX.XXX.XXX:5672 / testbed_simulators,1),conn:Proxy @ 3964d79共享的兔连接:SimpleConnection @ 61f39bb [delegate = amqp:// admin @ XXX .XXX.XXX.XXX:5672 / testbed_simulators,localPort = 51528],acceptMode = AUTO本地队列大小= 0
2018-10-17 09:32:02.905信息1506 --- [tainer ****-2] osamqp.rabbit.core.RabbitAdmin:自动声明非持久,自动删除或独占队列(myexchange)持久:假,自动删除:真,互斥:真。在连接工厂处于活动状态时,将重新声明代理是否停止并重新启动,但是所有消息都将丢失。
2018-10-17 09:32:02.905信息1506 --- [tainer ****-2] osamqp.rabbit.core.RabbitAdmin:自动声明非持久,自动删除或独占队列(myexchange)持久:假,自动删除:真,互斥:真。在连接工厂处于活动状态时,将重新声明代理是否停止并重新启动,但是所有消息都将丢失。
编辑
调试我发现在发送新消息之前,将调用以下代码:
File: SimpleMessageListenerContainer.class line 1212
if (!isActive(this.consumer) || aborted) {
.....
}
else {
---> logger.info("Restarting " + this.consumer);
restart(this.consumer);
}
编辑2