6

背景: 現在のシステムには、HTTPコールバックを使用して相互に通信する2つのサービス(1つはJavaで記述され、もう1つはPHPで記述されている)が含まれています。ActiveMQ(または必要に応じて別のアーキテクチャ)を使用して、HTTPコールバックからメッセージベースのアーキテクチャに移行したいと考えています。おそらくSTOMPを使用してそれらの間で通信します。最終的に、PHPサービスはJavaで書き直されますが、それはこのプロジェクトの一部ではありません。

質問: ActiveMQシステムは、PHPシステムがサブスクライブしているキューに新しいメッセージが投稿されたことをPHPに通知するにはどうすればよいですか?現在のシステムでは、コールバックは本質的にPHPを呼び出し、それをトリガーします。これは、メッセージベースのアーキテクチャでなくなります。

可能な解決策:

  • Cronは、新しいメッセージをチェックするPHPスクリプトを定期的に呼び出します。うん。
  • ループしてスリープし、新しいメッセージをチェックする、長時間実行されるPHPプロセス。やっかい?
  • ActiveMQは、新しいメッセージが投稿されたときにPHPスクリプトを呼び出します。いい、どうやって?
  • ??
4

4 に答える 4

4

キャメルをチェックしてください。ActiveMQ内で実行することも、単独で実行することもできます。Camelはメッセージの「ルート」を作成します。この場合、PHPコールバックURLをそのままにして、キューからメッセージを取得してコールバックURLに送信するルートをCamelに設定することをお勧めします。次に、PHP内でStompを使用して、ActiveMQにメッセージを送信できます。Javaコードは、着信メッセージと発信メッセージの両方にJMSを使用できます。

于 2010-05-28T19:42:29.417 に答える
0

ActiveMQにシェルコマンドを実行させることはできますか?その場合は、処理する新しいメッセージがあるときはいつでも、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は毎分実行するように制限されていますが、これはあまり頻繁ではないため、上記の2つの組み合わせを実行する必要があります。毎分cronから呼び出されます。

時間=what_minute_is_it(); while(what_minute_is_it()== time){do_queue_stuff(); sleep(1); }

人々が求めているのは、ActiveMQシステムがPHPコンシューマーシステムに「ヒント」を与えて、キューに処理が必要なものがある可能性があることを示し、その結果、このキュー処理の開始/停止/スリープをすべて節約できることだと思います。 / etcは、実際に何もすることがない場合に使用します。キャメルはこれを行う方法のようです。

于 2010-07-07T07:46:53.987 に答える