我有一个入站资源适配器,它在 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)