Должен ли я использовать Spring-Integration или простой Spring IoC для рабочих потоков?

Мы находимся в стадии разработки нашего приложения. Мы решили использовать Spring-Integration. В качестве отправной точки приложение читает сообщения из очереди JMS с использованием входящего адаптера, основанного на опросе, и многопоточного с использованием задачи-исполнителя. После проверки журнала сообщения эти потоки получателя сбрасывают сообщения в каналы, откуда рабочий поток забирает каждое сообщение для дальнейшей обработки. Сама дальнейшая обработка включает в себя различные компоненты, такие как разбор сообщений, создание объектов узлов, предварительное связывание и связывание. На этапах он включает в себя приемники для сохранения сообщений и сохранения объекта узла. Это согласно приведенной ниже конфигурации.

<int-jms:inbound-channel-adapter jms-template="jmsTemplate"  channel="channel1" id="MessageReceiver">
    <int:poller fixed-delay="100" time-unit="MILLISECONDS" task-executor="taskExecutor"/>
</int-jms:inbound-channel-adapter>
<int:channel id="channel1">
        <int:interceptors>
            <int:wire-tap channel="channel.tbl_message"/>
        </int:interceptors>
    </int:channel>

<bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${db.driverClassName}" />
    <property name="url" value="${db.host.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

<int-jdbc:outbound-channel-adapter channel="channel.tbl_message" data-source="dataSource"
    query="#{message.receiver.insert.query}" id="MessageLogger"></int-jdbc:outbound-channel-adapter>

<int:transformer input-channel="channel1" output-channel="channel2" method="parse" id="NodeBuilder">
    <bean class="com.recon.parser.NodeBuilder"></bean>
</int:transformer>
<int:channel id="channel2"/>

<int:filter input-channel="channel3" output-channel="channel5"
    discard-channel="channel4" method="validate" id="NodeValidator">
    <bean class="com.recon.util.Validator"></bean>
</int:filter>
<int:channel id="channel3">
    <int:interceptors>
        <int:wire-tap channel="channel.tbl_node"/>
    </int:interceptors>
</int:channel>
<int-jdbc:outbound-channel-adapter channel="channel.tbl_node" data-source="dataSource"
    query="#{valid.node.insert.query}" id="ValidNodePersist"></int-jdbc:outbound-channel-adapter>

<int:channel id="channel4"/>
<int-jdbc:outbound-channel-adapter channel="channel4" data-source="dataSource"
    query="#{validation.failure.insert.query}" id="FailedNodePersist"></int-jdbc:outbound-channel-adapter>

<int:transformer input-channel="channel2" output-channel="channel3" method="nodeEnricher" id="NodeEnricher">
    <bean class="com.recon.processor.NodeEnricher"></bean>
</int:transformer>

<int:channel id="channel5"/>
<int:service-activator input-channel="channel5" id="LinkerManager">
    <bean class="com.recon.manager.LinkerManager"></bean>
</int:service-activator>

Теперь у меня есть два варианта: 1) Создать пул потоков рабочих потоков. Каждый рабочий поток будет обрабатывать сообщение от процессора узла и далее, который будет использовать все последующие компоненты простым способом внедрения зависимостей Spring без использования Spring-интеграции. 2) Создайте пул потоков каждого компонента, используя задачу-исполнителя. Каждый из потоков каждого компонента выберет входной объект, буферизованный на своих предыдущих каналах. Однако это создаст много потоков, так как каждый компонент будет многопоточным.

Может ли кто-нибудь предложить какое-то решение о подходе, который будет выбран?

2 ответа

@prasadsh Получаете ли вы необходимую производительность, конвертируя <wire-tap> каналы в QueueChannel? Вы также можете попробовать преобразовать channel1 в QueueChannel, так как в любом случае у вас есть channel.tbl_message для записи входных сообщений из jms.

Мне любопытно узнать, работает ли у вас какое-либо решение, потому что у нас схожие требования (10 тыс. Сообщений в секунду)

Как только вы начнете свой поток из JMS message pollerЯ не вижу смысла переносить сообщения из темы опроса в другую. Было бы лучше, если бы ваша общая логика была выполнена в этом единственном потоке, и в этом случае пропускная способность вашего приложения будет зависеть от параллелизма Poller TaskExecutor.

audit logging, message saving а также node object saving может быть сделано из другой thead. В этом случае QueueChannel для вас. Я имею в виду все эти <int:wire-tap> каналы.

Другие вопросы по тегам