You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by gnanda <gi...@phaseforward.com> on 2010/04/20 05:13:33 UTC

smx4:InvalidTransactionException: Specified transaction is already associated with another thread

Hi ,
I am using apache-servicemix-4.0.0. My flow is jms consumer->eip(pipeline)
eip pipeline has a bean class as transformer and http provider as target. I
am starting a transaction in jms consumer. here is my xbean.xml files


	<jms:endpoint id="eipjmsconsumer" 
		service="ec:jms"
		endpoint="jms" 
		targetService="ec:eip" 
		targetEndpoint="eip" 
		role="consumer"
		processorName="jca" 
		defaultMep="http://www.w3.org/2004/08/wsdl/in-only"
		connectionFactory="#connectionFactory"		synchronous="true"
		resourceAdapter="#amqResourceAdapter"
		bootstrapContext="#bootstrapContext"
		rollbackOnError="true">
		<jms:activationSpec>
			<amqra:activationSpec destination="epq1"
				destinationType="javax.jms.Queue" maximumRedeliveries="2"
				initialRedeliveryDelay="10000" useExponentialBackOff="false" />
		</jms:activationSpec>
	</jms:endpoint>
	<bean id="bootstrapContext"
class="org.jencks.factory.BootstrapContextFactoryBean">
		<property name="threadPoolSize" value="15" />
		 <property name="transactionManager" ref="transactionManager"/>
		
	</bean>

	<amqra:resourceAdapter id="amqResourceAdapter"
		serverUrl="tcp://localhost:61616" />


	<bean id="connectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="tcp://localhost:61616" />

	</bean>
	<bean id="transactionManager"
class="org.apache.geronimo.transaction.manager.GeronimoTransactionManager"></bean>
		<!--amq works
	<amq:connectionFactory id="connectionFactory"
		brokerURL="tcp://localhost:61616" />


		JMS ConnectionFactory from JNDI - <bean id="connectionFactory"
		class="org.springframework.jndi.JndiObjectFactoryBean"> <property
		name="jndiName" value="ConnectionFactory" /> </bean>
	-->

</beans>

<eip:pipeline service="ec:eip" endpoint="eip">
    <eip:transformer>
      <eip:exchange-target service="ec:bean" />
    </eip:transformer>
    <eip:target>
      <eip:exchange-target service="ec:http" />
    </eip:target>
  </eip:pipeline>


<bean:endpoint service="ec:bean" endpoint="bean" bean="#myBean"/>

  <bean id="myBean" class="com.pf.eipconsumer.RouterBean"/>

</beans>
<http:endpoint service="ec:http"
                 endpoint="http"
                 role="provider" 
                 locationURI="http://localhost/orderapp/OrderProcess1"
                 defaultMep="http://www.w3.org/2004/08/wsdl/in-out"
                  />             

</beans>

here is my bean class file. In this class file I am parsing soap header to
set the http location URI at run time
public class RouterBean implements MessageExchangeListener {

	@Resource
	private DeliveryChannel channel;
	private static final org.apache.commons.logging.Log log =
org.apache.commons.logging.LogFactory
			.getLog(RouterBean.class);

	public void onMessageExchange(MessageExchange exchange)
			throws MessagingException {
		log.info("Received exchange: " + exchange);
		log.info("Received exchange status: " + exchange.getStatus());
		log.info("Received exchange:properties");
		Iterator<String> iterator2 = exchange.getPropertyNames().iterator();
		while (iterator2.hasNext()) {

			String propName2 = iterator2.next();
			log.info("inside iterator,propName:" + propName2 + ":"
					+ exchange.getProperty(propName2));
		}
		String body = null;
		try {
			if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
				NormalizedMessage message = exchange.getMessage("in");
				Source content = message.getContent();
				log.info("content is:" + content);
				body = (new SourceTransformer()).toString(content);
				log.info("eipConsumer:input message body is:" + body);
				message.setContent(new StringSource(body));
				exchange.setMessage(message, "out");
				String uri = getURIFromMessage(body);
    			log.info("uri is:"+uri);
    		
    			boolean useDynamicUri = true;
    			 if (useDynamicUri) { 
    				  exchange.getMessage("out").setProperty( 
		                      JbiConstants.HTTP_DESTINATION_URI, 
		                      uri); 
    				               }
				
				boolean good = channel.sendSync(exchange);
				log.info("channel send done");
				
			
			//else if(exchange.getStatus() == ExchangeStatus.DONE){
			if(good){
				log.info("inside DONE block");
				exchange.setStatus(ExchangeStatus.DONE);
				channel.send(exchange);
			}
			//else if(exchange.getStatus() == ExchangeStatus.ERROR){
		else{
				log.info("inside ERROR block");
				//Exception ex = new Exception ("ERROR:Fault occurred"+faultbody);
				Exception ex = new Exception ("ERROR:Fault occurred");
				exchange.setError(ex);
				exchange.setStatus(ExchangeStatus.ERROR);
				channel.send(exchange);
			}
		}

		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			log.error("error:", e);
		} finally {

			// exchange.setStatus(ExchangeStatus.DONE);
			// channel.send(exchange);
		}
	}

