将独立 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/应用程序服务器的主要内容,如果未能解决你的问题,请参考以下文章

Web内核微信小程序框架实践

基于Web内核的微信小程序框架实践

使 JMS 消息出列的独立 Java [关闭]

对于独立应用程序(对于 Spring JMS),Java main 方法应该是啥?

将JMS消息从Java EE应用程序发送到Java SE应用程序

JMS/DDS 集成