欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用glassfish开发ejb3的session bean

程序员文章站 2024-02-22 22:09:46
...
项目结构如下:
[img]/upload/attachment/123957/78e9cdf6-a1bf-3fd1-8eaa-628420183cde.gif[/img]

HelloWorldClient类是HelloWorld的ejb3客户端调用类
IHelloWorldRemote是接口(两年没做C++,还是喜欢C++的表示法)
HelloWorldBean是IHelloWorldRemote的实现类

所需的jar包如下:
appserv-deployment-client.jar
appserv-ext.jar
appserv-rt.jar
javaee.jar
这些jar包在glassfish_home/lib目录下均可找到

IHelloWorldRemote代码如下:

package my.ejb3.iface;

public interface IHelloWorldRemote
{
public String sayHello();
}

HelloWorldBean代码如下:

package my.ejb3.impl;

import javax.ejb.Remote;
import javax.ejb.Stateless;

import my.ejb3.iface.IHelloWorldRemote;

@Stateless(mappedName="HelloWorldBean")
@Remote(IHelloWorldRemote.class)
public class HelloWorldBean implements IHelloWorldRemote
{

public String sayHello()
{
return "Hey, Hello World!";
}

}

@Stateless标签表明这个类是一个无状态会话Bean,mappedName最好设置,理由后面解释
@Remote(IHelloWorldRemote.class)表明IHelloWorldRemote接口是一个远程接口,只能以远程方式来访问

至此,一个简单的EJB3会话Bean已完成,打包helloworld.jar
打开glassfish web控制台,部署helloworld.jar至“EJB模块”

HelloWorldBean的客户端调用代码:

import ... //此处省略

public class HelloWorldClient
{
public static void main(String[] args)
{
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

try
{
InitialContext ctx = new InitialContext(props);
IHelloWorldRemote helloWorld = (IHelloWorldRemote)ctx.lookup("HelloWorldBean");
String result = helloWorld.sayHello();
System.out.println(result);
}
catch (NamingException e)
{
e.printStackTrace();
}
}
}

当然这里由于glassfish是在本机所以Host设置为localhost,如果非本地,请改为对应IP
glassfish的EJB端口默认为3700,如果安装过程有改动,请改为对应端口

如果顺利的话,控制台将打印出:
Hey, Hello World!

如果客户端和服务器是在同一台机器上,客户端的调用代码可以简化为:

public class HelloWorldClient
{
public static void main(String[] args)
{
try
{
InitialContext ctx = new InitialContext();
IHelloWorldRemote helloWorld = (IHelloWorldRemote)ctx.lookup("HelloWorldBean");
String result = helloWorld.sayHello();
System.out.println(result);
}
catch (NamingException e)
{
e.printStackTrace();
}
}
}

这是因为InitialContext默认会读取jndi.properties文件,而appserv-rt.jar包中提供了一个这样的jndi.properties文件。另外,Host默认是localhost,端口默认是3700。

至此,一个HelloWorld的EJB3无状态会话Bean已完成。


注意:
mappedName就是在InitialContext lookup时使用的名称。
如果我们不设置这个mappedName,那么部署后的EJB名称是什么呢?在jboss中将会是HelloWorldBean/remote,而在glassfish中将使用IHelloWorldRemote接口的全名,即my.ejb3.iface.IHelloWorldRemote(注意是接口的全名)。为了去掉这些不必要的麻烦,建议设置mappedName。


glassfish上开发ejb的一些参考资料:
[url]http://groups.google.com/group/glassfish_china/web/ejb[/url]
[url]https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#SessionBeanGlobalJNDINameAssignment[/url]