7

Mam kanał kolejki i aktywator usług z pollerem, który czyta z tej kolejki. Chciałbym, aby konfiguracja mówiła "Chcę, aby 50 wątków sondowało tę kolejkę, a za każdym razem, gdy odpytujesz i otrzymasz wiadomość, w tym wątku wywołaj usługę, na którą wskazuje punkt aktywacji usługi."Wiosenna integracja - Współbieżne aktywatory usług

Usługa nie ma adnotacji @Async, ale jest bezpaństwowa i bezpieczna w prowadzeniu w trybie równoczesnym.

Czy poniżej to zrobi? Czy istnieją inne preferowane sposoby osiągnięcia tego?

<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" /> 

Odpowiedz

8

Tak, myślę, że robi to, co chcesz. Po wprowadzeniu QueueChannel interakcja staje się asynchroniczna - nie potrzebujesz @ Synchronizacji. Jeśli nie ustawisz jawnie pollera, użyje on domyślnego pollera.

To, co nakreśliłeś, to najlepszy sposób, aby to osiągnąć. Możesz również rozważyć wprowadzenie limitu rozmiaru kolejki - tak, aby w przypadku opóźnienia w dotrzymywaniu kroku producentowi nie doprowadziło to do problemów z pamięcią. Jeśli określony jest rozmiar, wówczas wywołania wysyłane na kanale zostaną zablokowane - działając jako przepustnica.

Konfiguracja, którą posiadasz będzie działać zgodnie z oczekiwaniami. Jedynym problemem jest to, że po rozpoczęciu tworzenia executorów i pollerów dla każdego punktu końcowego trudno jest znaleźć optymalną konfigurację dla całej aplikacji. Optymalizacja tego rodzaju optymalizacji jest możliwa w przypadku kilku określonych kroków - ale nie dla wszystkich punktów końcowych (nic w tobie nie sugeruje, że to robisz, ale myślałem, że i tak to zrobię.