1.将EJB项目导出成jar文件, 在客户端,需要包含该jar包。(Build path)
2. 服务器jboss as 7 的使用,与原来的jboss GA 5(我曾经使用过的)在远程调用ejb时的不同。(个人观点)
step 1:编写session bean, 在bean实现类上头使用标签@Remote(remote-interface-name.class),暴露出远程调用的接口类
step 2:使用jndi远程调用session bean 接口类
(1)无状态session bean的调用
RemoteStatelessBean lookupRemoteStatelessBean() throws NamingException{
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
final Context context=new InitialContext(jndiProperties);
//app name 是已部署为EAR的EJB应用程序的名字。不包含后缀.ear
//这个名字通过已经部署到服务器端的EJB应用程序里头的application.xml可以修改
//因为没有部署成ear文件,所以 app name 为空
final String appName="";
//module name 是已部署为JAR的EJB应用程序的名字。不包含后缀.jar
//这个名字通过已经部署到服务器端的EJB应用程序里头的ejb-jar.xml可以修改
//这里假设我们把EJB项目部署为叫做jboss-as-remote-app.jar
final String moduleName="jboss-as-remote-app";
//AS 7允许每个部署应用有一个唯一的名称,这边我们没有进行指定,为空
final String distinctName="";
//EJB的名字默认是实现类的简单名字,就是不包含包名,假设为StatelessBean
final beanName=StatelessBean.class.getSimpleName();
//远程调用的接口类的完整名称 包名.类名,假设为:RemoteStatelessBean
final String viewClassName=RemoteStatelessBean.class.getName();
//查找
return (RemoteStatelessBean)context.lookup("ejb:"
+ appName +
"/"
+ moduleName +
"/"
+ distinctName +
"/"
+ beanName +
"!"
+ viewClassName
);
}
(1)有状态session bean的调用,与无状态差不多,只是需要加上?stateful这个查询有状态会话bean的声明
RemoteStatelessBean lookupRemoteStatelessBean() throws NamingException{
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
final Context context=new InitialContext(jndiProperties);
//app name 是已部署为EAR的EJB应用程序的名字。不包含后缀.ear
//这个名字通过已经部署到服务器端的EJB应用程序里头的application.xml可以修改
//因为没有部署成ear文件,所以 app name 为空
final String appName="";
//module name 是已部署为JAR的EJB应用程序的名字。不包含后缀.jar
//这个名字通过已经部署到服务器端的EJB应用程序里头的ejb-jar.xml可以修改
//这里假设我们把EJB项目部署为叫做jboss-as-remote-app.jar
final String moduleName="jboss-as-remote-app";
//AS 7允许每个部署应用有一个唯一的名称,这边我们没有进行指定,为空
final String distinctName="";
//EJB的名字默认是实现类的简单名字,就是不包含包名,假设为StatelessBean
final beanName=StatelessBean.class.getSimpleName();
//远程调用的接口类的完整名称 包名.类名,假设为:RemoteStatelessBean
final String viewClassName=RemoteStatelessBean.class.getName();
//查找
return (RemoteStatelessBean)context.lookup("ejb:"
+ appName +
"/"
+ moduleName +
"/"
+ distinctName +
"/"
+ beanName +
"!"
+ viewClassName+"?stateful"
);
}
endpoint.name=client-endpoint
// 我们在前面提到,在EJB调用时,EJB接受者会和服务器进行通信。实际上,他们使用JBOSS远程工程实现通信。endpoint.name表示的是所创建的客户端的名称 。可选的,不是必须的。如果在jboss-ejb-client.properties文件中没有指名,默认为"config-based-ejb-client-endpoint"(我的测试结果是,如果没有这一项,会有异常)
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=
false
remote.connections=
default
remote.connection.
default
.host=
localhost
remote.connection.
default
.port =
4447
//默认情况下,AS7使用4447作为远程调用的端口
remote.connection.
default
.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=
false
remote.connection.
default
.username=appuser
remote.connection.
default
.password=apppassword