2014-12-25 2 views
1

В spring integration reference on JDBC Support он имеет следующий код, чтобы получить записи из таблицы и преобразовать их в сообщение и отправить их на канал. Но моя система - rabbitmq, поэтому я хочу, чтобы сообщение из jdbc хранилось в rabbitmq и использовалось клиентом rabbitmq. Как это сделать, используя весеннюю интеграцию и весенний кролик?Как отправить сообщение от jdbc на 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) 
+0

Указав правильный канал ... 'канал =«p2pChannel»' канал является каналом ... –

+0

@ M.Deinum, я мог бы создать очередь, но теперь он жалуется, что у Диспетчера нет подписчиков. Я хочу сделать это, чтобы буферизовать сообщение в rabbitmq. У меня будет другое приложение, чтобы потреблять сообщение, поэтому почему он не жалуется: «Диспетчер не имеет подписчиков»? –

ответ

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" /> 

Вы должны сделать соответствующие конфиги кролика, а

Смежные вопросы