I am getting exception as below. Please suggest what am I doing wrong here

2010-04-19 22:14:37,078| 22:14:37,078 | INFO  | x-bean-thread-12 |
RouterBean                       | com.pf.eipconsumer.RouterBean      66 |
uri is:http://LPF004689/orderapp/OrderProcess
2010-04-19 22:14:37,078| 22:14:37,078 | ERROR | mix-eip-thread-5 |
EIPComponent                     | icemix.common.AsyncBaseLifeCycle  480 |
Error processing exchange
org.apache.servicemix.jbi.runtime.impl.InOnlyImpl@8d1aa8
javax.jbi.messaging.MessagingException:
javax.transaction.InvalidTransactionException: Specified transaction is
already associated with another thread	at
org.apache.servicemix.common.EndpointDeliveryChannel.resumeTx(EndpointDeliveryChannel.java:137)
	at
org.apache.servicemix.common.EndpointDeliveryChannel.sendSync(EndpointDeliveryChannel.java:118)
	at
org.apache.servicemix.common.endpoints.SimpleEndpoint.sendSync(SimpleEndpoint.java:74)
	at
org.apache.servicemix.eip.patterns.Pipeline.processSync(Pipeline.java:246)
	at org.apache.servicemix.eip.EIPEndpoint.process(EIPEndpoint.java:183)
	at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:627)
	at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:581)
	at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchangeInTx(AsyncBaseLifeCycle.java:478)
	at
org.apache.servicemix.common.AsyncBaseLifeCycle$2.run(AsyncBaseLifeCycle.java:347)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: javax.transaction.InvalidTransactionException: Specified
transaction is already associated with another thread
	at
org.apache.geronimo.transaction.manager.TransactionManagerImpl.associate(TransactionManagerImpl.java:114)
	at
org.apache.geronimo.transaction.manager.TransactionManagerImpl.resume(TransactionManagerImpl.java:183)
	at sun.reflect.GeneratedMethodAccessor110.invoke(Unknown Source)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:64)
	at
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:78)
	at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
	at
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
	at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at
org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
	at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
	at
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
	at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy23.resume(Unknown Source)
	at
org.apache.servicemix.common.EndpointDeliveryChannel.resumeTx(EndpointDeliveryChannel.java:135)
	... 11 more
2010-04-19 22:14:37,078| 22:14:37,078 | ERROR | ix-http-thread-8 |
HttpComponent                    | icemix.common.AsyncBaseLifeCycle  509 |
Transaction is still active after exchange processing. Trying to rollback
transaction.
2010-04-19 22:14:37,078| 22:14:37,078 | ERROR | pool-6-thread-2  |
JcaConsumerProcessor             | mix.jms.jca.JcaConsumerProcessor  117 |
Error while handling jms message
javax.jbi.messaging.MessagingException:
javax.transaction.InvalidTransactionException: Specified transaction is
already associated with another thread
	at
org.apache.servicemix.common.EndpointDeliveryChannel.resumeTx(EndpointDeliveryChannel.java:137)
	at
org.apache.servicemix.common.EndpointDeliveryChannel.sendSync(EndpointDeliveryChannel.java:118)
	at
org.apache.servicemix.jms.jca.JcaConsumerProcessor.onMessage(JcaConsumerProcessor.java:110)
	at org.jencks.XAEndpoint.onMessage(XAEndpoint.java:129)
	at
org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.onMessage(MessageEndpointProxy.java:123)
	at
org.apache.activemq.ra.MessageEndpointProxy.onMessage(MessageEndpointProxy.java:64)
	at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:735)
	at org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:169)
	at
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:290)
	at
org.apache.geronimo.connector.work.pool.NamedRunnable.run(NamedRunnable.java:32)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: javax.transaction.InvalidTransactionException: Specified
transaction is already associated with another thread
	at
org.apache.geronimo.transaction.manager.TransactionManagerImpl.associate(TransactionManagerImpl.java:114)
	at
org.apache.geronimo.transaction.manager.TransactionManagerImpl.resume(TransactionManagerImpl.java:183)
	at sun.reflect.GeneratedMethodAccessor110.invoke(Unknown Source)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:64)
	at
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:78)
	at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
	at
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
	at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at
org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
	at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
	at
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
	at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy23.resume(Unknown Source)
	at
org.apache.servicemix.common.EndpointDeliveryChannel.resumeTx(EndpointDeliveryChannel.java:135)
	... 12 more



-- 
View this message in context: http://old.nabble.com/smx4%3AInvalidTransactionException%3A-Specified-transaction-is-already-associated-with-another-thread-tp28287794p28287794.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.