Could not enlist in transaction on entering meta-aware objec
s0d0 Nov 23, 2006 4:10 AMHi,
I'm are using Sonic Software JCA Adapter for JBoss.
When I'm trying to create XA Session I got error:
10:57:11,316 ERROR [STDERR] javax.jms.JMSException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: Error enlisting resource in transaction=TransactionImple < jts, afd0212:8c43:456561b4:12 >) 10:57:11,317 ERROR [STDERR] at com.sonicsw.sonicmq.j2ee.jmsra.impl.sonic.SonicXAConnectionAdapter.createXASession(SonicXAConnectionAdapter.java:72) 10:57:11,317 ERROR [STDERR] at fi.logiasoftware.test.MessageSenderBase.openConnection(MessageSenderBase.java:148) 10:57:11,317 ERROR [STDERR] at fi.logiasoftware.test.TestBean.doSomethingElse(TestBean.java:59) 10:57:11,317 ERROR [STDERR] at fi.logiasoftware.test.TestBean.doSomething(TestBean.java:46) 10:57:11,318 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 10:57:11,318 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 10:57:11,319 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 10:57:11,319 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:585) 10:57:11,319 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) 10:57:11,319 ERROR [STDERR] at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) 10:57:11,320 ERROR [STDERR] at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) 10:57:11,320 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,320 ERROR [STDERR] at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) 10:57:11,320 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,320 ERROR [STDERR] at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:46) 10:57:11,321 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,321 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79) 10:57:11,321 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191) 10:57:11,321 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,321 ERROR [STDERR] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76) 10:57:11,322 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,322 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62) 10:57:11,322 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,322 ERROR [STDERR] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) 10:57:11,322 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102) 10:57:11,323 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,323 ERROR [STDERR] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47) 10:57:11,323 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,323 ERROR [STDERR] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) 10:57:11,323 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 10:57:11,325 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:263) 10:57:11,325 ERROR [STDERR] at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106) 10:57:11,326 ERROR [STDERR] at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82) 10:57:11,327 ERROR [STDERR] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828) 10:57:11,327 ERROR [STDERR] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681) 10:57:11,327 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358) 10:57:11,327 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:398) 10:57:11,328 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)
Server hangs (won't shutdown without killing) after this exception.
Here is simple test code:
package fi.logiasoftware.test;
import java.util.HashMap;
import javax.annotation.Resource;
import javax.ejb.EJBException;
import javax.ejb.Init;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.jms.JMSException;
import org.jboss.annotation.ejb.LocalBinding;
import org.jboss.annotation.ejb.RemoteBinding;
import com.sonicsw.sonicmq.j2ee.jmsra.sonicra.SonicConnection;
@Stateless
@RemoteBinding(jndiBinding = "Test")
@LocalBinding(jndiBinding = "TestLocal")
@Remote(Test.class)
@Local(Test.class)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class TestBean extends MessageSenderBase implements Test {
 private @Resource
 javax.ejb.TimerService timerService;
 private void thisWillFail() throws JMSException {
 System.out.println("I will fail");
 throw new JMSException("thisWillFail");
 }
 private void thisWillSucceed() {
 System.out.println("I did succeed");
 }
 public void doSomething() {
 doSomethingElse();
 }
 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
 private void doSomethingElse() {
 SonicConnection conn = null;
 HashMap<Object, Object> m = new HashMap<Object,Object>();
 m.put("property1", "value1");
 try {
 conn = openConnection();
 sendMessage(conn, "Test message", m, "SonicJMS/Queues/Queue20");
 //thisWillFail();
 thisWillSucceed();
 } catch (JMSException e) {
 e.printStackTrace();
 throw new EJBException(e);
 } finally {
 shutdownConnection(conn);
 }
 }
}
package fi.logiasoftware.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import javax.annotation.Resource;
import javax.ejb.EJBException;
import javax.ejb.SessionContext;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.XAConnection;
import javax.jms.XASession;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.log4j.Logger;
import com.sonicsw.sonicmq.j2ee.jmsra.sonicra.SonicConnection;
import com.sonicsw.sonicmq.j2ee.jmsra.sonicra.SonicConnectionFactory;
public class MessageSenderBase {
 private final static String CONNECTION_FACTORY = "java:/SonicJMS/default/XAQueueConnectionFactory";
 public final static int UNKNOWN_TXN_TYPE = -1;
 public final static int XA_TXN_TYPE = 1;
 public final static int NON_XA_TXN_TYPE = 2;
 private int m_txnType = UNKNOWN_TXN_TYPE;
 protected XASession xaSession = null;
 protected Session session = null;
 protected @Resource
 SessionContext sessionCtx;
 Logger logger = Logger
 .getLogger("fi.logiasoftware.messageserver.services.backend.MessageSenderBase");
 public void sendTextMessage(String msg, HashMap properties,
 SonicConnection conn, javax.jms.Destination destination) throws JMSException {
 MessageProducer producer = null;
 producer = session.createProducer(destination);
 TextMessage textMessage = session.createTextMessage();
 textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT);
 textMessage.setJMSExpiration(0);
 textMessage.setBooleanProperty("JMS_SonicMQ_preserveUndelivered", true);
 textMessage.setBooleanProperty("JMS_SonicMQ_notifyUndelivered", true);
 Set set = properties.keySet();
 Iterator it = set.iterator();
 logger.debug("Setting properties");
 while (it.hasNext()) {
 String propertyName = (String) it.next();
 Object o = properties.get(propertyName);
 if (o instanceof String) {
 String propertyValue = (String) properties.get(propertyName);
 textMessage.setStringProperty(propertyName, propertyValue);
 } else if (o instanceof Integer) {
 Integer propertyValue = (Integer) properties.get(propertyName);
 textMessage.setIntProperty(propertyName, propertyValue
 .intValue());
 } else if (o instanceof Boolean) {
 Boolean propertyValue = (Boolean) properties.get(propertyName);
 textMessage.setBooleanProperty(propertyName, propertyValue);
 }
 }
 logger.debug("Setting text");
 textMessage.setText(msg);
 logger.debug("sending message");
 producer.send(textMessage);
 }
 private int getAppServerTxnType() {
 // Only need to determine this once per bean activation. It will not
 // change unless the bean is redeployed with a different deployment
 // descriptor.
 if (sessionCtx != null && m_txnType == UNKNOWN_TXN_TYPE) {
 try {
 sessionCtx.getRollbackOnly();
 m_txnType = XA_TXN_TYPE;
 } catch (IllegalStateException ise) {
 m_txnType = NON_XA_TXN_TYPE;
 }
 }
 return m_txnType;
 }
 private Queue getQueue(String jndiName) {
 try {
 InitialContext iniCtx = new InitialContext();
 Queue q = (Queue) iniCtx.lookup(jndiName);
 return q;
 } catch (NamingException ne) {
 throw new EJBException(ne);
 }
 }
 public void sendMessage(SonicConnection conn, String msg, HashMap properties, String queueName)
 throws JMSException {
 Queue queue = getQueue(queueName);
 sendTextMessage(msg, properties, conn, queue);
 }
 public SonicConnection openConnection() {
 SonicConnection conn = null;
 InitialContext iniCtx = null;
 Object ref = null;
 try {
 iniCtx = new InitialContext();
 ref = iniCtx.lookup(CONNECTION_FACTORY);
 } catch (NamingException e) {
 throw new EJBException(e);
 }
 try {
 SonicConnectionFactory cf = (SonicConnectionFactory) ref;
 conn = (SonicConnection) cf.getConnection();
 conn.start();
 int txnType = getAppServerTxnType();
 logger.debug("Checking server transaction type");
 if (txnType == XA_TXN_TYPE && conn instanceof XAConnection) {
 logger.debug("Creating xasession");
 xaSession = ((XAConnection) conn).createXASession();
 session = xaSession.getSession();
 logger.debug("XAsession created");
 } else {
 // Create the JMS session directly from the connection
 session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
 }
 if (conn == null)
 throw new EJBException("could not connect to JMS queue: "
 + CONNECTION_FACTORY + ", message cannot be sent and will be lost!");
 return conn;
 } catch(JMSException e) {
 e.printStackTrace();
 throw new EJBException(e);
 } finally {
 if(conn != null) {
 try {
 conn.close();
 } catch (JMSException e) {
 e.printStackTrace();
 }
 }
 }
 }
 public void shutdownConnection(SonicConnection conn) {
 Logger logger = Logger
 .getLogger("fi.logiasoftware.messageserver.services.backend.MessageSenderBean");
 if (conn != null) {
 int txnType = getAppServerTxnType();
 try {
 if(session != null)
 session.close();
 if (txnType == XA_TXN_TYPE && conn instanceof XAConnection) {
 if(xaSession != null)
 xaSession.close();
 }
 conn.close();
 } catch (JMSException jmse) {
 logger.warn("Could not close JMS connection. Reason: "
 + jmse.getMessage());
 }
 }
 }
}
 
     
    