ActiveMQ PHP'nin Tetikleme

4 Cevap java

Background: Our current system involves two services (one written in Java, the other in PHP) that communicate with each other using HTTP callbacks. We would like to migrate from HTTP callbacks to a message-based architecture using ActiveMQ (or another, if necessary). We'll probably use STOMP to communicate between them. Eventually, the PHP service will be rewritten in Java, but that's not part of this project.

Question: How can the ActiveMQ system notify PHP that a new message has been posted to the queue that the PHP system is subscribed to? In the current system, the callback inherently calls into the PHP and triggers it. This goes away with a message-based architecture.

Possible solutions:

  • Cron düzenli olarak yeni iletileri denetler bir PHP komut dosyası çağırır. iğrenç.
  • Ve uyur ve yeni mesajlar için çek döngüler uzun soluklu PHP süreci. daha iğrenç?
  • Yeni bir mesaj yolladı zaman ActiveMQ bir PHP komut dosyası çağırır. iyi, nasıl?
  • ?

4 Cevap

Çıkış Camel. Bu ActiveMQ içinde veya tek başına çalıştırabilirsiniz. Camel mesajlar için "yolları" oluşturur. Bu durumda ben size olduğu gibi PHP arama URL bırakın ve kuyruktan mesajları alır ve geri URL'ye gönderilen onları Camel bir yol kurmak öneririz. Sonra ActiveMQ mesaj göndermek için PHP içinde Stomp kullanabilirsiniz. Java kodu sadece gelen ve giden iletiler için JMS kullanabilirsiniz.

Ben onlar çözmeye çalıştığınız sorun bir lamba yığını (PHP bir parçası olduğu) doğal üzerinde HTTP protokolü kuvvetler, yani (ActiveMQ denetler) bir Tüketici kuyruğu olan istek / yanıt mekanizmasına bağlı olduğunu düşünüyorum PHP ile yazılmış uygulanabilir olduğunu, ancak süreçler ömür boyu doğal HTTP protokolü herhangi bir zaman aşımı ile sınırlıdır. çözelti biridir:

1 - apache / HTTP içinde PHP abone çalıştırmayın, ve sonuç olarak daha sonra (0) bir set_time_limit yapmak, ve (yine çöküyor kadar) php Abone sonsuza kadar çalıştırmak olabilir, VEYA

2 - Abone gerçekten sadece arasında-hiçbir şey sürü ile, "periyodik" kontrolleri yapıyor ki varın, böylece yerine while (1) {do_queue_stuff (); sleep (); } Eğer, uyku kaldırmak iken döngü kaldırmak ve Cron'un veya benzeri art arda diyoruz.

Each has it's own benefits, but both is equally good, IF the cron() frequency is tuneable enough. My Cron is limited to running every minute, which isn't very often, so I'd have to do a combination of the above two: called from cron every minute:

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

Ben ne insanlar sonra olabilir orada işleme ihtiyacı kuyrukta şeyler olabilir ve sonuç olarak tüm bu kuyruk işlem başlatma / durdurma / uyku tasarruf olabilir PHP Tüketici sistemine ActiveMQ sistemini "ipucu" için bir yol olduğunu düşünüyorum / etc şeyler gerçekten yapacak bir şey aslında var olmadığını. Camel bunu yapmak için bir yol olarak görünüyor.

Eğer ActiveMQ komutlar çalıştırmak olabilir? Eğer öyleyse, sadece işlemek için yeni bir mesaj olduğunda ActiveMQ komut satırı PHP komut dosyası çalıştırmak var. Bu cron işleri çalışmasını ve uzun süren bir PHP döngüsüne sahip sizi kurtarır.

Soru: Nasıl ActiveMQ sistem yeni bir mesaj PHP sistemi abone sıraya gönderildi PHP uyarabilir? Mevcut sistemde, arama doğal PHP içine çağırır ve bunu tetikler. Bu ileti tabanlı mimarisi ile uzağa gider.

Ben yanlış yönde çalıştıklarını düşünüyorum. Tüketiciler başka bir yol etrafında, yeni mesajlar için periyodik sıra ile kontrol edin. Kuyruk, ondan okumak için tüketici bildirmek gerekiyorsa size sahip gibi düşünüyorum, o zaman gerçekten bu uygulamaları ayrışmıştır değil.