Получение исключения при использовании интеграции Spring с Atomikos для транзакций (JMS и DB)

#spring-integration

#весенняя интеграция

Вопрос:

Я получаю следующее исключение при использовании диспетчера транзакций atomikos с интеграцией spring

14:36:18.182 ОТЛАДКА [main][org.springframework.integration.jms.JmsSendingMessageHandler] org.springframework.integration.jms.JmsSendingMessageHandler#0 получено сообщение: [Полезная нагрузка= EmployeeRecord{имя = 'Rmex123', адрес = Феникс, Аризона}][Заголовки= {временная метка= 1403732178182, id=95b13ba2-3b22-4724-8d8d-d3d98c39a694}]
14:36:18.241 ПРЕДУПРЕДИТЬ [main][com.atomikos.jms.ConsumerProducerSupport] прокси-сервер atomikos MessageProducer для ActiveMQMessageProducer { значение= ID:PHXJ05376352-13260-1403732176990-1:1:2:1 }: Сеанс JMS, который вы используете, требует контекста транзакции JTA для вызывающего потока и ни одного.
Пожалуйста, исправьте свой код, чтобы выполнить одно из следующих действий: 
1. запустите транзакцию JTA, если вы хотите, чтобы ваши операции JMS подлежали фиксации / откату JTA, или
2. увеличьте maxPoolSize параметра AtomikosConnectionFactoryBean, чтобы избежать тайм-аута транзакции во время ожидания соединения, или
3. создайте сеанс без транзакций и выполните подтверждение сеанса самостоятельно, или
4. установите localTransactionMode в значение true, чтобы была включена фиксация / откат на уровне соединения.
14:36:18.242 ПРЕДУПРЕДИТЬ [main][исключение com.atomikos.jms.AtomikosTransactionRequiredJMSException] Сеанс JMS, который вы используете, требует контекста транзакции JTA для вызывающего потока, и ни один из них не был найден.
Пожалуйста, исправьте свой код, чтобы выполнить одно из следующих действий: 
1. запустите транзакцию JTA, если вы хотите, чтобы ваши операции JMS подлежали фиксации / откату JTA, или
2. увеличьте maxPoolSize параметра AtomikosConnectionFactoryBean, чтобы избежать тайм-аута транзакции во время ожидания соединения, или
3. создайте сеанс без транзакций и выполните подтверждение сеанса самостоятельно, или
4. установите localTransactionMode в значение true, чтобы была включена фиксация / откат на уровне соединения.
Исключение в потоке "main" org.springframework.integration.Исключение MessageHandlingException: произошла ошибка в обработчике сообщений [org.springframework.integration.jms.JmsSendingMessageHandler#0]
 в org.springframework.интеграция.обработчик.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:79)

Я что-то здесь упускаю? Нужно ли мне явно запускать транзакцию JTA, пожалуйста, помогите решить эту проблему

 <context:component-scan base-package="com.mycompany.poc.sif" />

<int:publish-subscribe-channel id="reqChannel"/> 
<int:channel id="jmsChannel" />



<int:service-activator   input-channel="inChannel" ref="serviceHandler" output-channel="inUnmarshalChannel" />
<!-- To convert incoming XML to EmployeeRecord -->
<int-xml:unmarshalling-transformer unmarshaller="unMarshaller" input-channel="inUnmarshalChannel" output-channel="reqChannel"/>

<!-- To perform Database insert  -->
<jdbc:outbound-channel-adapter channel="reqChannel" query="insert into EMPLOYEERECORD(name,address) values (:payload.name, :payload.address)" data-source="atomikos.dataSource" />

    <!-- To perform JMS Queue send   -->
<int:object-to-string-transformer input-channel="reqChannel" output-channel="jmsChannel"/>
<jms:outbound-channel-adapter id="jms" jms-template="jmsTemplate" channel="jmsChannel" /> 

    <!-- To perform BG check Service Call    -->
