不能除名资源。它没有在LocalTransactionContainment中进行清理

时间:2015-08-07 14:33:15

标签: java java-ee jms

我有一个单例数据访问类,它在服务开始时初始化。我从QCF获得了QueueConnection,并在初始化时(在构造函数中)存储在DataAccess类中。

我正在为多个传入请求(每秒约30个)使用相同的连接来向MQ发送消息。我在加载测试时遇到了这个异常。

WLTC0011E: Cannot delist Resource. It is not enlisted for cleanup in the LocalTransactionContainment.   
J2CA0031I: Method delist caught java.lang.IllegalStateException: Cannot delist Resource. It is not enlisted for cleanup with this LocalTransactionCoordinator.

J2CA0073E: Unable to delist connection from resource JMS$DBQCF1$JMSManagedConnection@9 from transaction in method localTransactionCommitted due to exception. 
           Initiating destruction of connection. Exception is: javax.resource.ResourceException: delist: caught Exception

这是我的代码,它将消息发送到队列。

public String sendMessage(String reqMsg) throws Exception{
    QueueConnection queueCon = DataAccess.getDataAccess().getQueueCon();
    Queue queue = DataAccess.getDataAccess().getRequestQueue();
    QueueSession session = queueCon.createQueueSession(true,Session.AUTO_ACKNOWLEDGE);
    QueueSender sender = session.createSender(queue);
    TextMessage textMsg = queueSession.createTextMessage();

    textMsg.setText(reqMsg);
    sender.send(textMsg);
    String msgId = textMsg.getJMSMessageID();

    queueSession.commit();

    closeSender(sender);
    closeSession(session);

    return msgId;
}

我试图搜索此异常但我找不到任何内容。有人可以说出它是什么。是因为我正在使用单个QueueConnection吗?

1 个答案:

答案 0 :(得分:0)

实际上我没有找到这个问题的确切原因,但我通过调整Create Queue Session参数来解决这个问题。

我改变了

QueueSession session = queueCon.createQueueSession(true,Session.AUTO_ACKNOWLEDGE);

QueueSession session = queueCon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

然后删除提交。在这之后我从未见过这个例外。

希望这可以帮助那些正在寻找此例外的人。