Java Wildfly@Remote interface JNDI查找在同一服务器中的两个EAR之间
我正在将JavaEE6应用程序从glassfish 3.1.1.2迁移到WildFly 18 服务器上部署了两个EAR:Java Wildfly@Remote interface JNDI查找在同一服务器中的两个EAR之间,java,jboss,ejb,wildfly,java-ee-6,Java,Jboss,Ejb,Wildfly,Java Ee 6,我正在将JavaEE6应用程序从glassfish 3.1.1.2迁移到WildFly 18 服务器上部署了两个EAR: + CoreEar + CoreEjb.jar + AppEar + AppEjb.jar + somewar1.war + somewar2.war 在CoreEJB中,我有一个远程接口: @Remote public interface ExampleInterface { // methods } 和实现bean: @Stat
+ CoreEar
+ CoreEjb.jar
+ AppEar
+ AppEjb.jar
+ somewar1.war
+ somewar2.war
在CoreEJB中,我有一个远程接口:
@Remote
public interface ExampleInterface {
// methods
}
和实现bean:
@Stateless
@LocalBean
public class Example implements ExampleInterface {
// methods implementation
}
在AppEjb中使用:
public class SomeManager {
@EJB
ExampleInterface injectedBean;
}
这段代码在glassfish上部署并运行良好。但它在WildFly 18上不起作用
CoreEar部署得很好,我可以在日志中找到关于名为“Example”的会话bean的JNDI绑定的信息:
[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
但当我出现部署时,会出现异常:
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;
我不知道它是否会部署,因为在coreejb中查找其他接口时存在异常
问题是ExampleInterface被注入到更多的bean中,CoreEJB中除了ExampleInterface之外还有其他接口也被注入到许多bean中
在注入远程@EJB的每个地方声明查找都是一项艰巨的工作,并且会使以后很难更改实现等
有没有办法为每个@EJBExampleInterface事件全局声明JNDI查找名称
我曾经尝试过ejb-jar.xml和jboss-ejb3.xml,但都没有成功。我们通过创建producer来解决这个问题,然后只进行简单的注入。允许将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;
问题是您部署了两个EAR,它们的部署顺序是不确定的。当您的应用程序请求依赖项ejb时,它可能尚未部署,因此失败 您可以通过
jboss all.xml
要求先部署一些应用程序,然后再部署其他应用程序。例如,将下面的jboss all.xml
打包为:
您是否找到了令人满意的解决方案?我遇到了同样的问题,我所看到的答案都不起作用。