如何将从jdbc获取的消息发送到rabbitmq?

时间:2014-12-25 12:58:24

标签: rabbitmq spring-integration

spring integration reference on JDBC Support 它有以下代码从表中获取记录并将它们转换为消息并将它们发送到通道。但我的系统是rabbitmq所以我希望jdbc中的消息存储在rabbitmq中并由rabbitmq客户端使用。如何使用spring integration和spring rabbitmq做到这一点?

<int-jdbc:inbound-channel-adapter query="select * from item where status=2"
    channel="target" data-source="dataSource"
    update="update item set status=10 where id in (:id)" />

我知道有AMQP支持消息通道,定义如下。

<int-amqp:channel id="p2pChannel"/>

但是如何将它们组合在一起?这样从表创建的消息将存储在rabbitmq队列中吗?

更新:我使用了以下代码:

<bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="jdbc:postgresql://localhost/example"/>
    <property name="username" value="postgres"/>
    <property name="password" value="oracle"/>
</bean>

<int-amqp:channel id="myMessageChannel_test"/>


<int-jdbc:inbound-channel-adapter query="select * from my_files where message_created=0"
                                  channel="myMessageChannel_test" data-source="dataSource"
                                  update="update my_files set message_created=1 where file_id in (:file_id)">
    <int:poller fixed-rate="1000">
        <int:transactional/>
    </int:poller>
</int-jdbc:inbound-channel-adapter>

但它抱怨道:

    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for amqp-channel 'myMessageChannel_test'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers
    at org.springframework.integration.amqp.channel.AbstractSubscribableAmqpChannel$DispatchingMessageListener.onMessage(AbstractSubscribableAmqpChannel.java:197)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:737)
    ... 10 common frames omitted
Caused by: org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:107)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)
    at org.springframework.integration.amqp.channel.AbstractSubscribableAmqpChannel$DispatchingMessageListener.onMessage(AbstractSubscribableAmqpChannel.java:181)
    ... 11 common frames omitted

2014-12-30 19:23:18.985  WARN 29203 --- [cTaskExecutor-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exception
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:802)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:740)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:628)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:82)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:167)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1196)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:600)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:960)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:944)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:82)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1058)

1 个答案:

答案 0 :(得分:1)

所以你的频道"myMessageChannel_test"有来自数据库的消息,但需要一些像下面这样的配置才能接收/处理/订阅消息。

有很多方法可以做到 - 一种方式如下

<rabbit:connection-factory id="rabbitConnFactory" addresses="${rabbit.addresses}"
     virtual-host="${rabbit.host}" username="${rabbit.username}" password="${rabbit.password}"/> 

<rabbit:admin id="admin" connection-factory="rabbitConnFactory" />

<rabbit:template id="amqpTemplate" connection-factory="rabbitConnFactory" routing-key="some.key" exchange="some.exchange"   queue="some.queue" />   

<int-amqp:outbound-channel-adapter routing-key="some.key" amqp-template="amqpTemplate"
        channel="myMessageChannel_test" />

你也需要做各自的兔子配置