当系统收到 JMS 消息时,我想刷新我的应用程序上下文。为了做到这一点,我设置了 Spring Integration jms:message-driven-channel-adapter,它将消息转发到实现 ApplicationContextAware 的服务激活器。此激活器(ConfigurationReloader 类)调用 ConfigurableApplicationContext#refresh() 方法。
下面是示例代码片段:
<jms:message-driven-channel-adapter id="jmsDriverConfigurationAdapter"
destination="configurationApplyQueue" channel="jmsConfigurationInboundChannel" />
<channel id="jmsConfigurationInboundChannel"/>
<service-activator input-channel="jmsConfigurationInboundChannel" ref="configurationReloader" method="refresh"/>
还有我的激活器:
public final class ConfigurationReloader implements ApplicationContextAware {
private ConfigurableApplicationContext applicationContext;
public void refresh() {
this.applicationContext.refresh();
}
@Override
public void setApplicationContext(
final ApplicationContext applicationContext) throws BeansException {
if (applicationContext instanceof ConfigurableApplicationContext) {
this.applicationContext =
(ConfigurableApplicationContext) applicationContext;
}
}
}
在传递此类消息的情况下,上下文启动关闭操作但卡在 DefaultMessageListenerContainer bean 关闭:
2011-11-14 15:42:52,980 [org.springframework.jms.listener.DefaultMessageLis tenerContainer#0-1] DEBUG org.springframework.jms.listener.DefaultMessageLis tenerContainer - Shutting down JMS listener container
2011-11-14 15:42:52,980 [org.springframework.jms.listener.DefaultMessageLis tenerContainer#0-1] DEBUG org.springframework.jms.listener.DefaultMessageLis tenerContainer - Waiting for shutdown of message listener invokers
2011-11-14 15:42:55,104 [org.springframework.jms.listener.DefaultMessageLis tenerContainer#0-1] DEBUG org.springframework.jms.listener.DefaultMessageLis tenerContainer - Still waiting for shutdown of 1 message listener invokers
通过 JMS 调用此操作对我来说至关重要,因为新的配置参数与消息一起传递。它是基于最新 SpringCore 和 Spring Integration 的标准 Spring MVC 应用程序,前端带有 DispatcherServlet。另外我确信这是与 JMS 相关的问题,因为通过控制器调用 ConfigurationLoader 可以正常工作。
正如我调试的那样,它在 DefaultMessageListenerContainer#538 行调用(lifecycleMonitor 上的 wait() 方法)之后卡住了:
/**
* Destroy the registered JMS Sessions and associated MessageConsumers.
*/
protected void doShutdown() throws JMSException {
logger.debug("Waiting for shutdown of message listener invokers");
try {
synchronized (this.lifecycleMonitor) {
while (this.activeInvokerCount > 0) {
if (logger.isDebugEnabled()) {
logger.debug("Still waiting for shutdown of " + this.activeInvokerCount +
" message listener invokers");
}
this.lifecycleMonitor.wait(); // <--- line 538
}
}
}
catch (InterruptedException ex) {
// Re-interrupt current thread, to allow other threads to react.
Thread.currentThread().interrupt();
}
}
...没有人在监视器上调用 notify / notifyAll 所以也许这是某种错误?
感谢您的任何提示!