首页 > 解决方案 > 入站资源适配器在将第二条消息传递到队列时抛出 WorkException

问题描述

我有一个入站资源适配器,它在 jboss 7.1 EAP 中的子系统 urn:jboss:domain:resource-adapters:5.0 下配置,事务支持设置为 XATransaction。此资源适配器必须侦听 IP 和端口。收到消息后,使用 javax.resource.spi.work.WorkManager 安排工作,在处理消息结束时会将消息传递到配置的 Jboss 队列。仅第一条消息在处理后成功传递到队列,其余消息抛出 WorkException (javax.resource.spi.work.WorkCompletedException: ARJUNA032020: Transaction is completed!, error code: 2)。同一段代码在 Jboss 5.1 GA 和 Jboss 6.3 EAP 中工作。

我尝试在资源适配器子系统中设置其他事务支持类型,如 NoTransaction、LocalTransaction。尝试将 jboss-j2ee jar 从 4.0.4.GA 更新到其他版本,如 4.2.3.GA、wildfly-client-all(版本:7.1.0.GA-redhat-11)。但它没有用。相同的 RA 适配器适用于其他 JBoss 版本,如 5.1 GA 和 6.3 EAP。

PipelineContext 是我们自己的类,其中包含入站侦听器属性,例如主机、RA 必须侦听的端口等。

public class T24Context extends PipelineContext {
private WorkManager workManager = null;                                                     
private XATerminator xaTerminator = null;                                                               
private Map<Integer, ExecutionContext> executionContexts = new HashMap<Integer, ExecutionContext>();
private List<EndpointAdapter> endpoints = new ArrayList<EndpointAdapter>();
}

下面是实际工作管理器调用 startWork() 方法的示例代码,在该方法之前调用 ResourceAdapter.start(),提供的 BootstrapContext 包含设置的 XATerminator。还完成了在 ExecutionContext 中设置的自定义 XID 实现,并将其传递给 WorkManager。

T24Context context = (T24Context) pipelineContext;
WorkManager wm = context.getWorkManager(); 
if (wm != null) {
    ExecutionContext ec = null;
    if (transactionId != null) {
        ec = context.getExecutionContext(channelId);
    }
WorkListener wl = getWorkListener();
wm.startWork(this, WORK_START_TIMEOUT, ec, wl);
} else {
run();
}



@Override
    public void run() {
        try {
            if (_endpoints != null) {
                for (EndpointAdapter adapter : _endpoints) {
                    _response = adapter.process(_activation, _message);
                }    
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Exception in processing request", e);
        }
    }

process 方法将创建一个 MessageEndPoint 像 MessageEndpoint mep = endpointFactory.createEndpoint(null); 然后它将用于调用将消息传递到队列的 MDB。

预期结果是,如果将 10 条消息推送到 TCP 端口,则相同的消息必须通过侦听提到的 TCP 端口的入站资源适配器传递到队列。这发生在 Jboss 5.1 GA 和 6.3 EAP 中,但不在 7.1 EAP 中

实际结果是,在将第一条消息发布到队列后,我们得到了下面提到的异常,其余消息导致相同的错误:

堆栈跟踪 :

javax.resource.spi.work.WorkCompletedException: ARJUNA032020: Transaction is completing!, error code: 2
    at com.arjuna.ats.internal.jbossatx.jta.jca.XATerminator.registerWork(XATerminator.java:107)
    at org.jboss.as.txn.integration.JBossContextXATerminator.registerWork(JBossContextXATerminator.java:103)
    at org.jboss.jca.core.tx.jbossts.XATerminatorImpl.registerWork(XATerminatorImpl.java:102)
    at org.jboss.jca.core.workmanager.WorkWrapper.start(WorkWrapper.java:299)
    at org.jboss.jca.core.workmanager.WorkWrapper.run(WorkWrapper.java:217)
    at org.jboss.threads.SimpleDirectExecutor.execute(SimpleDirectExecutor.java:33)
    at org.jboss.threads.QueueExecutor.runTask(QueueExecutor.java:808)
    at org.jboss.threads.QueueExecutor.access$100(QueueExecutor.java:45)
    at org.jboss.threads.QueueExecutor$Worker.run(QueueExecutor.java:828)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)

标签: nettyjboss7.xexecutorworkmanagersresource-adapter

解决方案


推荐阅读