当前位置: 首页 > 知识库问答 >
问题:

rabbitMQ读取一个值也会清除que中的其他值

詹钊
2023-03-14

我的问题是:

我想将2个对象写入RabbitMQ并且只读取1个(这是一个测试,以确保如果读取器突然停止,例如ctrl c,我的数据会保留在RabbitMQ中)。我写入MQ没有问题,但是当我只读取一个对象并关闭连接时,另一个对象也会消失。我不知道为什么会发生这种情况。

我遵循了在这里给出的指示

创建频道:

 ConnectionFactory factory = new ConnectionFactory();
 factory.setHost("127.0.0.1");
 factory.setPort(5672);
 Connection connection = factory.newConnection();
 Channel channel =  connection.createChannel();

写入RabbitMQ(写入MQ没有问题)

channel.queueDeclare("myque", false, false, false, null);
channel.basicPublish("", "myque", null, "one".getBytes("UTF-8"));
channel.basicPublish("", "myque", null, "two".getBytes("UTF-8"));

我阅读的方式是:

QueueingConsumer consumer =new QueueingConsumer(channel);
channel.basicConsume("queuethroughProxy", true, consumer);
//while(true){
   QueueingConsumer.Delivery delivery = consumer.nextDelivery();
   String message = new String(delivery.getBody());
   System.out.println("message is : " + message);
//}
connection.close();

我不太确定我在这里做错了什么。

共有2个答案

汪坚
2023-03-14

我猜你是迷糊在线上了

< code>QueueingConsumer。delivery delivery = consumer . nextdelivery();

人们可能会认为是调用消费者。nextDelivery()将从代理获取下一条消息。

但是如果你看到文档中说:“由于服务器将异步推送消息,我们提供了一个对象形式的回调,它将缓冲消息,直到我们准备好使用它们。这就是QueueingConsumer所做的。”

由于启用了auto_ack,一旦消费者被创建,服务器将立即将2条消息推送给消费者。consumer.next交付()只是遍历客户端已经收到的消息。

魏硕
2023-03-14

你在这里犯了两个错误。

  1. 未设置频道。基本Qos(1)--

这些是您丢失队列中所有消息的原因,尽管您消耗了一个。

你可以在这里参考我的博客来了解更多的细节。

 类似资料:
  • 问题内容: 我正在用Go编写执行大量并行计算的软件。我想从工作线程中收集数据,但我不太确定如何以安全的方式进行数据收集。我知道我可以使用通道,但是在我的场景中,它们使它变得更加复杂,因为我必须以某种方式同步主线程中的消息(等到每个线程发送了一些东西)。 情境 主线程创建 n个 实例,并在goroutine中启动其方法,以便每个工作线程都在各自的线程中运行。主线程每10秒应从工作线程中收集一些简单值

  • 这就是我生成dutylist的方法。 这将更改对的第二个值 但是它会更改pos中的其他值,也就是说,如果我更改了StaffListUpdated[0].third[0]=pair,它也会更改StaffListUpdated[1].third[0]=pair。我试过很多种方法,但都无济于事。

  • 问题内容: 我在第3方中设计的课程很差,我需要访问它的一个私有字段。例如,为什么我需要选择私有字段? 如何使用反射获取值? 问题答案: 为了访问私有字段,你需要从类的声明字段中获取它们,然后使其可访问: 编辑:正如所说,访问字段,将字段设置为可访问并检索值都可能引发,尽管上面需要注释的唯一检查异常。 在NoSuchFieldException如果你问一个字段由不符合声明的字段的名称将被抛出。 该会

  • 我有一个名为Trade的实体,它可以映射到包含属性的表。这个实体也有一个字段,存储来自另一个表的值。我的贸易表包含第二个表的主键。我知道如何获得整个第二个表作为实体在我的贸易实体,但我只想要1列。 如你所见,我尝试了,但是连接是在贸易实体的主密钥上执行的。我如何使用注释从贸易表中选择外键,将其连接到第二/第三表,并直接只从col2/col3中获取值?任何建议都很感激 餐桌贸易: 表2: 表3: 现

  • 问题内容: 这个问题已经在这里有了答案 : 如何联接两个列范围在一定范围内的数据框? (5个答案) 2年前关闭。 我需要在一个标识符和一个数据帧中的日期位于另一个数据帧中的两个日期之间的条件下合并两个熊猫数据帧。 数据框A具有日期(“ fdate”)和ID(“ cusip”): 我需要将此与此数据框B合并: 在和之间和。 在SQL中,这是微不足道的,但是我看到的如何在pandas中做到这一点的唯一

  • 在我的主FXML控制器类Alpha中,我有一个掩码,它包含一个文本字段和一个按钮clear It: 如果我在“文本”字段中输入文本并点击“清除”按钮,文本将被删除。到目前为止,一切正常。 我有第二个控制器类测试版。相应的fxml文件包含菜单布局(菜单栏)。如果点击了菜单项“New”,它也应该清除alpha类中的my文本字段。 但什么也没发生。我在这里做错了什么?如何单击FXML控制器类中的按钮/菜