There's no need to do anything. When the component receives a transacted exchange, it will resume the thread using the transaction manager. If an exchange is sent while the transaction is active, the autoEnlistInTransactions flag will ensure that the transaction is conveyed by the exchange sent (the transaction will be suspended, handled by the provider and resumed when the sendSync call return). All the needed code is in AsyncBaseLifeCycle [1] and DeliveryChannelImpl [2]
Btw, which EIP endpoint do you use ? [1] http://fisheye3.cenqua.com/browse/servicemix/trunk/common/servicemix-common/src/main/java/org/apache/servicemix/common/AsyncBaseLifeCycle.java?r=484814 [2] http://fisheye3.cenqua.com/browse/servicemix/trunk/core/servicemix-core/src/main/java/org/apache/servicemix/jbi/messaging/DeliveryChannelImpl.java?r=482795 On 12/19/06, macdoor <[EMAIL PROTECTED]> wrote:
r> Yes, I have set the autoEnlistInTransactions="true" flag on the JBI container
. I also and some test code in EIP component (pipeline) and JMS provider component to System.out.println( exchange.isTransacted()) I found in EIP exchange.isTransacted() is true and in next JMS provider exchange.isTransacted() is false. I found in EIP pipeline code http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/main/java/org/apache/servicemix/eip/patterns/Pipeline.java?revision=488681&view=markup /* (non-Javadoc) * @see org.apache.servicemix.eip.EIPEndpoint#processSync(javax.jbi.messaging.MessageExchange) */ protected void processSync(MessageExchange exchange) throws Exception { ... MessageExchange me = getExchangeFactory().createExchange(exchange.getPattern()); (faultsTarget != null ? faultsTarget : target).configureTarget(me, getContext()); MessageUtil.transferToIn(tme.getFault(), me); sendSync(me); It create a new exchange. Shall we set the transactionmanager in the new exchange? gnodet wrote: > > Have you set the autoEnlistInTransactions="true" flag on the JBI container > ? > Else no transaction propagation will occur ... > I'm pondering changing the default value to true ... > > On 12/19/06, macdoor <[EMAIL PROTECTED]> wrote: >> >> I start a transaction with JMS/JCA component, and send the message to an >> EIP >> component, after EIP transaction disappear. Is it the right behavior? >> >> The flow is like this, JMS/JCA->EIP->JMS. There is no transction in last >> JMS >> component. >> >> I read the source >> http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/serviceengines/servicemix-eip/src/main/java/org/apache/servicemix/eip/EIPEndpoint.java?revision=488681&view=markup >> >> public void process(MessageExchange exchange) throws Exception { >> boolean txSync = exchange.isTransacted() && >> Boolean.TRUE.equals(exchange.getProperty(JbiConstants.SEND_SYNC)); >> if (txSync && exchange.getRole() == Role.PROVIDER && >> exchange.getStatus() == ExchangeStatus.ACTIVE) { >> processSync(exchange); >> } else { >> processAsync(exchange); >> } >> } >> >> There is no code to handle transaction. >> >> But in >> http://svn.apache.org/viewvc/incubator/servicemix/trunk/deployables/bindingcomponents/servicemix-jms/src/main/java/org/apache/servicemix/jms/jca/JcaConsumerProcessor.java?revision=478801&view=markup. >> >> public void process(MessageExchange exchange) throws Exception { >> Context context = (Context) >> pendingMessages.remove(exchange.getExchangeId()); >> Message message = (Message) >> context.getProperty(Message.class.getName()); >> Message response = null; >> Connection connection = null; >> try { >> if (exchange.getStatus() == ExchangeStatus.DONE) { >> return; >> } else if (exchange.getStatus() == ExchangeStatus.ERROR) { >> if (endpoint.isRollbackOnError()) { >> TransactionManager tm = (TransactionManager) >> endpoint.getServiceUnit().getComponent().getComponentContext().getTransactionManager(); >> tm.setRollbackOnly(); >> return; >> } else if (exchange instanceof InOnly) { >> log.info("Exchange in error: " + exchange, >> exchange.getError()); >> return; >> } else { >> connection = connectionFactory.createConnection(); >> Session session = connection.createSession(true, >> Session.SESSION_TRANSACTED); >> Exception error = exchange.getError(); >> if (error == null) { >> error = new Exception("Exchange in error"); >> } >> response = session.createObjectMessage(error); >> MessageProducer producer = >> session.createProducer(message.getJMSReplyTo()); >> if (endpoint.isUseMsgIdInResponse()) { >> >> response.setJMSCorrelationID(message.getJMSMessageID()); >> } else { >> >> response.setJMSCorrelationID(message.getJMSCorrelationID()); >> } >> producer.send(response); >> } >> } else { >> connection = connectionFactory.createConnection(); >> Session session = connection.createSession(true, >> Session.SESSION_TRANSACTED); >> response = fromNMSResponse(exchange, context, session); >> if (response != null) { >> MessageProducer producer = >> session.createProducer(message.getJMSReplyTo()); >> if (endpoint.isUseMsgIdInResponse()) { >> >> response.setJMSCorrelationID(message.getJMSMessageID()); >> } else { >> >> response.setJMSCorrelationID(message.getJMSCorrelationID()); >> } >> producer.send(response); >> } >> } >> } finally { >> if (connection != null) { >> connection.close(); >> } >> if (exchange.getStatus() == ExchangeStatus.ACTIVE) { >> exchange.setStatus(ExchangeStatus.DONE); >> channel.send(exchange); >> } >> } >> } >> >> It has code to forward transaction. >> >> Can I add the same code to EIP and let EIP can forward transaction? >> >> >> >> >> >> -- >> View this message in context: >> http://www.nabble.com/Can-I-forward-transaction-with-EIP-component--tf2846280s12049.html#a7948174 >> Sent from the ServiceMix - User mailing list archive at Nabble.com. >> >> > > > -- > Cheers, > Guillaume Nodet > > -- View this message in context: http://www.nabble.com/Can-I-forward-transaction-with-EIP-component--tf2846280s12049.html#a7948441 Sent from the ServiceMix - User mailing list archive at Nabble.com.
-- Cheers, Guillaume Nodet
