Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Rabbitmq队列为空,尽管队列中有消息_Java_Python_Rabbitmq_Spring Amqp_Spring Rabbit - Fatal编程技术网

Java Rabbitmq队列为空,尽管队列中有消息

Java Rabbitmq队列为空,尽管队列中有消息,java,python,rabbitmq,spring-amqp,spring-rabbit,Java,Python,Rabbitmq,Spring Amqp,Spring Rabbit,我将从JavaSpring启动应用程序向消费者发送消息,消费者是Python应用程序 除了输入命令rabbitmqctl list_queues显示video_queue 0这意味着队列中没有消息外,一切正常 消费者正在接收消息并执行一些长流程;因此,如果我在一行中发送多条消息,那么应该有一些消息在队列中等待。我说得对吗 制作人: @Component public class VideoProducer { private Logger logger = LoggerFactory.g

我将从JavaSpring启动应用程序向消费者发送消息,消费者是Python应用程序

除了输入命令
rabbitmqctl list_queues
显示
video_queue 0
这意味着队列中没有消息外,一切正常

消费者正在接收消息并执行一些长流程;因此,如果我在一行中发送多条消息,那么应该有一些消息在队列中等待。我说得对吗

制作人:

@Component
public class VideoProducer {
    private Logger logger = LoggerFactory.getLogger(VideoProducer.class);
    private final static String BROKER_EXCHANGE_NAME = "video_exchange";
    private final static String ROUTING_KEY = "video_routing_key";

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private VideoService videoService;

    @Autowired
    private Gson gson;

    public void produceVideo(VideoDTO video) {
            rabbitTemplate.convertAndSend(BROKER_EXCHANGE_NAME, ROUTING_KEY, gson.toJson(video));

        }
    }
}
消费者

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channelConsumer = connection.channel()

# Video Consumer Settings
channelConsumer.exchange_declare(exchange='video_exchange',
                                 exchange_type='direct')
channelConsumer.queue_declare(queue="video_queue")
channelConsumer.queue_bind(queue="video_queue",
                           exchange="video_exchange",
                           routing_key="video_routing_key")


# Consumer Listener
def callback(ch, method, properties, body): 
   video_dto = eval(json.loads(body))  
   ##Something long process here
   print("Done..  ")    


channelConsumer.basic_consume(queue='video_queue',
                              auto_ack=True,
                              on_message_callback=callback)

print(' [*] Waiting for messages. To exit press CTRL+C')
channelConsumer.start_consuming()
在哪里可以看到我声明的队列上的消息?因为尽管我知道队列中有消息,但使用上述命令无法看到它们

我也在使用RabbitMQ管理门户。

您可以从访问localhost:15672的rabbitMQ管理端口检查和管理队列,一旦任何接收方收到来自队列的消息,它将自动从队列中删除。因此,如果您想查看您的消息,最好通过管理门户进行检查,一旦任何接收者收到这些消息,这些消息将被删除。

您可以使用RMQ管理控制台查看消息和RMQ的其他信息。 使用者可能会使用多条消息并将它们放在内部队列中。若要避免这种情况,请将QOS设置为1,并将ack required设置为true。
关于QOS的更多信息:

我也在使用RMQ管理控制台,但相同。在队列图中,我发送的多条消息仍然为空。我在消费者基本qos(预取计数=1)中设置。但还是一样。顺便说一下,我的使用者是用python实现的。请查看更新的屏幕截图。我已修复。现在,我的消费者只接收一条消息,在它完成任务之前,其余消息都在队列中等待。正如您所说,正确的关键字是QOS预取。但是另外,我在回调函数的末尾添加了
ch.basic\u ack(delivery\u tag=method.delivery\u tag)
。我可以看到排队等候的消息!我也使用rabbitMQ管理门户。我可以从图表中看到消息速率,但在队列图表中没有任何内容。“我的消费者消息回调”中的进程很长,因此其他消息应该在队列中等待。在您的队列名称前面会有一个标记为“传入”的collumn(如果我没有错的话)你可以看到你的消息,只要没有接收者收到它的空消息,collumn就会显示其中的消息数,尽管消息速率显示的是正确的数据。