jboss - JBoss EAP 7.1:如何忽略不相关的资源引用
问题描述
注意:这是对旧 JBoss 5.1/6.0 中解决方案适用的以下问题的跟进:https ://developer.jboss.org/thread/160804 。在 JBoss EAP 7.1 中它似乎不再起作用了。
我们已经为多个应用服务器构建了一个应用程序。在其 web 模块 web.xml 中,它包含对 commonj TimerManager 和 WorkManager 的 2 个资源引用(用于 WebLogic 和 WebSphere):
<resource-ref>
<res-ref-name>wm/WM1</res-ref-name>
<res-type>commonj.work.WorkManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
<res-ref-name>tm/TM1</res-ref-name>
<res-type>commonj.timers.TimerManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
这当然不适用于 JBoss 并导致
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.subunit."APP.ear"."mod.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."APP.ear"."mod.war".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of subdeployment "mod.war" of deployment "APP.ear"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:172)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:2032)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1955)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEE0027: Could not load commonj.work.WorkManager referenced in env-entry
at org.jboss.as.ee.component.deployers.ResourceReferenceProcessor.getResourceRefEntries(ResourceReferenceProcessor.java:153)
at org.jboss.as.ee.component.deployers.ResourceReferenceProcessor.processDescriptorEntries(ResourceReferenceProcessor.java:74)
at org.jboss.as.ee.component.deployers.AbstractDeploymentDescriptorBindingsProcessor.deploy(AbstractDeploymentDescriptorBindingsProcessor.java:95)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:165)
... 5 more
Caused by: java.lang.ClassNotFoundException: commonj.work.WorkManager from [Module "deployment.APP.ear.mod.war" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:412)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:400)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
at org.jboss.as.ee.component.deployers.ResourceReferenceProcessor.getResourceRefEntries(ResourceReferenceProcessor.java:151)
... 8 more
不幸的是,CommonJ 规范需要这些资源引用,因此我不能只删除它们并使用直接 JNDI 查找这些资源。基于上述链接线程https://developer.jboss.org/thread/160804中的建议,我因此尝试使用以下 jboss-web.xml,为每个条目添加一些虚拟 JNDI 名称,尤其是“忽略依赖”:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_7_2.xsd"
version="7.2">
<context-root>mod</context-root>
<resource-ref>
<res-ref-name>wm/WM1</res-ref-name>
<jndi-name>DummyWorkManager</jndi-name>
<ignore-dependency/>
</resource-ref>
<resource-ref>
<res-ref-name>tm/TM1</res-ref-name>
<jndi-name>DummyTimerManager</jndi-name>
<ignore-dependency/>
</resource-ref>
</jboss-web>
然而这并没有改变什么,部署的异常仍然是一样的。因此,我尝试向 jboss-web.xml 添加一些虚拟 res-type - 任何会成功的东西,例如
<res-type>javax.resource.Referenceable</res-type>
我将它添加到工作管理器和计时器管理器条目中,但是它似乎只对工作管理器有帮助,因为异常从
java.lang.ClassNotFoundException: commonj.work.WorkManager
至
java.lang.ClassNotFoundException: commonj.timers.TimerManager
而其他一切都是一样的。为了至少暂时解决这个问题,我在 web.xml 中注释掉了计时器管理器条目并让事情继续进行。然而,这最终得到了:
ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([("deployment" => "APP.ear")]) - failure description: {
"WFLYCTL0412: Required services that are not installed:" => ["jboss.naming.context.java.module.app-name.mod-name.env.DummyWorkManager"],
"WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.naming.context.java.module.app-name.mod-name.env.wm.WM1 is missing [jboss.naming.context.java.module.app-name.mod-name.env.DummyWorkManager]"]
}
这意味着即使忽略依赖也不起作用。
总结一下:
- 覆盖 jboss-web.xml 中的资源引用似乎无法正常工作(我只能为工作管理器资源引用成功地做到这一点,但不能为计时器管理器之一)
- jboss-web.xml 中资源引用中的忽略依赖项也
不起作用
在当前的 JBoss EAP/WildFly 版本中这是正确的行为吗?那么如何让 JBoss/WildFly 成功忽略一些不相关的资源引用呢?
注意:我不会以任何方式在 JBoss 中使用这些资源,这不是问题(它们实际上只在 WebLogic 或 WebSphere 中使用)。问题只是使应用程序部署成功。
编辑:由于似乎没有人能够提供任何答案,我为此创建了一个 JIRA 问题:https ://issues.jboss.org/browse/JBEAP-15758
解决方案
推荐阅读
- c# - 如何定义一个自定义 getter,它使用从同一类的另一个接口显式定义的字段?
- html - 如何让这些 id 标签正确设置样式?
- python - 如何修改我的垃圾箱包装算法,以使一件物品不会被分配到多个垃圾箱?
- c++ - 将最高有效设置位以下的所有位归零的最有效方法是什么?
- graph-algorithm - 当 RRT 用于没有解决方案的配置空间时会发生什么?
- c# - 如何在 SQLite 查询中使用变量?
- text - 没有使用 cypress 获取文本内容
- python - 获得浮点数的最快方法是什么
- python - 如何在没有 GUI 应用程序的情况下在 Python 中固化 3D STL 文件(例如:Blender、MeshLab 等)
- spring - 需要一个监听器类来处理 Spring 流应用程序中发生的 RabbitMQ 通道关闭异常