将独立 JMS 应用程序移植到 Web/应用程序服务器
Posted
技术标签:
【中文标题】将独立 JMS 应用程序移植到 Web/应用程序服务器【英文标题】:Porting a standalone JMS application to a web/app server 【发布时间】:2014-07-06 09:16:33 【问题描述】:背景:
我们有一个基于 JMS(点对点)的独立应用程序。我们目前通过 Java 主程序在单独的 JVM 实例中启动 JMS 监听器,并通过另一个 Java 主程序从另一个 JVM 实例向该监听器发布请求。
要求:
我们只想将 JMS 侦听器作为战争/耳朵移植到 Web/应用程序服务器上。我们希望在容器部署 war/ear 时启动 JMS 侦听器。
问题:
编写一个 Servlet 并将 <load-on-startup>
配置为 true 是否是个好主意。然后我们可以在 servlet 的 init 方法中启动 JMS 监听器。这样做有什么好处和坏处?
有没有比第 1 点更好的选项来在应用程序启动时启动 JMS 侦听器?
我们在应用程序中使用 Spring 和 Spring JMS。我们是否可以简单地将我们的 spring 上下文文件移动到 META-INF,或者是否需要任何其他配置更改才能使 spring 上下文文件对 web 应用程序可见。
请注意,对于我们无法控制的约束,我们需要将 JMS 侦听器移植到 Web 应用程序。我不想知道移植这是否是一个好主意,而是想知道如何做到这一点。
【问题讨论】:
为什么这被否决了? 【参考方案1】:首先,参考检查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 这个问题。
【讨论】:
以上是关于将独立 JMS 应用程序移植到 Web/应用程序服务器的主要内容,如果未能解决你的问题,请参考以下文章
对于独立应用程序(对于 Spring JMS),Java main 方法应该是啥?