代码之家  ›  专栏  ›  技术社区  ›  Edward Dale

从activemq触发php

  •  6
  • Edward Dale  · 技术社区  · 14 年前

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

    问题: ActiveMQ系统如何通知PHP新消息已发布到PHP系统订阅的队列中?在当前系统中,回调会固有地调用PHP并触发它。这与基于消息的体系结构不同。

    可能的解决方案:

    • cron定期调用检查新消息的PHP脚本。讨厌。
    • 一个长期运行的PHP进程,循环、休眠并检查新消息。少一点?
    • 当发布新消息时,ActiveMQ会调用一个PHP脚本。好,怎么样?
    • ??
    4 回复  |  直到 14 年前
        1
  •  4
  •   Glenn Moss    14 年前

    退房 Camel . 它可以在ActiveMQ中运行,也可以单独运行。骆驼为信息创建“路线”。在这种情况下,我建议您保持php回调URL的原样,并在camel中设置一个路由,从队列中获取消息并将其发送到回调URL。然后可以在PHP中使用stomp将消息发送到activemq。您的Java代码可以只使用JMS来处理传入和传出的消息。

        2
  •  0
  •   Jarrod Nettles    14 年前

    你能让activemq执行shell命令吗?如果是这样,只要让activemq在有新消息要处理时通过命令行执行php脚本。这样可以避免运行cron作业和长时间运行php循环。

        3
  •  0
  •   matt b    14 年前

    问题:ActiveMQ系统如何通知PHP,新消息已发布到PHP系统订阅的队列中?在当前系统中,回调会固有地调用PHP并触发它。这与基于消息的体系结构不同。

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

        4
  •  0
  •   Buzz    14 年前

    我认为他们试图解决的问题是,一个灯栈(其中php是其一部分)固有地与HTTP协议强制的请求/响应机制联系在一起,因此让一个使用者(它检查用php编写的activemq)队列是可行的,但进程的生存期自然会受到http协议中任何超时的限制。OL。解决方案是:

    1-不要在apache/http中运行php订户,这样就可以设置时间限制(0),让php订户永远运行(直到崩溃为止),或者

    2-意识到订阅者确实只是做“定期”检查,其间没有很多东西,因此,您可以删除睡眠,删除while循环,并从cron或类似对象中重复调用它,而不是while(1)do queue stuff();sleep();。

    每个都有它自己的好处,但是如果cron()频率足够可调的话,两者都是一样好的。我的cron只能每分钟运行一次,这并不常见,因此我必须结合以上两种方法: 每分钟从cron调用:

    时间=分钟是多少? while(什么分钟是时间){ do_queue_stufacture(); 睡眠(1); }

    我认为人们可能追求的是一种向PHP用户系统提供ActiveMQ系统“提示”的方法,即队列中可能有需要处理的内容,因此,如果实际上没有真正要做的事情,请保存所有这些队列处理的开始/停止/睡眠等内容。骆驼似乎是这样做的方法。