<int:transformer ref="bgCheckTransformerBean" input-channel="reqChannel" output-channel="headerChannel"/>
<ws:header-enricher input-channel="headerChannel" output-channel="wsChannel">
    <ws:soap-action value="http://www.example.org/wspBackGroundcheckService/backGroundCheck" />
</ws:header-enricher>
<ws:outbound-gateway id="bgcheckGateway" request-channel="wsChannel" reply-channel="outChannel"
            marshaller="jaxbMarshaller" unmarshaller="jaxbMarshaller" uri="http://host1:3057/BackGroundcheckService" />

<int:header-filter header-names="ws_soapAction" input-channel="outChannel" output-channel="respChannel" />
<int:transformer ref="responseTransformerBean" input-channel="respChannel" output-channel="endChannel"/>

<!--    Bean definitions -->

<beans:bean id="serviceHandler" class="com.mycompany.poc.sif.service.EmpOnboardService" />

<beans:bean id="jaxbMarshaller"
    class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <beans:property name="contextPaths"
                value="org.example.backgroundcheckservice" />
    <beans:property name="checkForXmlRootElement" value="false" />
</beans:bean>

<beans:bean id="unMarshaller"
            class="org.springframework.oxm.castor.CastorMarshaller">
    <beans:property name="mappingLocation" value="classpath:mapping.xml" />
</beans:bean>

<beans:bean id="payloadTransformerBean"
            class="com.mycompany.poc.sif.transformer.PayloadTransformer" />
<beans:bean id="bgCheckTransformerBean"
            class="com.mycompany.poc.sif.transformer.BGCheckTransformer" />
<beans:bean id="responseTransformerBean"
            class="com.mycompany.poc.sif.transformer.ResponseTransformer" />


<beans:bean id="db2.datasource" class="com.ibm.db2.jcc.DB2XADataSource">
    <beans:property name="serverName" value="hostname" />
    <beans:property name="portNumber" value="1234" />
    <beans:property name="databaseName" value="ADB" />
    <beans:property name="driverType" value="4" />
    <beans:property name="user" value="user" />
    <beans:property name="password" value="passwd" />
</beans:bean>




<!--     Define JMS template -->        
    <beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <beans:property name="connectionFactory" ref="atomikos.connectionFactory"></beans:property>
         <beans:property name="defaultDestination" ref="requestQueue"></beans:property>
        <beans:property name="sessionTransacted" value="true"></beans:property>
    </beans:bean>  


    <beans:bean id="requestQueue" class="org.apache.activemq.command.ActiveMQQueue">
            <beans:constructor-arg value="queue.sif"/>
    </beans:bean>


        <!--     Define Transaction Manager and User Transaction -->
        <beans:bean id="jta.transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
            <beans:property name="transactionManager" ref="atomikos.transactionManager"/>
            <beans:property name="userTransaction" ref="atomikos.userTransaction"/>
        </beans:bean>

            <!-- javax.transaction.TransactionManager -->
        <beans:bean id="atomikos.transactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
              init-method="init" destroy-method="close">
            <beans:property name="forceShutdown" value="false"/>
        </beans:bean>

        <!-- javax.transaction.UserTransaction -->
        <beans:bean id="atomikos.userTransaction"
              class="com.atomikos.icatch.jta.UserTransactionImp">
            <beans:property name="transactionTimeout" value="3000"/>
        </beans:bean>

        <!--Wrap the JMS here-->
        <!-- Atomikos JTA configuration, nothing specific to Spring here -->
        <beans:bean id="atomikos.connectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean"
              init-method="init" destroy-method="close">
            <beans:property name="uniqueResourceName" value="xa.activemq"/>
            <beans:property name="xaConnectionFactory" ref="xa.connectionFactory"/>
            <beans:property name="localTransactionMode" value="false"/>
            <!-- XAConnectionFactory -->
            <beans:property name="maxPoolSize" value="10"/>
        </beans:bean>
        <beans:bean id="xa.connectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
            <beans:property name="brokerURL" value="tcp://localhost:61616"/>
            <beans:property name="userName" value="admin"/>
            <beans:property name="password" value="admin"/>
        </beans:bean>

        <!-- Wrap the DB datasources-->
        <beans:bean id="atomikos.dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
            <beans:property name="uniqueResourceName" value="xa.db2"/>
            <beans:property name="xaDataSource" ref="db2.datasource"/>
            <!-- XADataSource -->
        </beans:bean>

    <stream:stdout-channel-adapter id="endChannel" />
 

