首先,参考检查the JMS chapter of the documentation
我不确定我是否真的理解 Web 应用程序的实际问题可能是什么:就 Spring 而言,这只是一个应用程序,就像任何其他应用程序一样。如果您还没有这样做,您应该为您的 JMS 侦听器注册一个侦听器容器,例如:
<!-- this is your message listener -->
<bean id="messageListener" class="jmsexample.ExampleListener" />
<!-- and this is the message listener container -->
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="destination"/>
<property name="messageListener" ref="messageListener" />
</bean>
现在您要确保此侦听器不会使用消息,除非应用程序已启动。一个典型的 Spring Web 应用程序定义为一个根 ApplicationContext 用于核心部分,一个子 ApplicationContext 用于 servlet 相关部分。
默认情况下,容器作为定义它的应用程序上下文的一部分启动。我假设你的听众不依赖网络的东西,所以你应该在根目录中定义它。有一种方法可以为容器指定一个阶段,该容器将控制何时应用程序启动时涉及其他bean。
您也可以简单地将autoStartup 设置为false。在这种情况下,容器根本不会启动,您可以随时启动它。例如,您可以创建一个 ApplicationListener 来侦听 ContextRefreshEvent 并注入您的侦听器并在那时启动它。类似的东西
public class YourListener implements ApplicationListener<ContextRefreshedEvent> {
private DefaultMessageListenerContainer container;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
this.container.start();
}
public void setContainer(DefaultMessageListnerContainer container {
this.container = container;
}
}
请注意,如果您确实依赖 Web 部件可用,则正确注册侦听器可能会很棘手。检查this answer for a full description 这个问题。