簡體   English   中英

basicAck不會從代理中刪除消息 - RabbitMQ

[英]basicAck does not remove message from broker - RabbitMQ

我在我的應用程序中執行以下操作:

  1. 從經紀人那里得到1條消息(手動確認)

  2. 做一些處理

  3. 在數據庫和代理上啟動事務

  4. 在數據庫中插入一些記錄並在代理上發布一些消息(不同的隊列)

  5. 提交數據庫和代理

  6. 您在步驟1中從經紀人處獲得的確認消息。

經紀人的所有操作都是通過單一渠道完成的。 這是准備代碼:

Connection brokerConnection = factory.newConnection();              
Channel channel = brokerConnection.createChannel();
channel.basicQos(1);
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("receive-queue", false, consumer);

以下是我的代碼。 我已經刪除了trycatch部分以使其清楚。 我將所有例外記錄到文件中。 步驟1:

QueueingConsumer.Delivery delivery = consumer.nextDelivery();
Request request = (Request) SerializationUtils.deserialize(delivery.getBody());

第2,3,4,5步:

dbConnection.setAutoCommit(false);
channel.txSelect();

stmt = dbConnection.prepareStatement(query);
/* set paramteres */
stmt.executeUpdate();
channel.basicPublish(/* exchange name */, "KEY", MessageProperties.PERSISTENT_BASIC, /* result */ result);

dbConnection.commit();
channel.txCommit();
dbConnection.setAutoCommit(true);

第6步:

channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

在一次迭代之后,我可以在數據庫和代理中看到記錄(意味着它在第5步之前正常工作)。 問題是在步驟6之后未刪除接收隊列上的消息,並且管理插件顯示一條未確認的消息。 此外,我在日志文件中看不到任何異常。 有人可以幫忙嗎?

[UPDATE1]

現在我創建一個用於發布的頻道和另一個用於接收的頻道。 現在正在運作。 那么如何使用單一渠道進行接收和發布(使用交易)? 我之前使用過單個頻道進行接收和發布,但沒有交易。

[UPDATE2]

我在事務中移動了第6步,它現在正在運行。

dbConnection.setAutoCommit(false);
channel.txSelect();

stmt = dbConnection.prepareStatement(query);
/* set paramteres */
stmt.executeUpdate();
channel.basicPublish(/* exchange name */, "KEY", MessageProperties.PERSISTENT_BASIC, /* result */ result);

channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); 

dbConnection.commit();
channel.txCommit();
dbConnection.setAutoCommit(true);

我有點困惑。 我只是希望發布部分在內部事務中。

您已將頻道置於事務模式 - 而ack是事務性事物。 所以你需要在一個單獨的非交易渠道上消費和確認,或者只是接受你的ack需要在tx.commit之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM