由于会话已关闭,因此无法提交JMS事务

时间:2012-08-24 08:22:47

标签: java ejb jms ibm-mq mq

3月,我们将websphere mq从版本6更新为7.由于我们每个月都会这样做,因此当我们的应用程序尝试将消息放入MQ队列时,会丢失一个事务。我们收到此错误:

  

[8/1/12 11:37:53:163 MEST] 00000361 LocalTranCoor E WLTC0016E:   资源JMS $ QueueConnectionFactory $ JMSManagedConnection @ 1276失败   去完成。异常堆栈跟踪如下:   javax.transaction.xa.XAException at   com.ibm.ejs.j2c.LocalTransactionWrapper.commit(LocalTransactionWrapper.java:283)     在   com.ibm.ws.LocalTransaction.LocalTranCoordImpl.complete(LocalTranCoordImpl.java:942)     在   com.ibm.ws.LocalTransaction.LocalTranCoordImpl.complete(LocalTranCoordImpl.java:830)     在   com.ibm.ws.LocalTransaction.LocalTranCoordImpl.end(LocalTranCoordImpl.java:1424)     在com.ibm.ejs.csi.TranStrategy.commit(TranStrategy.java:891)at   com.ibm.ejs.csi.TranStrategy.postInvoke(TranStrategy.java:230)at at   com.ibm.ejs.csi.NotSupported.postInvoke(NotSupported.java:133)at at   com.ibm.ejs.csi.TransactionControlImpl.postInvoke(TransactionControlImpl.java:570)     在   com.ibm.ejs.container.EJSContainer.postInvoke(EJSContainer.java:4558)     在com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java:111)     在com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java:136)     在com.ibm.ejs.jms.listener.ServerSession.run(ServerSession.java:567)     在com.ibm.ws.util.ThreadPool $ Worker.run(ThreadPool.java:1604)引起   by:javax.resource.spi.ResourceAdapterInternalException:失败   提交事务   com.ibm.ejs.jms.JMSCMUtils.mapToResourceException(JMSCMUtils.java:176)     在   com.ibm.ejs.jms.JMSManagedSession $ JMSLocalTransaction.commit(JMSManagedSession.java:1209)     在   com.ibm.ejs.j2c.LocalTransactionWrapper.commit(LocalTransactionWrapper.java:263)     ... 12更多引起:   com.ibm.msg.client.jms.DetailedIllegalStateException:JMSCC0020:这个   会议已结束。一个叫做方法的应用程序,一定不能   会议结束后使用。确保会话不是   在调用方法之前关闭。在   sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)     在   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)     在   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)     在   com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:313)     在   com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:388)     在   com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:104)     在   com.ibm.msg.client.jms.internal.State.checkNotClosed(State.java:145)     在   com.ibm.msg.client.jms.internal.JmsSessionImpl.checkNotClosed(JmsSessionImpl.java:2479)     在   com.ibm.msg.client.jms.internal.JmsSessionImpl.commit(JmsSessionImpl.java:516)     在com.ibm.mq.jms.MQSession.commit(MQSession.java:214)at   com.ibm.ejs.jms.JMSManagedSession $ JMSLocalTransaction.commit(JMSManagedSession.java:1203)     ......还有13个。

我们的应用程序不是为处理回滚操作而设计的,因此邮件会丢失。 我想知道自升级以来导致此问题的原因以及我们可以采取的措施。

我们使用的java代码是:

public void sendMessage(QueueConnectionFactory connectionFactory, Queue queue, String text, int priority) throws JMSException{
        QueueConnection connection = null;

        try {   
            connection = connectionFactory.createQueueConnection();
            connection.start();

            QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueSender sender = session.createSender(queue);

            TextMessage message = session.createTextMessage(text);
            sender.send(message);

        } finally {
            if (connection!=null) 
                connection.close();
        }
    }

亲切的问候,

汤姆

0 个答案:

没有答案