7

Bir kuyruk kanalım var ve bu sıradan okuyan bir arayana sahip bir servis aktivatörü var. "Sırayı sorgulamak için 50 iş parçacığı istiyorum, ve her sorguladığınızda bir ileti aldığınızda, bu iş parçacığı üzerinde hizmet etkinleştiricinin işaret ettiği hizmeti çağırmasını istiyorum."Yay Entegrasyonu - Eşzamanlı Hizmet Aktivatörleri

Hizmetin @Async ek açıklaması yoktur, ancak vatansız ve aynı anda çalışmak güvenlidir.

Aşağıdakiler bunu yapacak mı? Bunu başarmanın başka tercih edilen yolları var mı?

<int:channel id="titles"> 
    <int:queue/> 
</int:channel> 

<int:service-activator output-channel="resolvedIds" ref="searchService" method="searchOnTitle" input-channel="titles"> 
    <int:poller fixed-delay="100" time-unit="MILLISECONDS" task-executor="taskExecutor"></int:poller> 
</int:service-activator> 

<task:executor id="taskExecutor" pool-size="50" keep-alive="120" /> 

cevap

8

Evet, bence istediğini yapıyor. Bir QueueChannel'i ekledikten sonra etkileşim uyumsuz hale gelir - @Async'e ihtiyacınız yoktur. Eğer bir poleni açık bir şekilde ayarlamazsanız, varsayılan poleni kullanacaktır.

Çizelgeleriniz, bunu başarmanın en iyi yoludur. Ayrıca, kuyruk boyutuna bir sınır koymayı da düşünebilirsiniz - böylece, üreticiye ayak uydurma durumunda, bellek sorununa yol açmaz. Bir boyut belirtilirse, kanaldaki gönderim çağrıları bloke olur - bir gaz kelebeği görevi görür.

Yapacağınız yapılandırma beklediğiniz gibi çalışacaktır. Tek sorun, her bir son nokta için yürütücüler ve poller oluşturmaya başladığınızda, tüm uygulama için en uygun yapılandırmayı bulmak zor oluyor. Birkaç belirli adım için bu tür bir optimizasyon yapmak iyi bir şeydir - ancak tüm uç noktalar için değil (sorularınızda hiçbir şey bunu yaptığınızı önermez, sadece onu yükselteceğimi düşünürdüm.)