Java:

2011-05-29 15 views
6

G'day herkesi de-dupes bir zaman gecikmeli kuyruğuJava:

Ben bir sistem (kaynak) olan belirli nesneler değiştirmek uyumsuz zaman başka sistem (hedef) bildirmek gerekiyor. Büküm, kaynak sistemin kısa bir aralıkta birçok kez tek bir nesneyi mutasyona uğrattığıdır (güncellemeler çok "burst" dır) ve bu durumda hedef sistemi sadece bir kez bildirmek ve son halini vermek için ideal olacaktır. nesne.

Düşüncem, bunun için bir ThreadPoolExecutor öğesinin önünde bir tür zaman gecikmeli, de-duping kuyruğu kullanmaktı. Bu kuyruk olurdu:

  1. bir zaman minimum tutar için sıraya öğeleri tutmak varolan nesneyi değiştirmek

  2. (ideal mutasyonların tipik patlaması süresinden uzun sadece azlclk olacak şekilde yapılandırılmış) Bir kopyanın (nesnenin tanımlayıcısı tarafından tanımlandığı gibi) kaydedilmesi durumunda. Bununla birlikte, eşya, kuyruktaki orijinal yerini muhafaza etmelidir (herhangi bir parçanın sürekli olarak sıranın arkasına çarpmasını önlemek için), bir noktada, başka bir noktadan anlık olarak gelecek olsa bile, bildirimi göndermemiz gerekir.

Tam olarak java.util'de böyle bir şey görmedim ve bu alandaki google-fu'm özellikle zayıf görünüyor.

Bunu daha önce uygulamış bir kişi var mı, bu şekilde davranan bir BlockingQueue uygulamasını mı biliyorsunuz, yoksa bir uygulamayla ilgili nasıl gidebileceğime dair ipuçlarınız var mı?

Şimdiden teşekkürler!

Peter

PS

PS. ESB'lerin böyle bir şey yaptıklarını biliyorum, ancak bu durum çok ağır bir yaklaşım. Bu durumda, ideal olarak kaynak sisteme yeni kütüphane bağımlılıkları eklemek istemiyorum.

cevap

4

En iyi seçeneğiniz, ArrayBlockingQueue'u uzatmak ve zaman gecikmesi işlevini eklemek için offer ve poll'u geçersiz kılmaktır. Özellikle ArrayBlockingQueue, çünkü bir contains yöntemine sahiptir.

Başka bir fikir offer'u geçersiz kılmak için eski öğeyi kaldırmak ve yeniyi yerleştirmek, ancak büyük ölçüde siparişi koruyacak eski zaman gecikmesini korumaktır. Ardından, sıra öğelerinizi Delayed arabiriminde sarmanız gerekir.

+0

Doğruluk teşekkürler. Sadece 'BlockingQueue' uygulamasının doğrudan uygulanması, ancak 'teklif' ve 'anket' yöntemlerinde ekstra bir mantıkla bir dahili 'ArrayBlockingQueue' örneğine delege edilmesiyle ilgili herhangi bir düşünce var mı? Her zaman temel JDK sınıflarını genişletme konusunda biraz tereddüt ediyorum - bunların çoğu gerçekten akılda tutularak tasarlanmamıştı (özellikle java.util.concurrent, içinde bulunduğum sınırlı aramalardan). – Peter

+0

Eh uzanan ve bu durumda + iç uygulanması arasındaki fark kuyruk nesnesi olarak 'myBlockingQueue'' kullanarak this'/'super' arasındaki fark olacaktır, bu nedenle IMO tat meselesi. – trutheality

+0

Şimdi düşünüyorum da, 'DelayQueue' fikri daha kolay olabilir. Ben zorlu kısmı onlar bir 'ArrayBlockingQueue' kullanırsanız, muhtemelen' iterator' ile de gireceğim ya 'bir gibi bir şey tutarak ya yer alacağı, kuyruğa yaparken sıranın elemanlarını güncellenmesi olacak düşünüyorum nesnelere kolay erişim için referansların ArrayList'. Ile 'sadece' Çıkar', maç sona erme zamanı ve 'offer' var DelayQueue'. – trutheality

0

Sistemi yalnızca bir değişiklik meydana geldiğini ve diğer sistemin yeni durumu almasını sağlayabilirsiniz. Ardından, devlet getirilene kadar daha fazla değişiklik bildirmeyin.

+0

Yazılım Maymununa teşekkürler, ama bence asıl problemi daha büyük olana dönüştürüyor - yani milyonlarca nesnenin bireysel "geri kazanma durumlarını" takip etmesi gerekiyor. – Peter