我希望在主机Foo
中有一个bean A
,它由@EJB
注释注入主机Bar
中的bean B
。
这两个主机都是Glassfish-v3
的独立实例
在阅读Glassfish
文档时,我发现了很多信息,其中一些听起来有点矛盾
我知道每个bean都有一个名为分配给它的全局jndi,并理解它是如何构造的,What is the syntax for portable global JNDI names?。我也理解Foo
中Bar
的声明应该属于这种类型(假设FooRemote
是Foo
和fooejb
的远程业务接口,其模块):@EJB(lookup=java:global/fooejb/FooRemote) FooRemote foo
,这基于this
我无法理解的是我告诉主持人A
和主持人B
相互了解的地方。
我看到了许多应用程序客户端和应用程序服务器的示例,但我无法找到这种情况的示例
在this question中提到sun-web.xml
和Global-JNDI
,但我认为它不是EJB3.1(因为它不是Portable JNDI
)而且我不明白这个{{1}应该驻留(如果可以,我想避免它。)
它主要有两种不同的方式:
sun-web.xml
和C
用于不同目的的第三个主机A
。我有一种强烈的感觉,我在这里缺少一些基本的东西,我非常感谢指出我所缺少的东西。
顺便说一句,我想尽可能避免使用描述符文件等,并将大部分信息留在注释中,只留下主机ip来配置服务器。
修改
我认为这个问题的另一个有趣的方面是如何在这方面使用负载平衡,即假设我有B
和A1
服务器是相同的,如何进行负载平衡相对于将请求从A2
路由到B
或A1
EDIT2:
我认为可能与ejb 3.1无关,但与如何启用两个应用程序服务器以查看彼此的jndi注册表有关。我认为这与ejb 3.1无关,因为3.0中存在类似的问题A2
不可移动的jndi。
我想在每个应用服务器中的一些配置将允许我配置它应该查询jndi远程bean的其他“邻居”。
希望能给那里的人一个线索。
谢谢,
以太
答案 0 :(得分:3)
关于EJB负载平衡,您可能希望看一下这个博客:
http://www.techpost.info/2010/12/ejb-load-balancer_7304.html
答案 1 :(得分:2)
答案 2 :(得分:0)
我们正在使用远程EJB,它工作正常。
首先,你需要“Host A”上的EJB,它实现了一个接口,它的类存在于两个主机上。
//For host A + B
public interface FooClass {
public void theMethod();
}
//Only for host A
@Stateless
public class FooClassImpl implements FooClass {
public void theMethod(){//Code goes here}
}
然后,您需要在WEB-INF目录中创建(在主机B上)glassfish-web.xml,您可以在其中指定远程EJB所在的位置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
<ejb-ref>
<ejb-ref-name>RemoteEJBName</ejb-ref-name>
<jndi-name>corbaname:iiop:<servername or IP>:3700#java:global/<projectname>/FooClassImpl!com.test.foo.FooClass</jndi-name>
</ejb-ref>
</glassfish-web-app>
在Host B上的注入点,您需要像这样注入EJB:
@EJB(name = "RemoteEJBName")
private FooClass theFooClassInstance;
我希望这会成功。