根据 DB 的标志切换 on/off IBM MQ 侦听器

Switch on/off IBM MQ listener based on flag from DB

这是一个现有的整体式应用程序,需要在不对设置进行重大更改的情况下进行修复。

项目设置: 项目 1(配置)-> 所有 mq-xml 文件都存在(例如 - ibm_mq_config.xml)

例如 - dev_bm_mq.xml

的内容

${hname} ${端口} ${qmgr} 1个

<!-- JMS Queue Connection Factory -->
<bean id="jmsQueueIdsConnectionFactory"
    class="org.springframework.jms.connection.SingleConnectionFactory">
    <property name="targetConnectionFactory">
        <ref bean="mqIdsConnectionFactory" />
    </property>

</bean>


<!-- JMS Destination Resolver -->
<bean id="jmsDestinationResolver"
    class="org.springframework.jms.support.destination.DynamicDestinationResolver">
</bean>


<!-- JMS Queue Template -->
<bean id="jmsQueueIdsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory">
        <ref bean="jmsQueueIdsConnectionFactory" />
    </property>
    <property name="defaultDestinationName">
        <value>${myQUEUE}</value>
    </property>
    <property name="pubSubDomain">
        <value>false</value>
    </property>
    <property name="receiveTimeout">
        <value>20000</value>
    </property>
</bean>  

<bean id="jmsContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsQueueConnectionFactory" />
    <property name="destinationName">
        <value>${myQUEUE}</value>
    </property>
    <property name="messageListener" ref="simpleMessageListener" />
    <property name="concurrentConsumers" value="2" />
    <property name="maxConcurrentConsumers" value="3" />
    <property name="idleTaskExecutionLimit" value="4" />
    <property name="maxMessagesPerTask" value="4" />
    <property name="receiveTimeout" value="5000" />
    <property name="recoveryInterval" value="5000" />
    <property name="sessionTransacted" value="true" />
</bean> 

****项目 B(应用程序)****

从项目配置中加载 spring xml,如下所示: WebContent/WEB-INF/spring/sprint-context.xm

<import resource="classpath*:com/my/package/${config.env}-${config-broker}.mq.xml"

public class TestMessageListener implements MessageListener {

        public void onMessage(Message message) {
          //process the message
      }
    }

当服务器启动时,它能够毫无问题地启动服务器和设置侦听器。

上述设置的问题:当我们水平扩展应用程序(添加几个节点)时,它会出现我正在尝试解决的最大通道问题。

要求: 基于数据库 table 我想在几个节点上动态关闭 mq 侦听器。或者当我水平缩放应用程序时。

例如- Table:mq-配置

|host|broker|flag
-----------------------------
|qa5|ibm|false
|qa2|ibm|true

因此,我希望 qa5 上的 mq 侦听器不启动,而 qa2 启动并侦听队列。另外,我想 stop/start 即时监听器(只需更新数据库)

问题 - 关于如何在不重写整个设置的情况下实现上述用例的任何想法。

注入侦听器容器(例如@Autowired)。

然后

jmsContainer.stop();
jmsContainer.shutdown();

...

jmsContainer.initialize();
jmsContainer.start();

您还可以将 autoStartup 属性 设置为 false 以防止容器在应用程序初始化期间启动(但不要在第一个 start() - 仅在调用 shutdown().

之后