Ошибка


:16:14.486 ОТЛАДКА [main][org.springframework.integration.channel.DirectChannel] Присутствует на канале 'inUnmarshalChannel', сообщение: [Полезная нагрузка= Rmex123Phoenix, AZ][Заголовки={временная метка= 1403738174485, id= 5cdf38dc-1c45-4392-a7c7-7b2caf586701}]
16:16:14.486 ОТЛАДКА [main][org.springframework.интеграция.трансформатор.MessageTransformingHandler] org.springframework.интеграция.трансформатор.MessageTransformingHandler#0 получено сообщение: [Полезная нагрузка = Rmex123Phoenix, AZ][Заголовки={временная метка = 1403738174485, идентификатор= 5cdf38dc-1c45-4392-a7c7-7b2caf586701}]
16:16:14.496 ОТЛАДКА [главная][org.springframework.интеграция.трансформатор.MessageTransformingHandler] обработчик 'org.springframework.интеграция.трансформатор.MessageTransformingHandler#0' отправка ответного сообщения: [Полезная нагрузка = запись сотрудника {имя = 'Rmex123', адрес = Феникс, Аризона}][Заголовки={временная метка = 1403738174496, идентификатор = 93d53947-5564-4bf1-bc7c-a4471c185b88}]
16:16:14.496 ОТЛАДКА [главная][org.springframework.integration.channel.PublishSubscribeChannel] Отправить на канале 'reqChannel' сообщение: [Полезная нагрузка = Запись сотрудника {имя = 'Rmex123', адрес = Феникс, Аризона}][Заголовки={временная метка = 1403738174496, id=93d53947-5564-4bf1-bc7c-a4471c185b88}]
16:16:14.496 ОТЛАДКА [main][org.springframework.integration.jdbc.JdbcMessageHandler] org.springframework.integration.jdbc.JdbcMessageHandler#0 получено сообщение: [Полезная нагрузка= EmployeeRecord{имя = 'Rmex123', адрес = Феникс, Аризона}][Заголовки= {временная метка= 1403738174496, id=93d53947-5564-4bf1-bc7c-a4471c185b88}]
16:16:14.517 ПРЕДУПРЕЖДЕНИЕ [main][com.atomikos.jdbc.AbstractDataSourceBean] AtomikosDataSoureBean 'xa.db2': размер пула равен умолчанию - это может вызвать проблемы с производительностью!
16:16:15.758 ОТЛАДКА [main][org.springframework.integration.jdbc.JdbcMessageHandler] Сгенерированные ключи: [{ОБНОВЛЕНО=1}]
16:16:15.758 ОТЛАДКА [главная][org.springframework.интеграция.трансформатор.MessageTransformingHandler] org.springframework.интеграция.трансформатор.Обработчик сообщений # 1 получил сообщение: [Полезная нагрузка = запись сотрудника {имя = 'Rmex123', адрес = Феникс, Аризона}][Заголовки ={временная метка = 1403738174496, идентификатор = 93d53947-5564-4bf1-bc7c-a4471c185b88}]
16:16:15.758 ОТЛАДКА [главная][org.springframework.интеграция.трансформатор.MessageTransformingHandler] обработчик 'org.springframework.интеграция.трансформатор.MessageTransformingHandler#1' отправка ответного сообщения: [Полезная нагрузка = запись сотрудника {имя = 'Rmex123', адрес = Феникс, Аризона}][Заголовки={временная метка = 1403738175758, идентификатор = 809a9316-3c1d-474c-879f-eddbbb82fb2f}]
16:16:15.758 ОТЛАДКА [главная][org.springframework.integration.channel.DirectChannel] Отправить на канале 'jmsChannel' сообщение: [Полезная нагрузка = запись сотрудника {имя = 'Rmex123', адрес = Феникс, Аризона}][Заголовки={временная метка = 1403738175758, идентификатор = 809a9316-3c1d-474c-879f-eddbbb82fb2f}]
16:16:15.758 ОТЛАДКА [main][org.springframework.integration.jms.JmsSendingMessageHandler] org.springframework.integration.jms.JmsSendingMessageHandler#0 получено сообщение: [Полезная нагрузка= EmployeeRecord{имя = 'Rmex123', адрес = Феникс, Аризона}][Заголовки= {временная метка= 1403738175758, id=809a9316-3c1d-474c-879f-eddbbb82fb2f}]
16:16:15.809 ПРЕДУПРЕДИТЬ [main][com.atomikos.jms.ConsumerProducerSupport] прокси-сервер atomikos MessageProducer для ActiveMQMessageProducer { значение=ID:PHXJ05376352-15248-1403738173579-1:1:2:1 }: Сеанс JMS, который вы используете, требует контекста транзакции JTA для вызывающего потока и ни одного был найден.
Пожалуйста, исправьте свой код, чтобы выполнить одно из следующих действий: 
1. запустите транзакцию JTA, если вы хотите, чтобы ваши операции JMS подвергались фиксации / откату JTA, или
2. увеличьте maxPoolSize для AtomikosConnectionFactoryBean, чтобы избежать тайм-аута транзакции во время ожидания соединения, или
3. создайте сеанс без транзакций и выполните подтверждение сеанса самостоятельно, или
4. установите localTransactionMode в значение true, чтобы включить фиксацию / откат на уровне соединения.
16:16:15.809 ПРЕДУПРЕЖДЕНИЕ [main][com.atomikos.jms.AtomikosTransactionRequiredJMSException] Для сеанса JMS, который вы используете, требуется контекст транзакции JTA для вызывающего потока, и ни один не был найден.
Пожалуйста, исправьте свой код, чтобы выполнить одно из следующих действий: 
1. запустите транзакцию JTA, если вы хотите, чтобы ваши операции JMS подвергались фиксации / откату JTA, или
2. увеличьте maxPoolSize для AtomikosConnectionFactoryBean, чтобы избежать тайм-аута транзакции во время ожидания соединения, или
3. создайте сеанс без транзакции и выполните подтверждение сеанса самостоятельно, или
4. установите localTransactionMode в значение true, чтобы включить фиксацию / откат на уровне соединения.
Исключение в потоке "main" org.springframework.integration.Исключение MessageHandlingException: произошла ошибка в обработчике сообщений [org.springframework.integration.jms.JmsSendingMessageHandler#0]
 в org.springframework.интеграция.обработчик.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:79)
