如何使用activemq实现JMS侦听器并弹出到我的OpenXava应用程序中

时间:2012-12-17 05:49:23

标签: spring jms activemq openxava

前段时间我使用JMS监听器(用于接收消息)到标准的webapps中,通常使用JSF(ICEfaces)作为webapp,使用spring,activemq等,用于JMS集成。

现在,我正在尝试对OpenXava应用程序执行相同操作。所以,这就是我现在所做的:

  • 我已经将listeners.xml创建到WEB-INF(web.xml的同一个地方,我无法修改,因为OpenXava),这个内容(OpenXava自动将内容添加到web.xml) :

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>  
        classpath:applicationContext.xml
    </param-value>  
</context-param>

  • 我创建了applicationContext.xml(我已经测试过将它放在OpenXava应用程序的src文件夹中,也放入了WEB-INF中),内容如下:

             

    <!-- Create the topic to connect to -->
    <bean id="TTCTopic" class="org.apache.activemq.command.ActiveMQTopic">
        <property name="physicalName" value="com.comp.app.message.tags"/>
    </bean>
    
    <!-- JMS Connection Factory -->
    <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://127.0.0.1:1100"/>
    </bean>
    
    <!-- Spring Helper to listen to a JMS Destination -->
    <bean id="jmsContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="TTCTopic" />
        <property name="messageListener" ref="messageReceiver" />
    </bean>
    

  • 然后,我创建了我的侦听器类(com.comp.app.listeners.MessageReceiver),它实现了JMS MessageListener接口,并且具有处理收到的消息的代码。

  • 此外,我确实将我的OpenXava应用程序的WEB-INF / Lib放入spring和activemq jar中,并且还在每个jar的项目类路径中添加了引用。

最后,我没有收到任何错误。

因此,在所有问题出现之后:Spring上下文没有被添加到OpenXava web.xml中,因为没有创建Spring上下文,因此永远不会创建JMS侦听器。

那么,我在这里缺少什么? ......有更好的方法吗?

提前致谢,

3 个答案:

答案 0 :(得分:0)

尝试明确指出WEB-INF:

<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

Official docs指出将此直接添加到web.xml中。

答案 1 :(得分:0)

好吧,也许这不是我的问题的真正答案,但是没有找到为我的OpenXava应用程序创建弹簧上下文的方法(这里需要ActiveMQ定义和DI使用弹簧容器),我决定退出Spring依赖并按原样继续使用ActiveMQ。因此,我继续创建一个Consumer类,它创建与JMS代理的连接,并使用特定主题来注册和启动我的侦听器,该侦听器准备接收xml编组的消息并将其解组为主进程。

由于OpenXava的Domain Driven设计性质,我试图不用其他东西弄乱配置。看到我无法将弹簧容器配置到我的OX应用程序中,这种新方法无需花费太多精力。我还在通用(应用程序)控制器中创建了一个新的“on-start”操作,它使用单例模式来保持连接与代理的会话以及将等待消息的JMS侦听器。

现在,我正在研究如何集成该监听器以将一些特定的瞬态视图刷新到我的OpenXava应用程序中,这将变得棘手。但这将是一个新的主题。

此致

PS:如果有人想看到代码只是发邮件给我并要求它。

答案 2 :(得分:0)

我的建议是创建一个非常简单的OpenXava项目并逐步跟随Spring integration instruction,当它工作时,您可以针对您的真实项目进行尝试。

但是,您选择不使用Spring会更好。