#java #multithreading #spring #jms #publish-subscribe
#java #многопоточность #spring #jms #опубликовать-подписаться
Вопрос:
Уже несколько дней я просматриваю форумы и веб-сайты о том, как объединить потоки подписчика spring JMS с очень небольшой удачей. Однако при использовании очереди с jms:listener-container существует свойство concurrency, в котором указано, что для темы параллелизм должен быть равен 1. Учитывая это, каковы мои варианты объединения потоков для подписчика темы?
Я начал с маршрута MessageListener с реализации onMessage с:
<bean id="messageListener" class="com.app.mdp.Receiver"/>
<jms:listener-container container-type="default"
connection-factory="connectionFactory" acknowledge="auto" concurrency="1"
destination-type="topic" prefetch="1">
<jms:listener destination="topTopic" ref="messageListener"
method="onMessage" subscription="ASub" />
</jms:listener-container>
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jms/jms-top-notx" />
</bean>
Проблема в том, что я получаю не более одного потока, получающего данные из JMS одновременно.
Затем я попытался использовать task executor с конфигурацией:
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="20" />
<property name="queueCapacity" value="0" />
</bean>
..но, похоже, требуется, чтобы параллелизм имел большее значение в настройке jms:listener-container (если я не недопонимаю). Тем не менее, я получал только один поток за раз.
Я в некоторой растерянности и начинаю думать, что spring не обладает функциональностью для поддержки нескольких потоков при подписке на данные темы JMS. Если это так, то мои варианты, похоже,:
- внедрю свой собственный пул потоков. запланируйте подписчика-> выполните цикл через jmsTmplate.receive() data-> передайте каждое сообщение предопределенному потоку
- вернитесь к EJBs (чего я не хочу делать)
- кое-что еще, о чем мне еще предстоит подумать
Любая помощь была бы высоко оценена.
Ответ №1:
Используете ли вы Websphere для JMS. Если да, то в Websphere есть конфигурация, в которой вы можете настроить количество подключений и сеансов, которые вы можете установить для приложения за один раз. Предположим, что если у вас есть 10 сеансов и 10 подключений, то у вас будет открыто 100 подключений (каналов) к серверу MQ . обратитесь к этой ссылке: http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/umj_sesspoolset.html