в org.springframework.integration.dispatcher.Одноадресная рассылка.doDispatch(UnicastingDispatcher.java:115)
 в org.springframework.integration.dispatcher.Одноадресная рассылка dispatcher.dispatch(Одноадресная рассылка dispatcher.java:102)
 в org.springframework.integration.channel.AbstractSubscribableChannel.Отправьте (AbstractSubscribableChannel.java:77)
в org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)
 в org.springframework.integration.channel.AbstractMessageChannel.отправить (AbstractMessageChannel.java:128)
в org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288)
 в org.springframework.integration.core.MessagingTemplate.send(MessagingTemplate.java:149)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.SendMessage(AbstractReplyProducingMessageHandler.java:216)
 в org.springframework.integration.обработчик.Абстрактныйтреплыпроизводящийmessagehandler.sendReplyMessage(абстрактныйтреплыпроизводящийmessagehandler.java:200)
 в org.springframework.integration.обработчик.Абстрактныйтреплыпроизводящийmessagehandler.produceReply(абстрактныйтреплыпроизводящийmessagehandler.java:165)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.handleResult(AbstractReplyProducingMessageHandler.java:159)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:141)
 в org.springframework.интеграция.обработчик.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:73)
в org.springframework.integration.dispatcher.BroadcastingDispatcher.invokeHandler(BroadcastingDispatcher.java:121)
 в org.springframework.integration.dispatcher.BroadcastingDispatcher.dispatch(BroadcastingDispatcher.java:112)
 в org.springframework.integration.channel.AbstractSubscribableChannel.Отправьте (AbstractSubscribableChannel.java:77)
