持久订阅ActiveMQ

时间:2015-10-16 06:12:02

标签: java jms activemq spring-integration durable-subscription

我正在尝试为我的消息设置持久订阅者,以便即使在服务器重新启动后它们也会在主题中保留。

但在配置期间,我收到与xml相关的错误:

这是我的配置xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:int-jms="http://www.springframework.org/schema/integration/jms"
       xmlns:oxm="http://www.springframework.org/schema/oxm"
       xmlns:int-jme="http://www.springframework.org/schema/integration"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
                http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
                http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">


    <!-- Component scan to find all Spring components -->
    <context:component-scan base-package="com.geekcap.springintegrationexample" />

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="order" value="1" />
        <property name="messageConverters">
            <list>
                <!-- Default converters -->
                <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
                <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
            </list>
        </property>
    </bean>

    <!-- Define a channel to communicate out to a JMS Destination -->
    <int:channel id="topicChannel"/>

    <!-- Define the ActiveMQ connection factory -->
    <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean>

    <!--
        Define an adaptor that route topicChannel messages to the myTopic topic; the outbound-channel-adapter
        automagically fines the configured connectionFactory bean (by naming convention
      -->
    <int-jms:outbound-channel-adapter channel="topicChannel"
                                      destination-name="topic.myTopic"
                                      pub-sub-domain="true" />

    <!-- Create a channel for a listener that will consume messages-->
    <int:channel id="listenerChannel" />

    <int-jms:message-driven-channel-adapter id="messageDrivenAdapter"
                                            channel="getPayloadChannel"
                                            subscription-durable="true"
                                            durable-subscription-name="myDurableSubscription"
                                            destination-name="topic.myTopic"
                                            pub-sub-domain="true" />

    <int:service-activator input-channel="listenerChannel" ref="messageListenerImpl" method="processMessage" />

    <int:channel id="getPayloadChannel" />

    <int:service-activator input-channel="getPayloadChannel" output-channel="listenerChannel" ref="retrievePayloadServiceImpl" method="getPayload" />

</beans>

但在message-driven-channel-adapter以下属性中出现错误: enter image description here

它说:

在此行找到多个注释:

  • cvc-complex-type.3.2.2:属性&#39;订阅耐用&#39;不允许出现在元素&#39; int-jms中:message-driven-channel-  适配器&#39;
  • cvc-complex-type.3.2.2:属性&#39;持久订阅名称&#39;不允许出现在元素&#39; int-jms中:message-driven-channel-  适配器&#39;

但是在更多的例子中我可以看到下面的属性工作正常。

  • subscription-durable="true"

  • durable-subscription-name="myDurableSubscription"

然后我的配置可能出错了。

编辑: POM.xml中的Spring Integration依赖项

<!-- Spring Integration -->
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-core</artifactId>
            <version>4.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jms</artifactId>
            <version>4.2.0.RELEASE</version>
        </dependency>

修改

请参阅附图: enter image description here

另请参阅我的日志,该日志表示已调用目标方法,该方法应在客户端使用消息时发生。 enter image description here 请帮忙。

1 个答案:

答案 0 :(得分:3)

您使用的是什么版本的Spring Integration? 4年前版本2.1.0.RELEASE中添加了对持久订阅的支持。

当前版本为4.2.0.RELEASE。

修改

我忘了提到你需要一个持久订阅的客户端ID。

您是否看过日志消息?这看起来很清楚......

  

14:12:39.557 WARN [jmsIn.container-1] [org.springframework.jms.listener.DefaultMessageListenerContainer] JMS消息监听器调用程序的设置失败,目的地为'topic://topic.demo' - 尝试恢复。原因:如果未在Connection

上指定唯一的clientID,则无法创建持久订阅者

将clientId添加到连接工厂......

    <property name="clientId" value="myClient"/>