glassfishv2中ejb的定义与调用

Posted on 2010-03-06 21:08 terryxue 阅读(2612) 评论(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