glassfishv2中ejb的定義與調用

          Posted on 2010-03-06 21:08 terryxue 閱讀(2639) 評論(2)  編輯  收藏 所屬分類: java
          對EJB有遠程調用和本地調用兩種模式,本地調用需要調用者和布署EJB的容器在同一個JVM中,遠程調用則不管調用者和布署EJB的容器的分布情況,可能是同一個JVM,可能是同一臺電腦上的不同的JVM,也可能是分布在不同的電腦上的JVM。
          下面定義了一個簡單的EJB,并嘗試了在不同環境下的調用。

          1. 定義遠程接口,這樣可以讓EJB實例支持遠程調用

          package testEJB;

          import javax.ejb.Remote;

          @Remote
          public interface HelloRemote {
              
          public String hi();
          }
          2. 實現無狀態會話Bean
          package testEJB;

          import javax.ejb.Stateless;
          @Stateless
          public class Hello implements HelloRemote {
              
          public String hi() {
                  
          return "hello";
              }    
          }

          3. 將以上代碼打包到hello.jar中,然后布署到glassfish中

          4. 在javaSE環境中的調用:
          在JavaSE中的調用顯然屬于遠程調用,相對而言比較麻煩。我們需要導入運行時需要的相關jar包,javaee.jar和appserv-rt.jar,這兩個包可以在glassfish的lib文件夾中找到。
          測試代碼如下:
          public static void main(String args[]){
                   
          try {
                      Properties p 
          = System.getProperties();
                      p.setProperty(
          "org.omg.CORBA.ORBInitialHost""glassfish運行的IP地址");
                      InitialContext ic 
          =new InitialContext();
                      HelloRemote sayhello 
          = (HelloRemote) ic.lookup("java:global/hello/Hello");
                      String result 
          = sayhello.hi();
                      System.out.println(result);
                  } 
          catch (NamingException ex) {
                      ex.printStackTrace();
                  }
              }
          要注意上面lookup方法中的字符串參數“java:global/hello/Hello”,其中hello為模塊名,在這個例子中也就是hello.jar文件名的前一部分,Hello為EJB的名稱。

          5. 在glassfish中的調用:
          a) 假設存在一個web應用與Hello EJB布署在同一個glassfish下,web應用中有一個Servlet要訪問Hello EJB,因為Web應用和Hello EJB是在一個JVM中運行,所以可以用本地調用的方式。
          因為web應用中要使用Hello EJB,所以需要導入hello.jar包。在hello.jar包中有Hello ejb的具體實現,我們需要將導入的hello.jar中的Hello.class刪除,如果不刪除則相當于在web應用中又定義了一個新的無狀態會話Bean。
          Servlet的代碼如下:
          @WebServlet(name="Test", urlPatterns={"/test"})
          public
           class Test extends HttpServlet {
              @EJB
              
          private HelloRemote hello;
             
              
          protected void doGet(HttpServletRequest request, HttpServletResponse response)
              
          throws ServletException, IOException {
                  PrintWriter out = response.getWriter();
                  out.println(hello.getClass().getName());
                  out.flush();
              }
          }
          將此web應用打包成web.war后發布到glassfish中,輸入如下URL:http://localhost:8080/web/test,沒有異常則說明訪問成功。
          注意,如果沒有刪除hello.jar中的Hello.class,web.war將無法成功布署。
          b) 假設web應用與Hello ejb布署在不同的glassfish中,則還需要做一些簡單的配置,以告訴servlet容器如何找到ejb實例。
          修改上面@EJB處的代碼為:
          @EJB(name="hello")
          private HelloRemote hello;
          以上配置了name="hello",這里name的值"hello"為sun-web.xml中配置的ejb引用名。
          修改sun-web.xml,代碼如下:
          <sun-web-app error-url="">
            
          <context-root>/test</context-root>
            
          <ejb-ref>
              
          <ejb-ref-name>hello</ejb-ref-name>
              
          <jndi-name>corbaname:iiop:布署EJB的IP地址:3700#java:global/hello/Hello</jndi-name>
            
          </ejb-ref>
          上面的ejb-ref-name指定了在應用中通過什么名字引用這個ejb。jndi-name指定了ejb的位置,其中最后一段"hello/Hello",指ejb布署在hello.jar中,名稱為Hello。

          6. 其它布署情況
          如果沒有將hello.jar單獨做為ejb應用發布到glassfish中,而是在web應用中通過lib直接引入hello.jar(不刪除其中的Hello.class),那么Hello EJB的全局名稱將與前面討論的不同,假設web應用最終發布為web.war,那么Hello EJB的全局名為java:global/web/Hello,而不是java:global/hello/Hello


          Feedback

          # re: glassfish中ejb的定義與調用  回復  更多評論   

          2010-09-08 19:04 by sfywyq
          你好,我按你每個例子的步驟操作了..當我j2se的客戶端調用時老是報下面的錯:


          java.lang.NullPointerException
          at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297)
          at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
          at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
          at javax.naming.InitialContext.lookup(InitialContext.java:392)
          at com.app.test.HelloWorldTest.main(HelloWorldTest.java:17)
          javax.naming.NamingException: Lookup failed for 'java:global/GlassfishEJB/HelloWorldBean' in SerialContext targetHost=localhost,targetPort=3700 [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext targetHost=localhost,targetPort=3700 [Root exception is java.lang.NullPointerException]]
          at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:442)
          at javax.naming.InitialContext.lookup(InitialContext.java:392)
          at com.app.test.HelloWorldTest.main(HelloWorldTest.java:17)
          Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext targetHost=localhost,targetPort=3700 [Root exception is java.lang.NullPointerException]
          at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:276)
          at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
          ... 2 more
          Caused by: java.lang.NullPointerException
          at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:297)
          at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:271)
          ... 3 more

          能幫忙看下不...69487339 這是我QQ,能加下好友不....

          # re: glassfish中ejb的定義與調用  回復  更多評論   

          2010-10-01 09:14 by 創睿軟件
          應該是沒有導入需要的包。
          glassfishv2和glassfishv3需要導入的包有所不同,本文是針對v2的。

          posts - 9, comments - 24, trackbacks - 0, articles - 0

          Copyright © terryxue

          主站蜘蛛池模板: 泸西县| 韩城市| 宁阳县| 西峡县| 壤塘县| 汝南县| 沁源县| 胶州市| 华宁县| 新竹市| 自治县| 永登县| 乌拉特前旗| 肇州县| 瑞金市| 枣庄市| 平阴县| 义马市| 景德镇市| 安吉县| 家居| 新乐市| 轮台县| 静宁县| 天柱县| 弥渡县| 沙洋县| 二连浩特市| 深泽县| 东安县| 宁陕县| 抚州市| 合江县| 潞城市| 东源县| 江华| 博客| 翼城县| 利津县| 华容县| 遂溪县|