EJB远程调用

时间:2017-03-17 11:43:40

标签: java java-ee ejb-3.1 wildfly-10

我在调用远程EJB时遇到了麻烦:我第一次必须这样做而且我可能会遗漏一些东西。我已经在网上阅读了很多教程,在SO上有几个答案,但我无法解决。这就是我迄今为止所做的。

我的情景是:

我在EAR Wildfly 10.0.0.Finalserver-ear下部署了两个client-ear

server-ear我有server-apiserver-ejb,第一个是包含EJB接口的简单Java模块,第二个是{{} 1}}包含实现的模块。

那些将是

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

至于那些模块的相互依赖性(我使用Maven):

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

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

我错过了什么或做错了什么?

1 个答案:

答案 0 :(得分: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