7

Ho un canale di coda e un attivatore di servizio con un polling che legge da quella coda. Mi piacerebbe avere la configurazione per dire "Voglio 50 thread per il polling di quella coda, e ogni volta che si esegue il polling e si ottiene un messaggio, su questo thread, si invoca il servizio a cui punta l'attivatore di servizio".Integrazione molla - Attivatori di servizio simultaneo

Il servizio non ha annotazioni @Async, ma è stateless e sicuro da eseguire in modo concorrente.

Il sottostante lo farà? Ci sono altri modi preferiti per raggiungere questo obiettivo?

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

risposta

8

Sì, penso che faccia quello che vuoi. Una volta introdotto un QueueChannel, l'interazione diventa asincrona: non è necessario @Async. Se non si imposta esplicitamente un polling, verrà utilizzato il polling predefinito.

Quello che hai delineato è il modo migliore per raggiungerlo. Potresti anche prendere in considerazione l'ipotesi di porre un limite alle dimensioni della coda, in modo che, nel caso in cui ci sia un ritardo nel tenere il passo con il produttore, non porti a problemi di memoria insufficiente. Se viene specificata una dimensione, le chiamate di invio sul canale verranno bloccate, agendo come un gas.

La configurazione che hai funzionerà come previsto. L'unico problema è che una volta che si inizia a creare esecutori e poller per ciascun endpoint, diventa difficile capire la configurazione ottimale per l'intera applicazione. È giusto fare questo tipo di ottimizzazione per alcuni passaggi specifici, ma non per tutti gli endpoint (nulla nelle tue domande suggerisce che tu lo stia facendo, ho solo pensato di sollevarlo comunque.

Problemi correlati