JBOSS AS 7 客户端使用JNDI远程调用EJB Bean (方式之一)

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");

}

step 3:配置客户端context properties: jboss-ejb-client.properties (翻译)
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.connectionprovider.create.options这个前缀可以用来传递创建处理远程协议的连接提供者的一些设置选项。
这边用来传递org.xnio.Options.SSL_ENABLED这一选项
remote.connections=default
 //设置于远程服务器的通信连接,使用一串用逗号隔开的连接名称作为值
//例如:remote.connections=one, two
创建了两个连接,名称分别是one 和 two。每个连接映射到一个EJB 接受者。并且每个连接都会配置为以下的属性
使用remote.connection.<连接名称>的前缀去设置属性
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
//这边使用的username 和password必须使用命令 bin/add-user.sh(或者.bat)设置
在7.1.0.FINAL里面security-realm是默认使用的,如果不需要远程安全,可以删除配置文件standalone*.xml或者domain.xml中的security-realm属性

默认情况下,EJB客户端代码会在classpath中搜寻jboss-ejb-client.properties文件。也可以指定一个其他的客户端属性配置文件,可以通过设置"jboss.ejb.client.properties.file.path"来指定文件系统中的文件
例子: "-D jboss.ejb.client.properties.file.path=/home/me/my-client/custom-jboss-ejb-client.properties"

总结:
1.服务器端:部署EJBs,并且要暴露出远程调用的接口
2.客户端:
  在classpath中有一个 jboss-ejb-client.properties文件,用来建立服务器连接的信息。
  有一个jndi.properties文件指定java.naming.factory.url.pkgs属性或者直接代码中通过InitialContext 的构造函数参数
   配置客户端的build path,包含jboss-client jar包(在AS7 中只要一个jboss-client-7.1.0.Final.jar(在jboss-as-7.1.0.Final\bin\client目录下))和EJB的jar包

更详细的信息:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值