в org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)
 в org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:128)
в org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288)
 в org.springframework.integration.core.MessagingTemplate.send(MessagingTemplate.java:149)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.SendMessage(AbstractReplyProducingMessageHandler.java:216)
 в org.springframework.integration.обработчик.Абстрактныйтреплыпроизводящийmessagehandler.sendReplyMessage(абстрактныйтреплыпроизводящийmessagehandler.java:200)
 в org.springframework.integration.обработчик.Абстрактныйтреплыпроизводящийmessagehandler.produceReply(абстрактныйтреплыпроизводящийmessagehandler.java:165)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.handleResult(AbstractReplyProducingMessageHandler.java:159)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:141)
 в org.springframework.integration.обработчик.AbstractMessageHandler.handleMessage (AbstractMessageHandler.java:73)
 в org.springframework.integration.dispatcher.Одноадресная рассылка.doDispatch(UnicastingDispatcher.java:115)
 в org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:102)
 в org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
в org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)
 в org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:128)
в org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288)
 в org.springframework.integration.core.MessagingTemplate.send(MessagingTemplate.java:149)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.SendMessage(AbstractReplyProducingMessageHandler.java:216)
 в org.springframework.integration.обработчик.Абстрактныйtreplyproducingmessagehandler.sendReplyMessage(абстрактныйtreplyproducingmessagehandler.java:200)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.produceReply(AbstractReplyProducingMessageHandler.java:165)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.handleResult(AbstractReplyProducingMessageHandler.java:159)
 в org.springframework.integration.обработчик.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:141)
 в org.springframework.integration.обработчик.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:73)
в org.springframework.integration.dispatcher.Одноадресная рассылка.doDispatch(UnicastingDispatcher.java:115)
 в org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:102)
 в org.springframework.integration.channel.AbstractSubscribableChannel.Отправьте (AbstractSubscribableChannel.java:77)
в org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)
 в org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:128)
на com.amex.poc.sif.main.TransactionTestApp.main(TransactionTestApp.java:29)
Вызвано: org.springframework.jms.UncategorizedJmsException: исключение без категории возникло во время обработки JMS; вложенным исключением является com.atomikos.jms.AtomikosTransactionRequiredJMSException: для сеанса JMS, который вы используете, требуется контекст транзакции JTA для вызывающего потока, и ни один не был найден.
Пожалуйста, исправьте свой код, чтобы выполнить одно из следующих действий: 
1. запустите транзакцию JTA, если вы хотите, чтобы ваши операции JMS подвергались фиксации / откату JTA, или
2. увеличьте maxPoolSize для AtomikosConnectionFactoryBean, чтобы избежать тайм-аута транзакции во время ожидания соединения, или
3. создайте сеанс без транзакции и выполните подтверждение сеанса самостоятельно, или
4. установите localTransactionMode в значение true, чтобы включить фиксацию / откат на уровне соединения.
 в org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
 в org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java: 169)
в org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:494)
 в org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:566)
 в org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:689)
 в org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:677)
в org.springframework.integration.jms.JmsSendingMessageHandler.send(JmsSendingMessageHandler.java:145)
 в org.springframework.integration.jms.JmsSendingMessageHandler.handleMessageInternal(JmsSendingMessageHandler.java:112)
 в org.springframework.integration.обработчик.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:73)
