java – basicAck不会从代理中删除消息 – RabbitMQ
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – basicAck不会从代理中删除消息 – RabbitMQ,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2139字,纯文字阅读大概需要4分钟。
内容图文
![java – basicAck不会从代理中删除消息 – RabbitMQ](/upload/InfoBanner/zyjiaocheng/732/796faec7b95e486b9cedc4b875d5d621.jpg)
我在我的应用程序中执行以下操作:
>从经纪人处获得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之前.
内容总结
以上是互联网集市为您收集整理的java – basicAck不会从代理中删除消息 – RabbitMQ全部内容,希望文章能够帮你解决java – basicAck不会从代理中删除消息 – RabbitMQ所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。