我目前正在尝试使用 IIOP 访问远程 EJB,但无法使其工作。我有两个 EAR 文件,它们在两台不同的机器上运行。两者都使用 Glassfish 4.0 和 Java EE 7。
ExampleEar 中的 EJB ExampleSessionBean2 应该调用 ExampleEar2 中 EJB ExampleSessionBean3 的 printHello() 方法。这些 EJB 的代码及其部署描述符如下:
示例会话Bean2:
@Stateless
@LocalBean
public class ExampleSessionBean2 implements ExampleSessionBean2Interface {
@EJB(lookup="java:comp/env/ejb/ExampleSessionBean3")
ExampleSessionBean3Interface bean;
public ExampleSessionBean2() {
// TODO Auto-generated constructor stub
}
@Override
public void printHello() {
System.out.println("Hello, here Bean2");
bean.printHello();
}
ExampleSessionBean2 ejb-jar.xml:
<display-name>ExampleEJB2</display-name>
<enterprise-beans>
<session>
<ejb-name>ExampleSessionBean2</ejb-name>
<transaction-type>Bean</transaction-type>
<ejb-ref>
<ejb-ref-name>ejb/ExampleSessionBean3</ejb-ref-name>
<remote>bean.ExampleSessionBean3Interface</remote>
</ejb-ref>
</session>
</enterprise-beans>
<ejb-client-jar>ExampleEJB2Client.jar</ejb-client-jar>
ExampleSessionBean2 glassfish-ejb-jar.xml:
<enterprise-beans>
<ejb>
<ejb-name>ExampleSessionBean2</ejb-name>
<ejb-ref>
<ejb-ref-name>ejb/ExampleSessionBean3</ejb-ref-name>
<jndi-name>corbaname:iiop:[IP address]:3700#java:global/ExampleEAR2/ExampleEJB3/ExampleSessionBean3!bean.ExampleSessionBean3Interface</jndi-name>
</ejb-ref>
</ejb>
</enterprise-beans>
示例会话Bean3:
@Stateless(name="ExampleSessionBean3")
@LocalBean
public class ExampleSessionBean3 implements ExampleSessionBean3Interface {
ejb-jar.xml 和 glassfish-ejb-jar.xml 是默认的。
当我调用 ExampleSessionBean2 的方法 printHello() 时,它什么也没发生。Eclipse 中连接的状态栏在某个点停止。但是,没有显示异常。当我在本地使用它时,它可以工作。
此外,我尝试使用设置 -Dorg.omg.CORBA.ORBInitialHost=[IP address] 作为 VM 的参数,但没有改变。
我使用 IIOP 访问远程 EJB 的方式是否正确?注释和描述符的变化对吗?
我还有一个问题,是否还有其他可能让两个不在同一个 Glassfish 集群中的 EJB 进行通信。例如,RessourceAdapters 对此有用吗?还是有其他机制?