Weblogic EJB3的开发部署现在网上的例子很多,也都简单明了,这里就不详细说明了。本文主要记录我在开发ejb时遇到的问题及解决方案。希望对大家有帮助。
EJB的概念网上五花八门的,对于我这种初学者是在不好理解,经过查阅资料,总结出EJB的概念如下,仅供参考:
EJB是一个可重用、可移植的J2EE组件,它的作用是把你编写的软件中的那些需要执行特定任务的类不放到客户端软件上,而是打包(一般为jar包)放到一个服务器上。还有更详细的介绍可参考《EJB到底是什么,真的那么神秘吗?? 》这篇博文写的很透彻
1、EJB3与EJB2的区别。
我是从EJB3开始接触EJB的,由于原系统使用EJB2,所以我也查阅了一下资料,发现有以下几个不同:
1. EJB2使用EntityBeans来访问数据库,EJB3是使用JPA来访问数据库
2. EJB2有部署脚本,EJB3没有
3. EJB3不需要Home接口,EJB2需要
4. EJB3简化了开发,引入元数据。
EJB3的开发真的简单了不少,下面我们从一个小例子开始演示:
2、EJB3开发
注意在本地测试时要引入weblogic相关包,此处引用的是wlfullclient.jar
(1) 开发远程接口RemoteInface.java
package com.css.sword.ejb;
/**
* <p>Title:RemoteInface</p>
* <p>Description: 远程接口</p>
* @author yuanxj
* @date 2016-3-8
*/
public interface RemoteInface {
public String sayHello(String str);
}
(2) 远程接口实现类RemoteServer.java
package com.css.sword.ejb;
import javax.ejb.Remote;
import javax.ejb.Stateless;
/**
* <p>Title:RemoteServer</p>
* <p>Description: </p>
* @author yuanxj
* @date 2016-3-8
*/
@Remote
@Stateless(mappedName="Remote")
public class RemoteServer implements RemoteInface {
/* (non-Javadoc)
* <p>Title:sayHello</p>
* <p>Description:</p>
* @param str
* @return
* @see com.css.sword.ejb.RemoteInface#sayHello(java.lang.String)
*/
@Override
public String sayHello(String str) {
// TODO Auto-generated method stub
System.out.println("接收到的信息为:"+str);
return str;
}
}
很简单吧,这里有几个要说明的地方:
[@Stateless(mappedName = “Remote”)]:Bean类映射的名称,它决定了你访问它的JNDI是[Remote#com.css.sword.ejb.RemoteInface],#后面是接口的全称。如果你想查看你的JNDI,可以在Weblogic控制台中查看服务器的JNDI树。这是EJB默认命名方式,还可以通过配置文件来更改jndi名,稍后会进行讲解。
[@Remote]:表示实现了远程接口。有了这段,你下面的部分可以写成[public class RemoteServer implements RemoteInface]
关于远程接口和本地接口:
两种接口主要是性能上的差别。本地接口传的是地址,访问速度快,不用事先序列化。远程接口相对慢些。所以在远程调用上尽量减少方法调用,并尽量使用粗粒度的接口,尽量在一次方法调用中传输完成所需要的数据。
(3) 客户端测试类EjbClient.java:
/**
*
*/
package com.css.sword.ejb;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
* <p>Title:EjbClient</p>
* <p>Description: </p>
* @author yuanxj
* @date 2016-3-9
*/
public class EjbClient {
public static void main(String[] args){
String connectFactory = "weblogic.jndi.WLInitialContextFactory";
String url = "t3://localhost:8100";
try {
Hashtable<Object,Object> env = new Hashtable<Object,Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY, connectFactory);
env.put(Context.PROVIDER_URL,url);
Context ctx =new InitialContext(env);
RemoteInface inface = (RemoteInface) ctx.lookup("Remote#com.css.sword.ejb.RemoteInface");
System.out.println(inface.sayHello("你好,世界"));
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、EJB部署
将编写的服务器端的接口和实现类打成jar包部署到Weblogic中。可独立部署,也可随应用一起部署。部署成功后运行客户端,得到如下结果:
4、配置
Weblogic会把某个会话bean的远程业务接口映射到全局JNDI树,提供了两种可选方法。
- 使用@stateless或@stateful标注的mappedName元素
- 在weblogic-ejb-jar.xml部署描述符文件中指定映射
第一种方法是默认的名称,上面已经介绍,在jndi树上可以看到以下结果:
下面介绍第二种方法。如果想用配置文件来发布ejb,则需要将ejb-jar.xml和weblogic-ejb-jar.xml和远程接口及实现类一起打包。其中ejb-jar.xml是ejb描述文件。目录结构如下:
ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
<enterprise-beans>
<session>
<ejb-name>EjbServer</ejb-name>
<business-remote>com.css.sword.ejb.RemoteInface</business-remote>
<ejb-class>com.css.sword.ejb.EjbServer</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
weblogic-ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>EjbServer</ejb-name>
<enable-call-by-reference>true</enable-call-by-reference>
<stateless-session-descriptor>
<business-interface-jndi-name-map>
<business-remote>com.css.sword.ejb.RemoteInface</business-remote>
<jndi-name>Romate.EjbServer</jndi-name>
</business-interface-jndi-name-map>
</stateless-session-descriptor>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
这里面中的看Romate.EjbServer,此时我将jndi名改为Romate.EjbServer,打开控制台的jndi树,可以看到如下结果:
可以看出配置文件优先级高于默认。
还有一种情况,以应用方式发布的话,application中指定了EJB模块,应用目录结构如下图:
application.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN'
'http://java.sun.com/dtd/application_1_3.dtd'>
<application>
<display-name>platform</display-name>
<module>
<ejb>ejbdir</ejb>
</module>
</application>
这里指定ejb模块为ejbdir,即ejbdir中的描述文件为我们需要的描述文件,为了和原来ejb包中的描述文件区分开,这里将jndi名改为Romate.esb.EjbServer,如下图:
此时我们再次启动weblogic来观察ejb名称: