rabbitmq消费者回调函数不执行

本文记录了一个RabbitMQ消费者回调函数未执行的问题。在生产者发送消息后,虽然rabbitmq后台显示消息已被消费,但消费者端的回调函数并未打印任何信息。解决方法是在回调函数后添加日志输出,发现回调函数在另一个线程中运行,可能因主线程提前结束导致。通过分析DeliverCallback回调函数的线程,确认其与主线程不同,进一步证实了这一推测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录以下一个rabbitmq消费者函数不执行的情况


生产者类

public class Producer {

    public static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.186.129");
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("123");
        try(Connection connection = connectionFactory.newConnection();
            Channel channel = connection.createChannel();){
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "hello rabbitmq";
            channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        }
    }
}

消费者类

public class Consumer2 {

    public static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.186.129");
        factory.setUsername("admin");
        factory.setPassword("123");
        Connection connection=null;
        Channel channel=null;   
        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            /**
             * queue
             * autoAck
             * deliverCallback
             * cancelCallback
             */
            DeliverCallback deliverCallback = (consumerTag, message) -> {
                String mess = new String(message.getBody());
                System.out.println(mess);
                System.out.println("DeliverCallback----");
            };
            CancelCallback cancelCallback = (consumerTag) -> {
                System.out.println("消息取消。。。");
            };
            channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
        } finally {
            if (channel!=null){
                channel.close();
            }
            if (connection!=null) {
                connection.close();
            }
        }
    }
}

先执行完生产者,后执行消费者,发现消费者没有打印任何东西,但是在rabbitmq的后台看见消息已经被消费了。
channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
后面添加了try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
后就能打印出消息了。
应该是rabbitmq开启另外一个线程去执行回调函数,回调函数还没来得及执行,主线程已经执行完。
通过在DeliverCallback的回调函数中添加Thread.currentThread().getId(),也发现了执行该函数的线程和执行main函数的主线程并不一致。

"D:\Program Files\Java8\bin\java" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=61883:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java8\jre\lib\charsets.jar;D:\Program Files\Java8\jre\lib\deploy.jar;D:\Program Files\Java8\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java8\jre\lib\ext\cldrdata.jar;D:\Program Files\Java8\jre\lib\ext\dnsns.jar;D:\Program Files\Java8\jre\lib\ext\jaccess.jar;D:\Program Files\Java8\jre\lib\ext\jfxrt.jar;D:\Program Files\Java8\jre\lib\ext\localedata.jar;D:\Program Files\Java8\jre\lib\ext\nashorn.jar;D:\Program Files\Java8\jre\lib\ext\sunec.jar;D:\Program Files\Java8\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java8\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java8\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java8\jre\lib\ext\zipfs.jar;D:\Program Files\Java8\jre\lib\javaws.jar;D:\Program Files\Java8\jre\lib\jce.jar;D:\Program Files\Java8\jre\lib\jfr.jar;D:\Program Files\Java8\jre\lib\jfxswt.jar;D:\Program Files\Java8\jre\lib\jsse.jar;D:\Program Files\Java8\jre\lib\management-agent.jar;D:\Program Files\Java8\jre\lib\plugin.jar;D:\Program Files\Java8\jre\lib\resources.jar;D:\Program Files\Java8\jre\lib\rt.jar;D:\project\learnRabbitmq\rabbitmq-hello\target\classes;D:\maven\maven_repository\com\rabbitmq\amqp-client\5.8.0\amqp-client-5.8.0.jar;D:\maven\maven_repository\org\slf4j\slf4j-api\1.7.29\slf4j-api-1.7.29.jar;D:\maven\maven_repository\commons-io\commons-io\2.6\commons-io-2.6.jar" com.learn.rabbitmq.Consumer2
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
main thread--1
DeliverCallback thread--23
hello rabbitmq
-------
main thread--1

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值