0

我有几个 PHP RPC 类型的消费者(代理)永久附加到 RMQ 以进行事件消费。

一个代理位于远程系统上 - 但是,出于开发/测试目的,我在本地运行“远程”代理。

有面向应用程序的代理,其中之一(代理 Au)处理请求,在处理期间,通过包含的类创建到远程代理的新 AMQP 连接,将请求发布到远程代理(代理 Vu)。

代理 Vu 使用请求,将返回的有效负载发布回代理 Au - 并调用 basic_ack() 方法。

Broker Au 从 Broker Vu 解包返回的有效负载,并将其有效负载返回给正确显示结果的 PHP 客户端。

回顾:

testProgram --> 实例化 testClass1,它打印出回调队列名称:(例如:amq.gen-6_EhL_eb3HcLiiOb-TUNRA),向代理 Au 发布请求

代理 Au --> 实例化 class2,打印出回调队列名称:(例如: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 生成的队列。这绝对是由于代理上代理发布/消费过程而发生的事情。

感谢您坚持...任何帮助表示赞赏!

- 麦克风

4

1 回答 1

0

在代理 Vu 中实例化的客户端类中,我在 wait() 之后和返回有效负载之前添加了一个显式通道 close() 调用。

这会清理 amqp 生成的队列。

添加显式连接关闭会导致代理在第二次迭代时崩溃(尽管所有已发布的示例都显示)所以我将把它排除在外,让这件事做这件事......

于 2015-07-14T23:27:28.540 回答