使用RabbitMQ发布到消费回调中的队列

时间:2018-09-29 23:23:02

标签: java rabbitmq

我一直在弄乱RabbitMQ,遇到了一个特殊的问题,那就是将消息从使用者的回调发送到通道。虽然我可以很好地确认消息,但是尝试将消息发布到频道并没有任何作用。

下面是一个示例:

// Stuff here...

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

channel.basicQos(16);

channel.basicConsume("transcoding", false, "someConsumerTag", new DefaultConsumer(channel) {

    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        executorService.submit(() -> {
            TestClass testClass = new TestClass();
            testClass.addObserver((o, arg) -> {
                // And stuff here...
                channel.basicAck(envelope.getDeliveryTag(), true);
                channel.basicPublish("", "notification", null, "message");
            });
            testClass.run();
        })
    }
});

如图所示,我正在使用ExecutoreService在单独的线程上处理消息。我有一个实现Runnable并扩展Observable的类。 TestClass完成工作后,将通知观察者,我将手动确认该消息。效果很好。

我现在想发布一条新消息,但是RabbitMQ从未收到过发布的消息。我尝试创建一个新渠道并将其用于发布,但这也不起作用。接下来,我认为这可能是线程问题,但是在单独的线程上发布也不起作用。

我打算尝试为发布创建单独的RabbitMQ连接,但这对我来说意义不大,因为通道应该是单向的。我已经阅读了RabbitMQ的并发说明,但看​​不到任何突出的内容。

我想念什么?

1 个答案:

答案 0 :(得分:0)

因此,事实证明,问题出在消息有效负载上。顺便说一句,此后我创建了两个单独的渠道-一个用于消费者,另一个用于生产者。