3.2.10.2. 用 JNDI 远程调用 Session Bean
这个任务描述了如何为远程客户添加支持以使用 JNDI 调用 Session Bean。这个任务假设该项目是用 Maven 构建的。
ejb-remote Quickstart 包含了演示这个功能的 Maven 项目。这个 Quickstart 包含了要部署的 Session Bean 和远程客户项目。下面的代码示例是从远程客户端程序抽取的。
这个任务假设 Session Bean 不要求进行验证。
警告
Red Hat 推荐您在所有受影响的软件包里显性地禁用 TLSv1.1 或 TLSv1.2 上的 SSL。
先决条件
在开始之前,下列预备条件必须被满足:
- 您必须有一个可用的 Maven 项目。
- 已经添加了用于 JBoss EAP 6 Maven Repository 的配置。
- 已经部署了您要调用的 Session Bean。
- 部署的 Session Bean 实现了远程商业接口。
- Session Bean 的远程商业接口作为 Maven 依赖关系可用。如果远程商业接口只作为 JAR 文件可用,那么我们推荐您将 JAR 添加到 Maven 库作为 artifact 使用。请参考 http://maven.apache.org/plugins/maven-install-plugin/usage.html 里的
install:install-file说明。 - 您需要知道这个 session bean 所在的服务器的主机名和 JNDI 端口号。
要从远程客户调用 session bean,您首先必须正确配置这个项目。
过程 3.22. 为 session bean 的远程商业接口添加 Maven 项目依赖关系。
添加所需的项目依赖关系
必须更新项目的pom.xml以包含必要的依赖关系。添加
jboss-ejb-client.properties文件JBoss EJB 客户 API 期望在项目根目录找到名为jboss-ejb-client.properties的文件,它包含 JNDI 服务的连接信息。添加这个文件到项目的src/main/resources/目录并包含下列内容。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您的服务器来修改主机名和端口号。4447是默认的端口号码。对于安全的连接,请将SSL_ENABLED一行设置为true并取消SSL_STARTTLS行的注释。容器里的 Remoting 接口支持使用相同端口的安全和不安全的连接。为远程商业接口添加依赖关系
在pom.xml里为 session bean 的远程商业接口添加 Maven 依赖关系。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
现在已经正确配置了这个项目,您可以添加代码来访问并调用 session bean。
过程 3.23. 用 JNDI 获取 Bean 代理并调用 Bean 的方法
处理 checked 异常
下面代码里的两个方法 (InitialContext()和lookup()) 都会抛出类型为javax.naming.NamingException的 checked 异常。这些方法调用必须包括在捕获NamingException的 try/catch 块里,或者是再声明抛出NamingException的方法里。ejb-remotequickstart 使用了第二种方法。创建一个 JNDI 上下文
JNDI 上下文对象提供了从服务器请求资源的机制。请使用下列代码创建 JNDI 上下文:final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);Copy to Clipboard Copied! Toggle word wrap Toggle overflow JNDI 服务的连接属性是从jboss-ejb-client.properties文件里读取的。使用 JNDI Context's lookup() 方法来获取 bean 代理
调用 bean 代理的lookup()方法并将您请求的 session bean 的 JNDI 名称传入。这将返回一个对象,它必须转换为包含您要调用的方法的远程商业接口的类型。final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-ejb-remote-server-side//CalculatorBean!" + RemoteCalculator.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow Session bean 的 JNDI 名称是用特殊语法定义的。详情请参考 第 3.2.10.3 节 “EJB JNDI 命名引用” 。调用方法
现在您已有一个代理 bean 对象,您可以调用远程商业接口里包含的任何方法了。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 代理 bean 将方法调用请求传入服务器上的 session bean。其结果被返回到代理 bean,然后再返回给调用者。代理 bean 和远程 session bean 间的通讯对于调用者来说是透明的。
您现在应该可以配置一个 Maven 项目来支持调用远程服务器上的 session bean 并编写代码,使用通过 JNDI 从服务器获取的代理 bean 来调用 session bean 方法。