2012-06-20 76 views
2

我目前有一個直接交換的Rabbit MQ Broker設置,我使用Spring Integration來生成和使用來自隊列的消息。我正在使用責任鏈模式,我使用SI將消耗的消息從一個POJO傳遞到另一個POJO。現在要做到這一點,我使用了Spring集成入站通道適配器。這要求它提供一個輪詢器。Spring Integration和RabbitMQ,我如何避免對我的入站通道適配器進行輪詢

如何刪除輪詢器,使其不在輪詢機制上工作,而是使用回調函數,以便只要有消息可用,它就會從隊列中獲取它,同時仍然能夠使用提供的責任模式鏈由SI。

我試過將inboud通道適配器更改爲Spring Rabbit入站通道適配器,但沒有辦法將消息轉發給我的POJO。以下內容不受支持。

ref="eventConsumer" method="onReceiveEvent" 

我有一些簡單的配置定義如下,我怎麼能實現同樣的事情,而不需要輪詢?

<?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" 
    xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.0.xsd 
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <import resource="classpath:datasource-config.xml" /> 

    <int:logging-channel-adapter id="logger" level="DEBUG" log-full-message="true" /> 

    <int:channel id="eventChannel"> 
     <int:interceptors> 
      <int:wire-tap channel="logger" /> 
     </int:interceptors> 
    </int:channel> 

    <int:channel id="errorChannel"> 
     <int:interceptors> 
      <int:wire-tap channel="logger" /> 
     </int:interceptors> 
    </int:channel> 

    <bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"> 
     <property name="host" value="${rabbitmq.host}" /> 
     <property name="port" value="${rabbitmq.port}" /> 
     <property name="username" value="${rabbitmq.username}" /> 
     <property name="password" value="${rabbitmq.password}" /> 
     <property name="virtualHost" value="${rabbitmq.events.virtual.host}" /> 
    </bean> 

    <bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate"> 
     <constructor-arg name="connectionFactory" ref="connectionFactory" /> 
     <property name="exchange" value="${rabbitmq.events.exchange.name}" /> 
     <property name="routingKey" value="${rabbitmq.events.routing.key}" /> 
    </bean> 

    <bean id="pollingInterval" class="java.lang.String"> 
     <constructor-arg value="${rabbitmq.message.polling.interval}" /> 
    </bean> 

    <int:poller id="rabbitConsumerPoller" fixed-rate="#{pollingInterval}" error-channel="errorChannel" /> 

    <bean id="eventConsumer" class="com.idna.events.consumer.EventsConsumer"> 
     <property name="rabbitTemplate" ref="rabbitTemplate"/> 
     <property name="consumerDao" ref="eventsConsumerDao" /> 
     <property name="queueName" value="${rabbitmq.events.queue.name}" /> 
    </bean> 

    <int:inbound-channel-adapter id="inboundChannelAdapter" channel="eventChannel" ref="eventConsumer" method="onReceiveEvent"> 
     <int:poller ref="rabbitConsumerPoller"/> 
    </int:inbound-channel-adapter> 

</beans> 

謝謝!

回答

4

使用< int-amqp:inbound-channel-adapter />將消息發送到eventChannel。你的消費者不需要了解兔子;它可以通過<服務激活器調用/>

+0

現在就試試吧。我很可能會將它標記爲明天的正確答案。感謝您的幫助,非常感謝。 – DeliveryNinja

相關問題