2009-04-03 27 views
5

Windows'da bir Java hizmeti için birden fazla iş parçacığı için birden fazla iş parçacığı için işlem yapmayı senkronize etmem gereken bir sorunum var.Java: konuları birden çok sunucu arasında eşitleme

Bu uygulamada, aynı JMS kuyruğundan çok sayıda tüketici ileti dizisi iletileri alıyorum. Mesajlar 3 veya 4 kişilik gruplar halinde gelir ve her gruptaki mesajların tamamen seri olarak işlendiğinden emin olmam gerekir. Thread1'in bir ileti çekip çekmediğinden emin olmak için bir tür senkronizasyon mekanizmasına ihtiyacım var, daha sonra thread2 o gruptan bir sonraki mesajı alır, thread2 işlenmesini bitirmeden önce işlenmeyi bitirmek için thread1 için bekler.

İletiler için dağıtılmış eşleme mekanizmalarıyla ilgili herhangi bir öneriniz var mı? Herhangi bir çözüm türü iyi olurdu (JMS çözümleri, dağıtılmış önbellekleme, vb.)

Not: Kullandığımız JMS sağlayıcısı ActiveMQ'dur.

cevap

7

ActiveMQ, tam olarak gereksinim duyduğunuz tam anlamıyla olması gereken message groups desteğine sahiptir.

+0

O kısaca baktım Dağıtılmış Açık Kaynak. Sürekli yeni gruplar oluşturuyorsanız mesaj gruplarında ne olduğunu biliyor musunuz? İç karma sürekli büyür mü? Bir grubu "silmek" veya "sona erdirmek" için bir yol var mı, böylece grup sadece sonsuza dek bellekte oturmuyor mu? Cevap için teşekkürler, btw. –

+0

Mesaj gruplarını kapatabilirsiniz (bağlandığım sayfada ayrıntılı olarak açıklanmıştır). Yine de yeni gruplar yaratmanın yükü konusunda emin değilim - muhtemelen bunun doğrudan kaynaktan nasıl yapıldığını kontrol etmek gerekiyor. – andri

1

İleti başlıklarında grup kimliği gibi bir şey var mı? Öyleyse, bir müşteri grubu sırayla işlemek için bir Selector oluşturabilir.

Belirli bir tüketiciye bir grubun atanması, grup tanımlayıcısını kuşatarak yapılabilir veya Paxos veya sanal senkronizasyon gibi bazı fikir birliği protokolü (ayrı bir sıraya gönderilen iletilerle) kullanarak birbirleriyle etkin bir şekilde koordine edilebilirler. .

+0

Her grupta, hepsini gruplandırmak için kullanılabilecek bir "grup kimliği" alanı vardır. Ancak, bu grup kimliği harici bir partiden geliyor, böylece tüketiciler ilk mesajı alana kadar kimliği bilmiyorlar. –

+0

Size herhangi bir yararlı bilgi verdiğinden emin değil. Ben bir ara JMS kullanıcısıyım, bu yüzden henüz selektörler ile çalışmadım. –

7

Hazelcast dağıtılmış kilitleri kullanmayı düşünebilirsiniz. Süper lite, kolay ve açık kaynak.

java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor"); 
lock.lock(); 
try { 
// do your stuff 
}finally { 
    lock.unlock(); 
} 

Selamlar,

Hazelcast

-talip

- Kuyruk, Harita, Set, Liste, Kilit

İlgili konular