2012-12-18 13 views
5

Şu anda uygulama sunucusu benzeri bir çerçeveye JMS desteği ekliyorum. JMS, HornetQ tarafından uygulanacaktır (tek başına broker, sunucu sınıfındaki hornetk kavanozları) ancak JBoss, ne bahar ne de MDB'leri sağlayacak başka bir şey yoktur. Bir sonraki adım, gelen mesajların paralel işlemesine izin verecek bir xa kuyruğuna bir mesaj dinleyicisi eklemek olacaktır. Bazı mesajlar uzun süren görevleri başlatabilir, bu nedenle temel fikir, çalışan iş parçacığı onMessage yönteminden kaynaklamaktır.JMS sıraları üzerinde çok iş parçacıklı ileti işleme için en iyi uygulama

Bunu yapacağını ama görev için ekstra iç kuyruğu kullanmak olmaz, katılımcılardan birinin sözü this discussion, rastladı internet aracılığıyla benim uzun yolculukta

: (tek dişli) mesajı dinleyici sonra basitçe kapmak istiyorum gelen sıradaki iletileri ve bir iç sıra için yeni ileti oluşturmak, bu iç sıranın diğer ucunda bazı çalışan iş parçacıklarının gelen iletiler için savaşır. Gelen iletiler daha sonra iç sıraya "kopyalandıklarında" (ki benim için sorun değil) onaylanacaktır. havuzdan bütün konuları meşgul olup olmadığını dinleyici engel olacağını, çünkü belki -

Ne yazık ki onlar neden o onMessage yönteminden işçi konuları yumurtlamaya değil daha iyi olurdu söyleme. "işçi iş parçacığı mesaj göndermek" için mesaj dinleyici

  • kullanın dahili kuyruk ait onMessage yönteminden

    • Başlangıç ​​çalışan iş parçacığı: Ben tasarımlar kararlar için lehte ve aleyhte arıyorum
  • cevap

    3

    İşlem limitleri bir yana, birden fazla iş parçacığı (veya işlemler) bir sıradan okunup okunmasın, yalnızca ileti sırasının önemli olup olmadığı belirlenir. Açıkça, eğer sipariş önemliyse, o zaman tek bir iplik, bu sırayı doğal olarak korurken, çoklu dişler böyle bir garanti vermez.

    Normalde bulacağınız şey, bu sıralamanın önemli olduğudur, ancak tüm iletilerin bir alt kümesidir. Bu senaryoda, tek bir iş parçacığının performans göstermemesi durumunda, söz konusu iletileri kuyruğa almanız ve siparişi kısa bir süre içinde yeniden sıraya almanız gerekir. Bu nedenle, siparişi korumak için, başlangıçta tek bir iş parçacığı okuması kullanmanız gerekir. sıra - dolayısıyla bir veya daha fazla iç sıra kullanılması. Bu sorun, mesajlar tamamen işlenmeden önce işlemin kapatılacağı ve işlemin gerçekleşmesinden önce işlemin düşmesi durumunda mesajların düşmemesi için bir tür geçici depolama alanına ihtiyaç duymanızdır.

    Sorunuz düşünüldüğünde, iletileri bırakma konusunda çok endişelenmiyorsanız, java.util.concurrent.BlockingQueue, her biri için tek bir iş parçacığına sahip iç sıralar için ihtiyacınız olan şeylere benziyor.

    İlgili konular