... еще 45
Вызвано: com.atomikos.jms.AtomikosTransactionRequiredJMSException: для сеанса JMS, который вы используете, требуется контекст транзакции JTA для вызывающего потока, и ни один не был найден.
Пожалуйста, исправьте свой код, чтобы выполнить одно из следующих действий: 
1. запустите транзакцию JTA, если вы хотите, чтобы ваши операции JMS подвергались фиксации / откату JTA, или
2. увеличьте maxPoolSize для AtomikosConnectionFactoryBean, чтобы избежать тайм-аута транзакции во время ожидания соединения, или
3. создайте сеанс без транзакции и выполните подтверждение сеанса самостоятельно, или
4. установите localTransactionMode в значение true, чтобы включить фиксацию / откат на уровне соединения.
 в com.atomikos.jms.AtomikosTransactionRequiredJMSException.throwAtomikosTransactionRequiredJMSException(AtomikosTransactionRequiredJMSException.java:40 )
в com.atomikos.jms.ConsumerProducerSupport.enlist(ConsumerProducerSupport.java:112)
 в com.atomikos.jms.AtomikosJmsMessageProducerProxy.send(AtomikosJmsMessageProducerProxy.java:52)
в com.atomikos.jms.AtomikosJmsMessageProducerProxy.send(AtomikosJmsMessageProducerProxy.java:133)
 в org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:633)
 в org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:604)
 в org.springframework.jms.core.JmsTemplate $ 3.doInJms(JmsTemplate.java:569)
 в org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:491)
 ... 51 больше


Это мой основной метод, с помощью которого я передаю сообщение каналу
************************************************************
 общедоступная статическая пустота main(String[] args) {
конечная строка[] configFiles = {"/META-INF/spring/integration/spring-integration-context-standalone.xml "
 };
 ClassPathXmlApplicationContext контекст =
 новый ClassPathXmlApplicationContext(конфигурационные файлы,TransactionTestApp.class );
 BeanFactoryChannelResolver channelResolver = новый BeanFactoryChannelResolver(контекст);

 // Создайте XML-сообщение в соответствии со схемой сервера
 Строка запроса XML =
 ""
 "Rat123"
  "Финикс, Аризона"
  "";

 // Создать объект сообщения
 //org.springframework.интеграция.Сообщение message =MessageBuilder.withPayload(requestXml).build();
org.springframework.integration.Сообщение message = MessageBuilder.withPayload(requestXml).build();
// Отправить сообщение на входной канал обработчика
org.springframework.integration.Канал MessageChannel = channelResolver.resolveChannelName("inChannel");
 канал.отправить((org.springframework.интеграция.Сообщение) сообщение);

 }

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

1. Вам нужно показать свою конфигурацию интеграции Spring и опубликовать где-нибудь полную трассировку стека. Как вы отправляете данные в исходящую конечную точку jms? Ответ будет зависеть от этой информации.

2. привет, Гэри, как мне отправить конфигурацию Spring? Есть ли на этом сайте место для прикрепления файла

3. Вы можете вставить конфигурацию в свой вопрос или в суть github; трассировка стека (если она большая) должна идти куда-то еще (например, в pastebin).

4. Привет, Гэри, добавлен файл конфигурации Spring и трассировка стека исключений

5. Вы не показали, как сообщения попадают в inChannel — что-то выше по течению, что необходимо для запуска транзакции.

Ответ №1:

Вам необходимо запустить транзакцию.

Вместо того, чтобы просто отправлять сообщение inChannel , рассмотрите возможность использования шлюза обмена сообщениями; аннотируйте его как @Transactional , и платформа запустит транзакцию.

Если вам необходимо отправить на канал, сделайте это в рамках TransactionTemplate.execute() метода.

Редактировать:

Если поток начинается с опрошенного входящего адаптера, отметьте <transactional/> опрашивающий.

Если поток начинается с нетранзакционного адаптера, управляемого сообщениями (например, WS, HTTP), вам необходимо вставить транзакционный шлюз для охвата транзакции…

 public interface TxGate {

    @Transactional
    Message<?> exchange(Message<?> message);
}

<int-ws:inbound-gateway ... requestChannel="startTx" ... />

<int:service-activator input-channel="startTx" ref="txGate" />

