gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:04:16 25 4
gpt4 key购买 nike

我将一个简单的 TCP 入站资源适配器 (RA) 编程为 example project在 github 上,并使用独立完整配置成功将其部署到 wildfly 10.x。消息监听器 TcpMessageListener 接口(interface)位于 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 redhat guide 。我还在 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 注释完成的?我需要定义一个队列什么的吗?有关入站资源适配器的资源非常少,最多的例子是出站资源适配器。提前致谢。

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

最佳答案

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

主要错误在于,我没有在ear存档中使用jboss-deployment-struct描述符以及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-plugin 进行简单部署即可工作。
  • 当前工作的资源适配器未在 WF10 中显示为资源适配器。这让我很困惑,也让我的研究变得非常困难。
  • 不需要jboss-ejb3.xml描述符。 @ResourceAdapter(value="ra-ear.ear#tcp-eis.rar") 就足够了。注意,这是 jboss 注释,而不是 ee7。所以你找不到任何资源,例如。 websphere 或 tomee。

我将在接下来的几天内将示例资源适配器扩展为完整的 ee7 应用程序,并希望此示例可以帮助其他人度过入站资源适配器文档 hell 。

关于java - 无法将 MDB 链接到 Wildfly 10.x 上的入站资源适配器 - 部署失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46607966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com