根据 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()
.
之后
这是一个现有的整体式应用程序,需要在不对设置进行重大更改的情况下进行修复。
项目设置: 项目 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()
.