java - RabbitMQ Java客户端: What happens when a RuntimeException is thrown inside a consumer's handleDelivery() method?

标签 java rabbitmq client

RabbitMQ Java 客户端的 Consumer 接口(interface)似乎没有诸如 handleException() 方法之类的内容。

那么在 Consumer.handleDelivery() 内部抛出 RuntimeException 会产生什么后果?

人们可能会期望以某种方式记录异常,并且消费者会继续为将来的交付工作,但我不确定。

最佳答案

如果您不处理异常,您的 channel 将被关闭。

使用 autoAck = false 消息将重新排队。

在使用过程中处理错误始终是一个好习惯。

顺便说一句,它存在一个您可以使用的异常处理程序:

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
final ExceptionHandler eh = new DefaultExceptionHandler() {
    @Override
    public void handleConsumerException(Channel channel, Throwable exception, Consumer consumer, String consumerTag, String methodName) {
        System.out.println(" - Error raised by: " + channel.getChannelNumber());
    }
};
factory.setExceptionHandler(eh);

final Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();


channel.queueDeclare("my_queue",true,false,false,null);
channel.basicConsume("my_queue", true, new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

        System.out.println("Received...");
        System.out.println("error:"+ Integer.parseInt("RAISE_AN_ERROR"));

错误将被重定向到处理程序,并且 channel 不会关闭。

就我而言,您应该始终处理事件内的错误。

关于java - RabbitMQ Java客户端: What happens when a RuntimeException is thrown inside a consumer's handleDelivery() method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38956160/

相关文章:

java - PMD Gradle插件中的两层规则集

java - 从 C 客户端向 Java 服务器发送一个字符串

security - 如何确保传递给 react 的角色?

ssl - 如何在 Go HTTPS 服务器中获取客户端证书

java - mysql 加载以前的查询数据来呈现查询

java - 针对调用 Web 服务的方法签名编写 JUnit 测试的最佳方法是什么?

node.js - 何时在 Node REST API中使用rabbitMQ?

c# - RabbitMQ 和 SharedQueue 关闭

Java Arraylist 两个不同的列

java - 如何在 spring-amqp 请求/回复消息中设置回复的内容类型?