Объединение потоков подписчиков темы Spring

#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