【问题标题】:EJB, Remoting between two application-servers (glassfish)EJB,两个应用程序服务器之间的远程处理(glassfish)
【发布时间】:2011-03-20 18:37:48
【问题描述】:


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

  1. 没有 -Dorg.omg.CORBA.ORBInitialHost= 参数选项(据我所知)
  2. 当然,任何解决方案都应该允许包含第三个主机 CAB 都可以出于不同目的进行通信。

我有一种强烈的感觉,我在这里遗漏了一些基本的东西,我真的很感激能指出我所遗漏的东西。
顺便说一句,我想尽可能避免使用描述符文件等,并将大部分信息保留在注释上,并且只在服务器中配置主机 ip。

编辑:
我认为这个问题的另一个有趣的方面是如何在这方面使用负载平衡,即假设我有相同的A1A2 服务器,负载平衡将如何从路由请求发生BA1A2

编辑2:
我认为这可能与 ejb 3.1 无关,但与如何使两个应用程序服务器能够看到彼此的 jndi 注册表的基础有关。我认为这与 ejb 3.1 无关,因为在 3.0 中似乎存在类似的问题,Global 不可移植 jndi。
我想每个应用服务器中的一些配置将允许我配置它应该查询哪些其他“邻居”以获取 jndi 远程 bean。
希望能给外面的人一个线索。

谢谢,
伊泰

【问题讨论】:

    标签: java glassfish ejb application-server


    【解决方案1】:

    关于 EJB 负载平衡,您可能想看看这个博客:

    http://www.techpost.info/2010/12/ejb-load-balancer_7304.html

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 感谢您的回答。我没有使用集群;我有两台主机不是同质的(因此不是集群)。您可以将我的问题视为如何在两个集群之间进行连接。跨应用程序是我链接到的东西,但它指的是全局(非便携式)jndi,并且正在使用描述符。简而言之,我在这里没有看到任何新信息:(
      • Vetle Roeim 在 users@glassfish.java.net 上说:“看看这个问题所附的测试用例:java.net/jira/browse/GLASSFISH-15523 这个例子同时使用了查找和注入,但希望你应该能够理解它。” (我还没看)
      • AmanicA,首先谢谢你!从我发布问题到您发布评论之间,我授予您赏金关于它以了解我的问题)。由于它并没有真正回答我的问题,并且为了其他人寻求答案,我将在几天后发布我的解决方案。顺便说一句,我也支持你,因为你确实帮助了我:) 希望这就足够了
      【解决方案3】:

      我们正在使用远程 EJB,它工作正常。

      首先,您需要“主机 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}
      }
      

      然后您需要(在主机 B 上)在您的 WEB-INF 目录中创建一个 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>
      

      在主机 B 的注入点,您需要像这样注入 EJB:

      @EJB(name = "RemoteEJBName")
      private FooClass theFooClassInstance;
      

      我希望这能解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多