[英]basicAck does not remove message from broker - RabbitMQ
我在我的應用程序中執行以下操作:
從經紀人那里得到1條消息(手動確認)
做一些處理
在數據庫和代理上啟動事務
在數據庫中插入一些記錄並在代理上發布一些消息(不同的隊列)
提交數據庫和代理
您在步驟1中從經紀人處獲得的確認消息。
經紀人的所有操作都是通過單一渠道完成的。 這是准備代碼:
Connection brokerConnection = factory.newConnection();
Channel channel = brokerConnection.createChannel();
channel.basicQos(1);
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("receive-queue", false, consumer);
以下是我的代碼。 我已經刪除了try
, catch
部分以使其清楚。 我將所有例外記錄到文件中。 步驟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.