未能将MDB链接到Wildfly 10.x上的入站资源适配器-部署失败



我在github上编程了一个简单的tcp入站资源适配器(RA)作为示例项目,并成功地将其部署到具有独立完整配置的wildfly 10.x上。消息监听器TcpMessageListener接口位于RA中,在RA.xml描述符中定义,但我无法将消息驱动的bean(MDB)连接到它。RA的eis端正常工作,我可以通过telnet将消息连接/发送到它。当我尝试使用wildfly maven插件部署MDB时,MDB找不到TcpMessageListener,我得到了java.lang.NoClassDefFoundError:

WARN  [org.jboss.modules] (MSC service thread 1-7) Failed to define class de.bitc.ejb.InboundEventHandler in Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
.
.
.
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC000001: Failed to start service jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of subdeployment "ra-user-ejb-0.0.1-SNAPSHOT.jar" of deployment "ra-ear.ear"
.
.
.
Caused by: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener
.
.
.
ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 17) WFLYCTL0013: Operation ("add") failed - address: ([("deployment" => "ra-ear.ear")]) - failure description: {
"WFLYCTL0080: Failed services" => {"jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of subdeployment "ra-user-ejb-0.0.1-SNAPSHOT.jar" of deployment "ra-ear.ear"
Caused by: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener"},
"WFLYCTL0412: Required services that are not installed:" => ["jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE"],
"WFLYCTL0180: Services with missing/unavailable dependencies" => undefined

ejb maven子模块中的依赖项在provided范围内。我随后部署了RA——红帽子向导。我还在ejb子模块中切换了从提供到编译的资源适配器的maven依赖关系。在这种情况下,我得到了以下错误

[ERROR] Caused by: java.lang.IllegalStateException: WFLYEJB0383: No message listener of type de.bitc.jca.inflow.TcpMessageListener found in resource adapter tcp-eis.rar"},
"WFLYCTL0412: Required services that are not installed:" => ["jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar ".component.InboundEventHandler.CREATE"],
"WFLYCTL0180: Services with missing/unavailable dependencies" => undefined}}}

这是MDB

package de.bitc.ejb;
import java.util.logging.Logger;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import org.jboss.ejb3.annotation.ResourceAdapter;
import de.bitc.jca.inflow.TcpMessageListener;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = "topic",  propertyValue = "test")
} //, messageListenerInterface = TcpMessageListener.class
)
@ResourceAdapter(value="tcp-eis.rar")
public class InboundEventHandler implements TcpMessageListener {
/** The logger */
private static Logger log = Logger.getLogger(InboundEventHandler.class.getName());
/**
* Default constructor.
*/
public InboundEventHandler() {
// TODO Auto-generated constructor stub
}
/**
* @see TcpMessageListener#onMessage(String)
*/
@Override
public void onMessage(String msg) {
// TODO Auto-generated method stub
}
}

这是TcpListenerInterface

package de.bitc.jca.inflow;
/**
* TcpMessageListener
*
* @version $Revision: $ 
*/
public interface TcpMessageListener {
/**
* Receive message
* 
* @param msg
*            String.
*/
public void onMessage(String msg);
}

以下是jboss_cli 中资源适配器的设置

/subsystem=resource-adapters/resource-adapter=tcp-eis.rar:read-resource(recursive=true)
{
outcome => success,
result => {
archive => tcp-eis.rar,
beanvalidationgroups => undefined,
bootstrap-context => undefined,
config-properties => undefined,
module => undefined,
statistics-enabled => false,
transaction-support => XATransaction,
wm-security => false,
wm-security-default-groups => undefined,
wm-security-default-principal => undefined,
wm-security-domain => other,
wm-security-mapping-groups => undefined,
wm-security-mapping-required => false,
wm-security-mapping-users => undefined,
admin-objects => undefined,
connection-definitions => undefined
}
}

我的问题是,部署中是否缺少MDB查找资源适配器的步骤。我想这是用@ResourceAdapter注释完成的吗?我需要定义一个队列吗?关于入站资源适配器的资源非常罕见,最常见的例子是出站资源适配器。提前谢谢。

上面链接的入站ra示例托管在github上。我在github项目的README.md中描述了构建和运行它的所有步骤。我想为其他有同样问题的人提供这些例子来查找文档。

我解决了类加载NoClassDefFoundError: Failed to link的错误,现在运行的示例回答了许多悬而未决的问题。我把所有的细节都放在我的例子上。入站资源适配器现在作为wildfly 10(WF10)上ear归档中的子部署运行。我使用IronJacamarcodegenerator生成了入站资源适配器。我在示例中描述了如何构建和运行的所有步骤。

主要错误是,我没有在ear归档中使用jboss-deployment-structure描述符,并且在ear档案中使用了对资源适配器api的maven依赖。我在测试时把依赖项放在耳朵里,然后忘记了。

<?xml version="1.0" encoding="UTF-8"?>  
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">  
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>  
<sub-deployment name="ra-user-ejb.jar">  
<dependencies>  
<module name="deployment.ra-ear.ear.tcp-eis.rar"  export="true" />  
</dependencies>  
</sub-deployment>  
</jboss-deployment-structure>

以下是我最大的嵌入入站RA的答案,可以稍微解决文档泄漏问题:

  • 不需要ra.xml描述符,ra类中的@Connector注释就足够了
  • WF10中不需要额外的配置。没有队列、standallone-full.xml修改或jndi之类的东西。使用wildfly maven插件进行简单部署即可工作
  • 现在工作的资源适配器在WF10中没有显示为资源适配器。这使我感到困惑,使我的研究变得非常困难
  • 不需要jboss-ejb3.xml描述符。@ResourceAdapter(value="ra-ear.ear#tcp-eis.rar")就足够了。请注意,这是一个jboss注释,而不是ee7。因此,在例如websphere或tomee的情况下,您找不到任何资源

在接下来的几天里,我将把示例资源适配器扩展到一个完整的ee7应用程序,并希望这个示例能帮助其他人完成入站资源适配器文档。

最新更新