与AMQP的Azure Service Bus事务

时间:2017-07-03 07:14:48

标签: java transactions amqp azureservicebus servicebus

我尝试将Azure Service Bus与Apache Qpid和Spring Integration与事务一起使用。

但看起来,Azure Service Bus AMQP实现并不支持事务。这是真的吗?我没有找到相关信息。

这是我的JMS配置

public class Team extends SugarRecord<Team> {
   String teamName;
   ...

    public List<Person> getPersons(){
            return Person.find(Person.class, "id = ?", String.valueOf(this.getId()));
    }
}

这是我的spring整合片段:

<bean id="serviceBusConnectionFactory" class="org.apache.qpid.jms.JmsConnectionFactory">
    <constructor-arg value="amqps://${serviceBus.host}?amqp.idleTimeout=1200000"/>
    <property name="clientID" value="${serviceBus.clientId}"/>
    <property name="username" value="${serviceBus.sharedAccessPolicyName}"/>
    <property name="password" value="${serviceBus.sharedAccessPolicyKey}"/>
    <property name="receiveLocalOnly" value="true"/>
    <property name="receiveNoWaitLocalOnly" value="true"/>
</bean>
<bean id="jmsCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="serviceBusConnectionFactory" />
</bean>

它适用于session-transacted =&#34; false&#34; 但是使用session-transacted =&#34; true&#34;它会产生错误:

<int-jms:inbound-channel-adapter id="resOrdJmsIn"
                                 destination-name="${serviceBus.destination-name}"
                                 channel="resOrdIncoming"
                                 connection-factory="jmsCachingConnectionFactory"
                                 acknowledge="client"
                                 session-transacted="true"   >
    <int:poller fixed-rate="1000"/>
</int-jms:inbound-channel-adapter>

APACHE QPID跟踪

2017-07-03 10:06:27.237 ERROR 21575 --- [ask-scheduler-2] o.s.integration.handler.LoggingHandler   : org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: An AMQP error occurred (condition='amqp:internal-error'). [condition = amqp:internal-error]
    at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
    at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:169)
    at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:487)
    at org.springframework.jms.core.JmsTemplate.receiveSelected(JmsTemplate.java:754)
    at org.springframework.integration.jms.JmsDestinationPollingSource.doReceiveJmsMessage(JmsDestinationPollingSource.java:138)
    at org.springframework.integration.jms.JmsDestinationPollingSource.receive(JmsDestinationPollingSource.java:111)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:224)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:245)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:58)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:190)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:186)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:353)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:51)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:344)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.jms.JMSException: An AMQP error occurred (condition='amqp:internal-error'). [condition = amqp:internal-error]
    at org.apache.qpid.jms.provider.amqp.AmqpSupport.convertToException(AmqpSupport.java:148)
    at org.apache.qpid.jms.provider.amqp.AmqpSupport.convertToException(AmqpSupport.java:103)
    at org.apache.qpid.jms.provider.amqp.builders.AmqpResourceBuilder.handleClosed(AmqpResourceBuilder.java:167)
    at org.apache.qpid.jms.provider.amqp.builders.AmqpResourceBuilder.processRemoteClose(AmqpResourceBuilder.java:113)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider.processUpdates(AmqpProvider.java:795)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider.access$1900(AmqpProvider.java:92)
    at org.apache.qpid.jms.provider.amqp.AmqpProvider$17.run(AmqpProvider.java:699)
    ... 7 more

1 个答案:

答案 0 :(得分:0)

Spring集成代码段,与基于JMS的Azure Service Bus一起使用,由AMPQ以事务方式支持:

  <int-jms:message-driven-channel-adapter id="jmsIn"
                                            destination-name="${serviceBus.destination-name}"
                                            connection-factory="jmsCachingConnectionFactory"
                                            acknowledge="client"
                                            channel="channel-si"/>