EJB服务开发完毕后,可以打包为*.jar,并部署到应用服务器,如JBoss AS 7或WildFlly AS 10,供EJB客户端程序调用。
EJB客户端程序是调用服务器上部署的EJB方法的应用。从运行环境的不同,可以将EJB客户端程序分为两大类:
本文主要讨论独立应用作为EJB客户端的调用形式。第二种方式将另有专术。
从编程实现的不同,可以将EJB客户端分为两大类:
JBoss/WildFly服务器专有的访问API,调用远程EJB无需JNDI API,本文不讨论。
这是最通用的访问远程EJB的做法。首先通过JDNI查找EJB的代理,并通过代理调用远程EJB的方法。
JNDI调用远程EJB的具体实现方法如下:
1. 无论采用哪种方法,由于JBoss AS 7/WildFly AS 8-10都进行安全检查,所以首先要在EJB服务器上设置有效的用户/密码,如通过执行add-user.sh脚本等,此处略。
2. 此外,无论采用哪种方法,都需要在EJB客户端程序的执行环境classpath中有jboss-ejb-client.properties文件,必须将jboss-ejb-client.properties文件加入到classpath中,客户端才能够成功调用远程EJB的方法。即时jboss-ejb-client.properties文件的内容为空,也必须有。
调用部署在JBoss AS 7中的EJB方法时,jboss-ejb-client.properties文件的内容如下:
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=10.20.30.40 remote.connection.default.port = 4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connection.default.username=appuser remote.connection.default.password=apppassword
调用部署在WildFly AS 7中的EJB方法时,jboss-ejb-client.properties文件的内容如下:
endpoint.name=client-endpoint remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=10.20.30.40 remote.connection.default.port=8080 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connection.default.username=appuser remote.connection.default.password=apppassword
4. 设置JNDI上下文参数
JNDI上下文的参数与使用的远程JNDI类型相关。具体可以分为http-remoting方式和ejb方式2种。
举例说明如下:
http-remoting方式
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); props.put(Context.PROVIDER_URL, "http-remoting://localhost:8080"); props.put("jboss.naming.client.ejb.context", true); String fullEJBName = "CustomView/ToolsCommonEJB//ToolsCommonBean!com.jdsu.netcomplete.common.framework.toolscommon.ToolsCommonRemote";
ejb方式
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); String fullEJBName = "ejb:CustomView/ToolsCommonEJB//ToolsCommonBean!com.jdsu.netcomplete.common.framework.toolscommon.ToolsCommonRemote";
public class ToolsCommonEjbTest { private static IToolsCommon remote; @Before public void setUp() throws Exception { Properties props = new Properties(); props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); Context ic = new InitialContext(props); String fullEJBName = "ejb:CustomView/ToolsCommonEJB//ToolsCommonBean!com.jdsu.netcomplete.common.framework.toolscommon.ToolsCommonRemote"; remote = (IToolsCommon) ic.lookup( fullEJBName ); } @Test public void sendMessage() { ... try { remote.sendAlertMessage(userList, "Hi"); } catch( Exception e ) { e.printStackTrace(); fail( "Message not Sent" ); } } ... }