AMQP с менеджером транзакций в модели RPC

#spring-transactions #spring-amqp

#spring-транзакции #spring-amqp

Вопрос:

Я использую spring-amqp / RabbitMQ для своего проекта с RPC. Я могу отправлять и получать сообщения через посредник сообщений без каких-либо проблем.

Вот мой рабочий код

 <bean id="stbListener"
    class="org.springframework.amqp.remoting.service.A mqpInvokerServiceExporter">
    <property name="serviceInterface" value="com.java.stb.service.api.STBService" />
    <property name="service" ref="stbService" />
    <property name="amqpTemplate" ref="template" />
</bean>

<bean id="stbService" class="com.java.stb.service.impl.STBServiceImpl" />

<rabbit:connection-factory id="connectionFactory"
    channel-cache-size="10" />
<rabbit:admin connection-factory="connectionFactory"
    auto-startup="false" />
<rabbit:template id="template" connection-factory="connectionFactory"
    channel-transacted="true" />

<rabbit:queue name="${queue}" />

<rabbit:listener-container connection-factory="connectionFactory">
    <rabbit:listener ref="stbListener" queue-names="${queue}" />
</rabbit:listener-container>
  

И недавно я добавил аннотацию @transactional в какой-то мой метод producer для получения / вставки / обновления данных в Postgres. Теперь у меня возникла проблема с получением сообщения от производителя. Я скопировал свой код производителя ниже с добавлением менеджера транзакций

 <bean id="stbListener"
class="org.springframework.amqp.remoting.service.A mqpInvokerServiceExporter">
<property name="serviceInterface" value="com.java.stb.service.api.STBService" />
<property name="service" ref="stbService" />
<property name="amqpTemplate" ref="template" />
</bean>


<bean id="rabbitTxManager"
class="org.springframework.amqp.rabbit.transaction .RabbitTransactionManager">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<bean id="stbService" class="com.java.stb.service.impl.STBServiceImpl" />

<rabbit:connection-factory id="connectionFactory"
channel-cache-size="10" />
<rabbit:admin connection-factory="connectionFactory"
auto-startup="false" />
<rabbit:template id="template" connection-factory="connectionFactory" 
channel-transacted="true" />

<rabbit:queue name="${queue}" />

<rabbit:listener-container concurrency="20" prefetch="20" transaction-size="10" auto-startup="false" 
connection-factory="connectionFactory" transaction-manager="rabbitTxManager">
<rabbit:listener ref="stbListener" queue-names="${queue}" />
</rabbit:listener-container> 
  

я получаю ошибку тайм-аута, которая

 Caused by: org.springframework.remoting.RemoteProxyFailureExc eption: No reply received - perhaps a timeout in the template?
at org.springframework.amqp.remoting.client.AmqpClien tInterceptor.invoke(AmqpClientInterceptor.java:60)
at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java :172)
at org.springframework.aop.framework.JdkDynamicAopPro xy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy7.isIdentityAvailableForSTB(Un known Source)
at tv.moonweb.stb.service.api.STBServiceClient.isIden tityAvailableForSTB(STBServiceClient.java:101)
... 17 more
  

Я установил reply-timeout="10000" на стороне потребителя.

Пожалуйста, помогите мне решить эту проблему

Заранее благодарю

Gopy

Ответ №1:

Я предлагаю вам включить ведение журнала отладки с обеих сторон; если вы не можете понять, в чем проблема, разместите журналы где-нибудь, и мы сможем посмотреть.

Непонятно, почему вы добавили диспетчер транзакций Rabbit на стороне потребителя, когда сказали, что добавили @Transactional на стороне производителя.

Если ваш STBServiceImpl взаимодействует с базой данных, менеджер транзакций должен быть менеджером транзакций JDBC.

Если вы хотите, чтобы нисходящий поток RabbitTemplate участвовал во входящем сеансе, контейнер прослушивателя сообщений также необходим channel-transacted — в противном случае прослушиватель запускается в нетранзакционном канале.

Комментарии:

1. я добавил «@transactional» только на стороне производителя. Теперь я попробовал с помощью ‘org.springframework.orm.hibernate4. HibernateTransactionManager и ‘channel-transacted =»true»‘ в контейнере listner. все та же проблема, я включу отладку и обновление для вас. Еще одна вещь, с которой я сталкиваюсь с этой проблемой только на сервере virgo, а не в eclipse

2. Я нашел себя. Это моя текущая конфигурация listner, <rabbit:слушатель-контейнер channel-transacted=»true» connection-factory=»ConnectionFactory»> <rabbit:слушатель ref=»stbListener» queue-names=»${stb.queue}» /> </rabbit:слушатель-контейнер> спасибовы