Удаленный вызов EJB

У меня проблемы с вызовом удаленного EJB: мне приходится это делать впервые, и я могу что-то упустить. Я прочитал много руководств в Интернете, несколько ответов здесь, на SO, но я не могу решить. Это то, что я сделал до сих пор.

Мой сценарий:

У меня есть два EAR, развернутых под Wildfly 10.0.0.Final: server-ear и client-ear.

В server-ear у меня есть server-api и server-ejb, первый из которых представляет собой простой модуль Java, содержащий мои интерфейсы EJBs, а второй — модуль EJB, содержащий реализации.

Это было бы

@Remote
public interface DummyApi {
    String getSomething();
}

и его реализация

@Stateless
@Remote(DummyApi.class)
public class DummyApiImpl implements DummyApi {
    @Override
    public String getSomething() {
        return "SOMETHING";
    }
}

В client-ear у меня есть простой модуль EJB (client-ejb), определяющий синглтон EJB, который берет ссылку на интерфейс DummyApi:

@javax.ejb.Singleton
public class DummyClient {

    private static final Logger log = LoggerFactory.getLogger(DummyClient.class);

    private @EJB DummyApi dummyApi;

    @PostConstruct
    public void postConstruct() {
        log.debug("***** " + dummyApi.getSomething() + "******");
    }

}

В client-ejb я также поместил файл jboss-ejb-client.properties под src/main/resources

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false

remote.connections=default

remote.connection.default.host=localhost
remote.connection.default.port = 8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

Что касается взаимозависимостей этих модулей (я использую Maven):

server-ear
  |---- server-api [compile]
  |---- server-ejb [compile]
          |-- server-api [provided]

а также

client-ear
  |---- server-api [compile]
  |---- client-ejb [compile]
          |-- server-api [provided]

Оба EAR развернуты на один и тот же локальный Wildfly 10.0.0.Final (чистая установка сервера, никаких настроек). При запуске сервера у меня нет проблем в server-ear.

client-ear вместо этого терпит неудачу со следующим исключением

12:05:22,592 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-5) MSC000001: Failed to start service jboss.deployment.subunit."client-ear-0.0.1-SNAPSHOT.ear"."client-ejb-0.0.1-SNAPSHOT.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.subunit."client-ear-0.0.1-SNAPSHOT.ear"."client-ejb-0.0.1-SNAPSHOT.jar".INSTALL: WFLYSRV0153: Failed to process phase INSTALL of subdeployment "client-ejb-0.0.1-SNAPSHOT.jar" of deployment "client-ear-0.0.1-SNAPSHOT.ear"
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:154)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEE0052: Failed to install component DummyClient
    at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:109)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:147)
    ... 5 more
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0406: No EJB found with interface of type 'com.server.api.DummyApi' for binding com.client.DummyClient/dummyApi
    at org.jboss.as.ejb3.deployment.processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:90)
    at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.processBindings(ComponentInstallProcessor.java:263)
    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:215)
    at org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54)
    at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deployComponent(ComponentInstallProcessor.java:218)
    at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:101)
    ... 6 more

Что я упускаю или делаю неправильно?


person Stefano Cazzola    schedule 17.03.2017    source источник


Ответы (1)


@EJB будет работать, только если bean-компоненты находятся в одном пакете (.ear в вашем случае).

Вам понадобится поиск, используя имя java:app, которое появляется в журнале сервера при запуске. Что-то вроде этого:

DummyApi api = (DummyApi) context.lookup("/server-ear/server-ejb/DummyApiImpl!path.to.DummyApi")

Чтобы создать контекст:

private static Context createContextWildfly(String provider) throws NamingException {
    final Hashtable<String, String> properties = new Hashtable<>();
    properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
    properties.put("jboss.naming.client.ejb.context", "true");  
    properties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
    return new InitialContext(properties);
}

Используя это, вам не нужны jboss-ejb-client.properties

person Gilliard Macedo    schedule 26.03.2017
comment
спасибо большое за ответ, сейчас тестирую. Можете ли вы сказать мне, верна ли иерархия зависимостей, которую я описал в своем вопросе? Мне впервые нужно работать с удаленными EJB, и без какой-либо тщательной документации и руководств я просто пытаюсь угадать множество вещей. - person Stefano Cazzola; 22.04.2017
comment
Да, кажется, у вас правильное строение уха. Только что отредактировал мой ответ с созданием контекста. - person Gilliard Macedo; 24.04.2017
comment
Большое спасибо за помощь! - person Stefano Cazzola; 29.04.2017