#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:слушатель-контейнер> спасибовы