标签:
在本篇文章中你将了解到如何使用JBOSS7开发出一个简单的EJB应用以及在这个过程中遇到的问题。
MyEclipse10
JBOSS7
JDK1.8.0
首先了解一下JBOSS7的目录结构,和之前的版本不一样
在 JBoss 7 中,文件系统分为两部分:
1. 独立服务器standalone
2. 域服务器domain (这是 JBoss 7 首次引入的) — 用于统一的管理多个实例
bin: 包含启动的脚本,用来启动独立服务器(如果使用独立实例的话)或者域(使用域服务器)
docs: 包含服务器文档,有两个子目录,分别是 licenses (licenses.xml 和相关内容) 和 Schema (配置所使用的 .xsd 文件)
domain: 包含域结构,有子目录组成:configuration (包含域的配置文件), data (包含已发布模块的内容文件夹), lib(用于支持 Java EE 扩展) tmp (临时目录).
standalone: 结构和 Domain 文件夹相同
modules: 因为 JBoss 7 是一个模块化的服务器,应用服务器的模块对应这里的一个子目录。
package com.tgb.ejb;
public interface FirstEjb {
String saySomething(String name);
}
package com.tgb.ejb;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote
public class FirstEjbBean implements FirstEjb {
@Override
public String saySomething(String name) {
// TODO Auto-generated method stub
return "你好"+name;
}
}
上面的注解表示是无状态的会话Bean(@Stateless)以及要通过远程方式调用(@Remote)。
在FirstEjb上右击,选择Export,并打包到ejb_01_client项目中
jar包在jboss安装路径下的bin\client中jboss-client.jar
package com.tgb.ejb;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
public class FirstEjbClient {
public static void main(String[] args)throws Exception{
//JBOSS6,7之前
/*InitialContext context=new InitialContext();
FirstEjb firstEjb=(FirstEjb)context.lookup("FirstEjbBean/remote");
String s=firstEjb.saySomething("许晨阳");
System.out.println(s);*/
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");//让JNDI API知道是由谁来管理我们用来查找JNDI 名字的命名空间的。
final Context context = new InitialContext(jndiProperties);
//appName 和 moduleName分别就打包的格式而定
//如果是.ear就是appName,其它的是moduleName(.jar,.war)
final String appName = "";
final String moduleName = "ejb_01";
final String distinctName = "";
//实现类名
final String beanName = "FirstEjbBean";
System.out.println(beanName);
//接口类名
final String viewClassName = FirstEjb.class.getName();
System.out.println(viewClassName);
String jndi = "ejb:" + appName + "/" + moduleName + "/"
+ distinctName + "/" + beanName + "!" + viewClassName;
System.out.println(jndi);
FirstEjb firstEjb = (FirstEjb) context.lookup(jndi);
String s= firstEjb.saySomething("许晨阳");
System.out.println(s);
}
}
告诉客户端EJB在哪
endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=127.0.0.1
remote.connection.default.port = 4448
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.username=sa
remote.connection.default.password=sa
1.在jboss-ejb-client.properties中配置host和port
remote.connection.default.host=127.0.0.1
remote.connection.default.port = 4448
开始host的配的是“localhost”,结果运行客户端报错:
WARN: Could not register a EJB receiver for connection to remote:localhost
所以改成了“127.0.0.1”;端口号要根据JBOSS的standalone.xml文件中的配置,默认是4447,我的改成了4448。
在这个过程中发现自己对standalone中的一些配置不是很清楚。可参考一下JBoss配置指南(三)
2.客户端代码中appName等的含义
appName:如果部署到服务器的是一个.ear包,那么app-name就为除去后缀.ear之后的包名。如果部署的是.war包或普通的.jar包,那么appName留空即可,我自己这个工程是以.jar包部署的,所以appName为空。
moduleName:此处就是部署到服务器上.war包或.jar包的名字,注意,moduleName不能为空。
distinctName:这是一个可选的用于指定在JBoss AS7上具体的部署配置的一个参数名,不需要使用的话,留空即可,此处我们留空。
beanName:这是我们要使用lookup查找获取的Bean,这个项目中为FirstEjbBean,即FirstEjb的实现Bean,无需全限定类名,beanName不能为空。
最后我们拼接处的路径是
ejb:/ejb_01//FirstEjbBean!com.tgb.ejb.FirstEjb
如果是有状态的EJB,那么拼接的字符串后面还要加上“?stateful”。
【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用
标签:
原文地址:http://blog.csdn.net/u010924834/article/details/51114428