<int:gateway id="txGate" request-channel="onward" service=interface="foo.TxGate" />
 
Ошибка при попытке выполнить вышеуказанное
*************************************
15:09:03.664 ИНФОРМАЦИЯ [главная][org.springframework.integration.gateway.GatewayProxyFactoryBean$MethodInvocationGateway] запустил onboardService
15:09:03.664 ИНФОРМАЦИЯ [главная][org.springframework.integration.gateway.GatewayProxyFactoryBean] запущен onboardService
15:09:03.695 ОТЛАДКА [main][org.springframework.integration.util.Метод messagingmethod invokerhelper] [public final void com.sun.proxy.$Proxy21.addAdvice(int,org.aopalliance.aop.Advice) выдает org.springframework.aop.framework .AopConfigException] не подходит для обработки сообщений.
java.lang.Исключение IllegalArgumentException: найдено более одного кандидата на тип параметра: [int] и [org.aopalliance.aop.Advice]
 в org.springframework.util.Assert.isNull(Assert.java:89)
в org.springframework.integration.util.MessagingMethodInvokerHelper$HandlerMethod.setExclusiveTargetParameterType(MessagingMethodInvokerHelper.java:624)
 в org.springframework.integration.util.Messagingmethod invokerhelper$HandlerMethod.generateExpression(messagingmethod invokerhelper.java:558)
 в org.springframework.integration.util.Messagingmethod invokerhelper $HandlerMethod.(Messagingmethod invokerhelper.java: 440)
 в org.springframework.integration.util.MessagingMethodInvokerHelper $ 1.doWith(MessagingMethodInvokerHelper.java:302)
 в org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java: 480)
 в org.springframework.integration.util.MessagingMethodInvokerHelper.findHandlerMethodsForTarget(MessagingMethodInvokerHelper.java:276)
в org.springframework.integration.util.Messagingmethod invokerhelper.(Messagingmethod invokerhelper.java:169)
в org.springframework.integration.util.Messagingmethod invokerhelper.(MessagingMethodInvokerHelper.java:121)
 в org.springframework.integration.util.Messagingmethod invokerhelper.(MessagingMethodInvokerHelper.java:116)
 в org.springframework.integration.обработчик.MethodInvokingMessageProcessor.(MethodInvokingMessageProcessor.java:56)
в org.springframework.integration.обработчик.ServiceActivatingHandler.(ServiceActivatingHandler.java:35)
в org.springframework.integration.config.ServiceActivatorFactoryBean.createMethodInvokingHandler(ServiceActivatorFactoryBean.java:48)
 в org.springframework.integration.config.AbstractStandardMessageHandlerFactoryBean.createHandler(AbstractStandardMessageHandlerFactoryBean.java:72 )
в org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.createHandlerInternal(AbstractSimpleMessageHandlerFactoryBean.java:99 )
в org.springframework.integration.config.AbstractSimpleMessageHandlerFactoryBean.GetObject (AbstractSimpleMessageHandlerFactoryBean.java:81)

Добавление method="exchange" в активатор службы должно решить эту проблему.

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

1. Привет, Гэри, как ты и предлагал, я использовал шлюз, и я должен указать <tx:менеджер транзакций, управляемый аннотациями=»jta.TransactionManager» /> в конфигурации, а затем транзакция прошла успешно. Спасибо за всю вашу помощь!!!!

2. привет, Гэри, вместо основного метода для получения Gatewaybean и запуска транзакции я хочу использовать входящий шлюз ws для приема ввода от пользователя и выполнения тех же шагов (вставка в JMS и DB) как часть транзакции. Не могли бы вы сообщить им, как этого добиться?

3. привет, Гэри, когда я обновил конфигурацию, как вы предложили, я получаю сообщение об ошибке, вставленное в вопрос

4. Я не вижу никаких изменений в вопросе со вчерашнего дня.

5. Я все еще этого не вижу; можете ли вы предоставить ссылку? О, я вижу это; это требовало одобрения.