JBoss EAP 7.1: как игнорировать ненужные ссылки на ресурсы - PullRequest
0 голосов
/ 24 октября 2018

Примечание. Это продолжение следующего вопроса, для которого решение работало на старой версии JBoss 5.1 / 6.0: https://developer.jboss.org/thread/160804. Похоже, оно больше не работает на JBoss EAP 7.1.

Мыполучено приложение, созданное для нескольких серверов приложений.В своем веб-модуле web.xml он содержит 2 ссылки на ресурсы для commonj TimerManager и WorkManager (для использования в 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 для каждой записи и особенно «ignore-зависимости»:

<?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>

Однако это ничего не изменило, исключение при развертывании было тем же.Таким образом, я попытался добавить какой-то фиктивный тип res в jboss-web.xml - что угодно, например,

<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]"]
}

Это означает, что даже зависимость от игнорирования не работает.

Подводя итог:

  • переопределение resource-ref вjboss-web.xml, кажется, не работает должным образом (я мог успешно сделать это только для справки ресурса менеджера работы, но не для справки менеджера таймера)
  • ignore-зависимость в resource-ref в jboss-web.xml также не
    работает

Это правильное поведение в текущих версиях JBoss EAP / WildFly?Как заставить JBoss / WildFly успешно игнорировать некоторые не относящиеся к делу ссылки на ресурсы?

Примечание: я не собираюсь использовать эти ресурсы в JBoss ни в коем случае, это не проблема (они действительно используются тольков WebLogic или WebSphere).Проблема заключается в том, чтобы просто успешно развернуть приложение.

РЕДАКТИРОВАТЬ: Поскольку никто не может дать ответ, я создал проблему JIRA для этого: https://issues.jboss.org/browse/JBEAP-15758

...