Spring集成 - 更少的样板?

时间:2015-06-19 07:42:15

标签: java xml spring spring-integration

我已经开始使用Spring-integration来监听JMS队列,并且它工作得很满意,但是我在设置监听器时所需的xml配置数量有些问题。其中大部分是样板文件,更改实际上只是jms-instance和要侦听的队列的名称,以及接收消息时调用的类和方法。这是一个例子:

<?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:int="http://www.springframework.org/schema/integration"
       xmlns:jms="http://www.springframework.org/schema/integration/jms"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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">
  <bean id="jms.queue.myQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="${myApplication.jms.queue.myQueue}" />
  </bean>
  <bean id="jms.container.myJMSListender"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer"
        destroy-method="destroy">
    <property name="connectionFactory"
              ref="jmsConnectionFactory" /> <!-- Defined elsewhere -->
    <property name="destination"
              ref="jms.queue.myQueue" />
    <property name="sessionTransacted"
              value="true" />
  </bean>

  <int:publish-subscribe-channel id="channel.myQueue" />

  <jms:message-driven-channel-adapter id="channelAdapter.myQueue"
                                      container="jms.container.myQueue"
                                      channel="channel.myQueue"
                                      acknowledge="transacted"/>

  <int:service-activator id="serviceActivator.myQueue"
                         input-channel="channgel.myQueue"
                         ref="myQueueJMSListener"
                         method="handleMessage" />
</beans>

正如你所看到的,很多配置相当简单,并且有很多JMS监听器,这对于读写来说都变得乏味。

有没有办法配置使用Spring集成来监听队列,这需要更少的样板?我已经考虑过创建自己的XML标签,但我希望有一个更简单的解决方案。

2 个答案:

答案 0 :(得分:1)

如果需要配置未在命名空间中公开的属性,则只需要一个外部容器。

<jms:message-driven-channel-adapter id="channelAdapter.myQueue"
                                  destination="jms.queue.myQueue"
                                  connection-factory="jmsConnectionFactory"
                                  channel="channel.myQueue"
                                  acknowledge="transacted"/>

答案 1 :(得分:0)

发现Spring integration有注释支持。

需要一些设置,但这可以用于多个侦听器:

  <amq:connectionFactory id="jmsConnectionFactory" brokerURL="${jms.host}">
    <amq:redeliveryPolicy>
      <amq:redeliveryPolicy maximumRedeliveries="0" />
    </amq:redeliveryPolicy>
  </amq:connectionFactory>

  <bean id="cachingJmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="jmsConnectionFactory" />
  </bean>

  <jms:annotation-driven />

  <bean id="jmsListenerContainerFactory" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
    <property name="connectionFactory" ref="cachingJmsConnectionFactory" />
  </bean>

然后,收听某个队列就像这样简单:

@JmsListener(destination = "${myQueueName}")
public void listen(@Payload final String payload) {