我有几个PHP RPC类型的消费者(经纪人),这些消费者是永久附加到RMQ以进行事件消费的。
一个经纪人在远程系统上 - 但是,出于开发/测试目的,我正在运行"远程"经纪人在当地。
面向应用的经纪人,其中一个(经纪人Au)处理请求并在处理过程中,通过包含的类创建到远程经纪人的新AMQP连接,将请求发布到远程经纪人(经纪人) VU)。
Broker Vu使用该请求,将返回有效负载发布回代理Au - 并调用basic_ack()方法。
Broker Au从Broker Vu解包返回有效负载并将其有效负载返回给PHP客户端,该客户端正确显示结果。
回顾一下:
testProgram - >实例化testClass1,它打印出回调队列名称:( ex:amq.gen-6_EhL_eb3HcLiiOb-TUNRA ),向经纪人Au发布请求
经纪人Au - >实例化class2,它打印出回调队列名称:( ex:amq.gen-J0jhxeMAf1XZSbHZJ8NZ3g ),向经纪人Vu发布请求
经纪人Vu - >做东西(成功),将有效负载返回给经纪人Au,调用basic_ack()
经纪人Au - >解码返回有效负载并为testProgram生成自己的返回有效负载并调用basic_ack()。
testProgram - >显示结果和结束
我在RMQ管理控制台的“队列”标签中看到的是:
我所有连接的经纪人(AD = true) 和 ( amq.gen-J0jhxeMAf1XZSbHZJ8NZ3g )显示就绪:0,未包装:1,总计:1
对于我提交的请求数量,生成的回调队列会相应增加。
在经纪人Vu中,我有一个ping事件处理程序 - 它只是说"是的 - 我在这里"并返回true。此事件还会生成孤立的生成的回调队列孤立。
我已经在经纪人中注册了所有关机方法 - 如果我尝试在连接客户端中明确关闭通道/连接(在$ channel-> wait()之后),它会在第一个工作时间并在第二次执行时崩溃代理。
如果我运行直接连接到代理Vu的测试程序并提交相同的事件请求,则不会孤立amqp生成的队列。这肯定是因为代理经纪人发布/消费过程而发生的事情。
感谢您坚持......任何帮助表示赞赏!
- 麦克
答案 0 :(得分:0)
在Broker Vu中实例化的客户端类中,我在wait()之后和返回有效负载之前添加了显式通道close()调用。
这可以清除amqp生成的队列。
添加显式连接关闭会导致代理在第二次迭代时崩溃(尽管所有已发布的示例都显示)所以我只是将其留下来让这件事情做到了......