6

背景: 我们当前的系统涉及两个使用 HTTP 回调相互通信的服务(一个用 Java 编写,另一个用 PHP 编写)。我们希望从 HTTP 回调迁移到使用 ActiveMQ(或其他,如有必要)的基于消息的架构。我们可能会使用STOMP在它们之间进行通信。最终,PHP 服务将用 Java 重写,但这不是这个项目的一部分。

问题: ActiveMQ 系统如何通知 PHP 一条新消息已发布到 PHP 系统订阅的队列中?在当前系统中,回调固有地调用 PHP 并触发它。这随着基于消息的架构而消失。

可能的解决方案:

  • Cron 定期调用一个 PHP 脚本来检查新消息。呸。
  • 一个长时间运行的 PHP 进程,它循环和休眠并检查新消息。少恶心?
  • ActiveMQ 在发布新消息时调用 PHP 脚本。好,怎么样?
  • ??
4

4 回答 4

4

看看骆驼。它可以在 ActiveMQ 中运行,也可以单独运行。Camel 为消息创建“路由”。在这种情况下,我建议您保持 PHP 回调 URL 不变,并在 Camel 中设置一个路由,从队列中获取消息并将它们发布到回调 URL。然后您可以在 PHP 中使用 Stomp 将消息发送到 ActiveMQ。您的 Java 代码可以将 JMS 用于传入和传出消息。

于 2010-05-28T19:42:29.417 回答
0

你可以让 ActiveMQ 执行 shell 命令吗?如果是这样,只要有新消息要处理,就让 ActiveMQ 通过命令行执行 PHP 脚本。这使您免于运行 cron 作业和长时间运行的 PHP 循环。

于 2010-05-27T16:42:37.157 回答
0

问题:ActiveMQ 系统如何通知 PHP 一条新消息已发布到 PHP 系统订阅的队列中?在当前系统中,回调固有地调用 PHP 并触发它。这随着基于消息的架构而消失。

我认为你的工作方向是错误的。消费者定期检查队列是否有新消息,而不是相反。如果队列需要通知消费者从中读取,那么您并没有像您认为的那样真正解耦这些应用程序。

于 2010-05-27T17:03:05.197 回答
0

我认为他们试图解决的问题是 LAMP 堆栈(PHP 是其中的一部分)本质上与 HTTP 协议强制对其施加的请求/响应机制相关联,因此有一个消费者(检查 ActiveMQ)队列用 PHP 编写是可行的,但进程的生命周期自然会受到 HTTP 协议中任何超时的限制。解决方案是以下之一:

1 - 不要在 apache/HTTP 中运行 PHP 订阅者,因此您可以执行 set_time_limit(0),并让 php 订阅者永远运行(直到它崩溃为止),或者

2 - 意识到订阅者确实只是做“定期”检查,中间没有很多东西,所以而不是 while(1){ do_queue_stuff(); 睡觉(); } 你删除睡眠,删除 while 循环,并从 Cron 或类似的重复调用它。

每个都有自己的好处,但两者都同样好,如果 cron() 频率足够可调。我的 Cron 仅限于每分钟运行一次,这并不经常,所以我必须将上述两者结合起来:每分钟从 cron 调用:

时间 = what_minute_is_it(); 而(what_minute_is_it()==时间){do_queue_stuff();睡眠(1);}

我认为人们可能追求的是一种让 ActiveMQ 系统向 PHP Consumer 系统“提示”队列中可能有需要处理的东西的方法,并因此保存所有这些队列处理启动/停止/睡眠/etc 的东西,如果实际上没有什么可做的。骆驼似乎是做到这一点的方法。

于 2010-07-07T07:46:53.987 回答