我编写了一个Spring应用程序,它使用RabbitMQ客户端API手动实现RabbitMQ。
连接工厂和连接的设置方式与教程类似:
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv)
throws java.io.IOException,
java.lang.InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("122.34.1.1");
factory.setPort(5672);
factory.setUsername("user");
factory.setPassword("password")
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
...
}
}
连接正常。但是,如果我关闭我的主机服务器,我的应用程序似乎陷入某种循环,它试图通过持续ping关闭的主机来自动恢复。
因此,我的控制台充满了大量的“UnknownHostException”堆栈跟踪。根据stacktraces的确切位置是行:
Connection connection = factory.newConnection();
我试图在这一行附近放置一个try-catch块,但这似乎根本不起作用。
如果传统的try-catch块无法处理来自连接的异常,那么捕获异常并停止自动恢复创建此循环的正确方法是什么?
感谢。
答案 0 :(得分:0)
尝试像这样设置你的兔子(两端):
@Bean
public ConnectionFactory connectionFactory() {
final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(server);
connectionFactory.setUsername("user");
connectionFactory.setPassword("pass");
return connectionFactory;
}
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
return factory;
}
默认情况下应设置端口。如果没有,它将在启动时显示,您可以更改它。队列应由消费者(主机或您称之为的任何东西)声明和设置。 如果没有,请在配置类中添加@EnableRabbit注释。
消费者宣布一个队列:
@RabbitListener(queues = "myQueue")
@Component
public class RabbitListener {
@Bean
public Queue getQueue() {
return new Queue("myQueue");
}
@RabbitHandler
public void getElementFromMyQueue(@Payload Object object) {
// handle object as you want
}
}
之后只是@Autowire兔子模板发送者,你应该好好去。即使主机已关闭,队列也应保持空闲但处于活动状态