2

現在、直接交換を使用してRabbit MQ Brokerをセットアップしており、SpringIntegrationを使用してキューからメッセージを生成および消費しています。私は、SIを使用して1つのPOJOから別のPOJOに消費されたメッセージを渡す責任の連鎖パターンを使用しています。これを行うために、SpringIntegrationインバウンドチャネルアダプタを使用しました。これには、ポーラーへの参照が必要です。

ポーリングメカニズムではなくコールバックを使用してポーラーを削除し、メッセージが利用可能になるとすぐに、SIが提供する責任の連鎖パターンを使用しながら、メッセージをキューからフェッチするようにするにはどうすればよいですか。

インバウドチャネルアダプタをSpringRabbitインバウンドチャネルアダプタに変更しようとしましたが、メッセージを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

1 に答える 1

4

<int-amqp:inbound-channel-adapter />を使用して、eventChannelにメッセージを送信します。あなたの消費者はウサギについて知る必要はありません。<service-activator/>を介して呼び出すことができます

于 2012-06-20T16:33:02.890 に答える