Wildfly @Remote интерфейс JNDI поиск между 2 ушами на одном сервере - PullRequest
0 голосов
/ 16 февраля 2020

Я мигрирую Java EE 6 приложение из glassfi sh 3.1.1.2 в WildFly 18.

На сервере развернуто два ушка:

+ CoreEar
    + CoreEjb.jar
+ AppEar
    + AppEjb.jar
    + somewar1.war
    + somewar2.war

В CoreEjbs I У меня есть удаленный интерфейс:

@Remote
public interface ExampleInterface {
    // methods
}

И реализующий компонент:

@Stateless
@LocalBean
public class Example implements ExampleInterface {
    // methods implementation
}

И он используется в AppEjb:

public class SomeManager {
    @EJB
    ExampleInterface injectedBean;
}

Этот код был развернут и отлично работает на glassfi sh. Но он не работает на WildFly 18.

CoreEar развертывается нормально, и в журналах я могу найти информацию о привязках JNDI для сессионного компонента с именем 'Example':

[org.jboss.as.ejb3.deployment] (MSC service thread 1-2) WFLYEJB0473: JNDI bindings for session bean named 'Example' in deployment unit 'subdeployment "CoreEjb.jar" of deployment "CoreEar.ear"' are as follows:
    java:global/CoreEar/CoreEjb/Example!com.company.example.ExampleInterface
    java:app/CoreEjb/Example!com.company.core.ExampleInterface
    java:module/Example!com.company.core.ExampleInterface
    java:jboss/exported/CoreEar/CoreEjb/Example!com.company.core.ExampleInterface
    ejb:CoreEar/CoreEjb/Example!com.company.core.ExampleInterface
    java:global/CoreEar/CoreEjb/Example!com.company.core.Example
    java:app/CoreEjb/Example!com.company.core.Example
    java:module/Example!com.company.core.Example
    ejb:CoreEar/CoreEjb/Example!com.company.core.Example

Но тогда, когда я развернуть AppEar Я получаю исключения:

13:45:38,344 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC000001: Failed to start service jboss.deployment.subunit."AppEar.ear"."AppEjb.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.subunit."AppEar.ear"."AppEjb.jar".INSTALL: WFLYSRV0153: Failed to process phase INSTALL of subdeployment "AppEjb.jar" of deployment "AppEar.ear"
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:183)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1701)
        at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEE0052: Failed to install component SomeManager
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:109)
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:176)
        ... 8 more
    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0406: No EJB found with interface of type 'com.company.core.ExampleInterface' for binding com.company.managers.SomeManager/injectedBean
        at org.jboss.as.ejb3.deployment.processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:90)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.processBindings(ComponentInstallProcessor.java:261)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.access$000(ComponentInstallProcessor.java:80)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor$1.handle(ComponentInstallProcessor.java:213)
        at org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deployComponent(ComponentInstallProcessor.java:216)
        at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:101)
        ... 9 more

Я могу решить это исключение, когда добавляю строку поиска в аннотацию @EJB

@EJB(lookup = "java:app/CoreEjbs/Example!com.company.core.ExampleInterface")
ExampleInterface injectedBean;

Я не знаю, будет ли она развернута, потому что Существуют исключения для поиска других интерфейсов в CoreEjbs.

Проблема заключается в том, что ExampleInterface внедряется во многие другие bean-компоненты, и в CoreEjbs есть интерфейсы, отличные от ExampleInterface, которые также вводятся во многие bean-компоненты.

Объявление поиска во всех местах, где внедряется удаленный @EJB, - большая работа, и в дальнейшем это затруднит изменение реализаций и т. Д. c.

Есть ли способ объявить глобально JNDI-look- имя для каждого случая @EJB ExampleInterface?

Я пробовал кое-что с ejb-jar. xml и jboss-ejb3. xml, но ничего из этого не работало.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Проблема в том, что у вас развернуто 2 EAR, и порядок их развертывания не определен c. Когда ваше приложение запрашивает ejb зависимостей, оно, возможно, не было развернуто, поэтому произошел сбой.

Вы можете потребовать, чтобы некоторые приложения были развернуты до некоторых других приложений через jboss-all.xml. Например, упакуйте в appEar следующее jboss-all.xml:

<jboss umlns="urn:jboss:1.0">
        <jboss-deployment-dependencies xmlns="urn:jboss:deployment-dependencies:1.0">
             <dependency name="coreEar.ear" />
        </jboss-deployment-dependencies>
</jboss>
0 голосов
/ 18 февраля 2020

Мы решаем эту проблему путем создания производителя, а затем просто делаем инъекции. Позволяет разместить JNDI путь в одном месте.

@Remote
public interface ExampleRemote extends Example {
}

public class ExampleProducer {
    @Produces
    @EJB(lookup = "java:global/example/ejb/ExampleEJB!com.example.ExampleRemote")
    private static ExampleRemote exampleRemote;

}

@Inject
private Example example;
...