2011-05-18 15 views
5

Şu anda yabancı bir web hizmetinden yanıtın durumunu inceleyecek ve yanıt nesnesinin durumuna göre uyarılar gönderecek bir dizi uyarı üzerinde çalışıyorum (örnek zaman aşımları, geçersiz veri vb. Yanıt değerlendirilirken ve uyarılar gönderilirken ana iş parçasının çalışmaya devam etmesini istiyorum.Bir ileti sıra kullanarak bir arka plan iş parçacığı kullanmak

bana müsait iki acil seçenek vardır:

  1. Kullanım ActiveMQ'yu ve işlenmek üzere kuyruğa bir objectMessage olarak nesneyi göndermek.
  2. Bir komut deseni kullanın ve uyarıyı işleyen bir eşzamansız komut iş parçacığı.

Her ikisi de benim için oldukça iyi seçenekler gibi görünüyorlar ancak bir ileti sırasının özelliklerinin çoğuna gereksinim duymadığımdan, iş parçacığı komutuna doğru yaslıyorum.

Soru: Hangisini kullanacağınıza ve neden karar verdiniz?

cevap

6

İki kelime:

Garantili Teslimat.

Bu sizin için önemliyse, istediğiniz zaman bir ileti sırasıdır.

+0

doğrudur. Yeniden başlatmalar ve diğer sunucu olaylarında güvenilirliği artıracak kalıcı bir kuyruk kullanabilirim. –

1

Zaten ne düşündüğünüzü temel alarak karar verdim ... ... tam bir mesaj kuyruğu, çok güçlü olsa da, ihtiyacın olandan çok daha büyük. Başka bir süreç/sunucu/etc bahsetmiyorum. Yani, ikinci seçenek için oy kullanırdım. :-)

+0

evet, ben de bu şekilde eğiyorum. Activemq'in bu uygulamada zaten bir sürü şey yaptığını ve webapp ile jvm'de çalıştığını belirtmeliyim. –

2

Uygulamanızdaki olayları işlemek için bir şeyler oluşturuyormuşsunuz gibi geliyor. Bunun için java.util.concurrent paketinde çok fazla seçeneğiniz var. Bir mesaj kuyruğu, teslimatı garantilemek (kalıcılık) ve mesajların birden fazla sunucuya izin vermesi için iyidir.

util.concurrent'ın ExecutorService iş parçacığı havuzu üzerinde yürütülecek bir görev göndermenizi sağlar. İadesi geleceği, daha sonra işlemeye devam etmenizi ve sonuçları kontrol etmenizi sağlar. bu değil tam olarak neye ihtiyacınız olursa

Future<?> submit(Runnable task) 

, muhtemelen java.util.concurrent içindeki diğer seçenekler vardır.

+0

Bu iyi bir nokta - bu, küme genelinde gerekliyse bir ileti sırası daha mantıklı olabilir, ancak bu durumda her sunucu, komutların sunucu başına işlenebileceği yanıtların yalnızca bir kısmını işlediğinden dolayı olabilir. Diğer yandan, kalıcı sıra güvenilirliği artıracaktır ... –

+0

@Dave Doğru, güvenilirliği artıracaktır. Bu bir zorunluluk mu? Kilitlenmeleri uyguladığınızda etkinliklerin kaybolması önemli midir? Önemli olan uygulama türüne bağlıdır. –

+0

Bu durumda% 100 güvenilirlik bir gereklilik değildir, ancak güvenilir bir uyarı beklemek için hiçbir şeye zarar vermez ve henüz kodu yazmaya başlamamışımdır. Birinin kaynak maliyeti konusundaki deneyiminizden herhangi bir genel anlamı var mı? diğerine karşı? –