Альтернатива изданию Inner Loop Queue - PullRequest
1 голос
/ 19 июня 2019

Я хочу опубликовать данные в очереди асинхронным способом, используя шаблон camelContext.

Полный контекст:

<camelContext id="xContext" xmlns="http://camel.apache.org/schema/blueprint">
    <route id="notifPublisher">
        <from id="notifService" uri="cxfrs:bean:xRequestService"/>
        <inOnly id="toRequestQueue" uri="activemq:queue:{{data.queue}}?jmsMessageType=Text"/>
        <setHeader headerName="Content-Type" id="setContentType"/>
    </route>
    <route id="xReceiver">
        <from id="dataqueue" uri="activemq:queue:{{data.queue}}?jmsMessageType=Text"/>
        <log id="logDataQueue_" message="Data/DatAs ${body}"/>
        <bean id="fetchUsers" method="fetchUsers" ref="dataProcessor"/>
        <bean id="checkDataInList" method="checkDataInList" ref="dataProcessor"/>
        <loop doWhile="true" id="_loop1">
            <simple>${header.mailMap} != 'EMPTY'</simple>
            <bean id="sendInQueuePerData" method="sendInQueuePerData" ref="dataProcessor"/>
            <to id="emailqueue" uri="activemq:queue:{{email.queue}}?jmsMessageType=Text"/>
        </loop>
    </route>
</camelContext>

emailQueue начинает передаваться другим emailProcessor. emailProcessor отправляет электронные письма на SMTP.

Проблема в том, что DataProcessor блокируется до тех пор, пока не будут завершены все входные данные. Его нельзя блокировать после отправки данных в очередь.

1 Ответ

0 голосов
/ 19 июня 2019

Тебе не нужен цикл for. Передайте выходные данные checkDataInList в разделитель, а затем в процессор электронной почты.

Это будет неблокирующим и более подходящим для верблюдов способом.

...