EJB,两个应用程序服务器(glassfish)之间的远程处理

时间:2011-03-20 18:37:49

标签: java glassfish ejb application-server


我希望在主机Foo中有一个bean A,它由@EJB注释注入主机Bar中的bean B
这两个主机都是Glassfish-v3的独立实例 在阅读Glassfish文档时,我发现了很多信息,其中一些听起来有点矛盾 我知道每个bean都有一个名为分配给它的全局jndi,并理解它是如何构造的,What is the syntax for portable global JNDI names?。我也理解FooBar的声明应该属于这种类型(假设FooRemoteFoofooejb的远程业务接口,其模块):@EJB(lookup=java:global/fooejb/FooRemote) FooRemote foo,这基于this 我无法理解的是我告诉主持人A和主持人B相互了解的地方。
我看到了许多应用程序客户端和应用程序服务器的示例,但我无法找到这种情况的示例 在this question中提到sun-web.xmlGlobal-JNDI,但我认为它不是EJB3.1(因为它不是Portable JNDI)而且我不明白这个{{1}应该驻留(如果可以,我想避免它。) 它主要有两种不同的方式:

  1. 没有-Dorg.omg.CORBA.ORBInitialHost = param选项(据我所见)
  2. 任何解决方案当然都应允许包含sun-web.xmlC用于不同目的的第三个主机A
  3. 我有一种强烈的感觉,我在这里缺少一些基本的东西,我非常感谢指出我所缺少的东西。
    顺便说一句,我想尽可能避免使用描述符文件等,并将大部分信息留在注释中,只留下主机ip来配置服务器。

    修改
    我认为这个问题的另一个有趣的方面是如何在这方面使用负载平衡,即假设我有BA1服务器是相同的,如何进行负载平衡相对于将请求从A2路由到BA1

    EDIT2:
    我认为可能与ejb 3.1无关,但与如何启用两个应用程序服务器以查看彼此的jndi注册表有关。我认为这与ejb 3.1无关,因为3.0中存在类似的问题A2不可移动的jndi。 我想在每个应用服务器中的一些配置将允许我配置它应该查询jndi远程bean的其他“邻居”。
    希望能给那里的人一个线索。

    谢谢,
    以太

3 个答案:

答案 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;

我希望这会成功。