Java 从ActiveMQ触发PHP

Java 从ActiveMQ触发PHP,java,php,message-queue,activemq,stomp,Java,Php,Message Queue,Activemq,Stomp,背景: 我们当前的系统涉及两个服务(一个用Java编写,另一个用PHP编写),它们使用HTTP回调相互通信。我们希望使用ActiveMQ(或其他,如果需要)将HTTP回调迁移到基于消息的体系结构。我们可能会用它来沟通。最终,PHP服务将用Java重写,但这不是本项目的一部分 问题: ActiveMQ系统如何通知PHP新消息已发布到PHP系统订阅的队列?在当前系统中,回调内在地调用PHP并触发它。这与基于消息的体系结构无关 可能的解决方案: Cron定期调用一个PHP脚本来检查新消息。恶心 一个

背景: 我们当前的系统涉及两个服务(一个用Java编写,另一个用PHP编写),它们使用HTTP回调相互通信。我们希望使用ActiveMQ(或其他,如果需要)将HTTP回调迁移到基于消息的体系结构。我们可能会用它来沟通。最终,PHP服务将用Java重写,但这不是本项目的一部分

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

可能的解决方案:

  • Cron定期调用一个PHP脚本来检查新消息。恶心
  • 一个长期运行的PHP进程,循环、休眠并检查新消息。不那么恶心
  • 当发布新消息时,ActiveMQ调用PHP脚本。好的,怎么样
  • ?

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

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


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

请检查。它可以在ActiveMQ中运行,也可以自己运行。Camel为消息创建“路由”。在本例中,我建议您保持PHP回调URL不变,并在Camel中设置一个路由,从队列中获取消息并将其发布到回调URL。然后可以在PHP中使用Stomp将消息发送到ActiveMQ。Java代码可以使用JMS处理传入和传出消息。

我认为他们试图解决的问题是,LAMP堆栈(PHP是其中的一部分)固有地绑定到HTTP协议强制执行的请求/响应机制中,因此使用PHP编写消费者(检查ActiveMQ)队列是可行的,但是进程的生存期自然受到HTTP协议中任何超时的限制。解决方案是:

1-不要在apache/HTTP内部运行PHP订阅服务器,因此您可以设置时间限制(0),让PHP订阅服务器永远运行(直到崩溃为止),或者

2-意识到订阅者实际上只是做“定期”检查,其间没有任何东西,因此,与其在while(1){do_queue_stuff();sleep()}中删除睡眠,删除while循环,然后从Cron或类似的工具中重复调用它,不如在while(1){do_queue_stuff();sleep()}中删除睡眠

每种方法都有各自的优点,但如果cron()频率足够可调,这两种方法都同样好。我的Cron仅限于每分钟运行一次,这并不常见,因此我必须将上述两种方法结合起来: 每分钟从cron调用一次:

时间=它是多少分钟; while(what_minute_it()=时间){ 不要排队买东西; 睡眠(1); }


我认为人们想要的是一种方法,让ActiveMQ系统“提示”PHP用户系统队列中可能有需要处理的东西,因此,如果实际上没有什么事情要做,那么就节省所有这些队列处理的开始/停止/睡眠/等东西。骆驼似乎是实现这一点的方法。

不久前,我不得不做同样的事情。我们运行了一个滚动锁PHP脚本(通过CRON触发),该脚本与PHP应用程序进行本地对话,并通过STOMP与AMQ进行对话。滚动锁允许我们重叠运行过程,以获得一个良好的安全网,而不会出现重复。祝你好运!谢谢你的主意。你能澄清你所说的“滚动锁”是什么意思吗?我知道这个词的基本意思,但是我在任何地方都找不到这个词的引用?很抱歉。我也不知道这个词是从哪里来的。我们在引用锁定的PHP CRON进程时使用它,因为它们不是作为守护进程运行的,每次连续执行都会在释放锁时滚动到最后一次。下面是一个使用flock()完成的示例执行()。谢谢,我将对此进行研究。对后人来说,正确的联系是骆驼似乎是一条必经之路。谢谢你的建议。