EJB访问方式分为远程客户端访问、本地客户端访问和WebService客户端。
所谓的EJB的远程调用是说客户端与服务端的EJB对象不在同一个JVM进程中。
本地客户端是说客户端与服务端的EJB对象在同一个JVM进程中。
WebService客户端可以访问无状态会话Bean的接口,只有在业务逻辑方法被标识为@WebMethod的时候,webService客户端才可以访问到。
远程调用
在没有远程调用的时候,我们需要用到别人的数据了,就直接把别人的接口和实现都拿过来了,接着打到自己的包中,这样做一方面来说是造成了代码的冗余,自己的包会很大,另一方面这样也不是远程调用。
接下来我们改进,改成远程调用,直接调用别人的接口就可以操作了。这样的好处是针对接口编程,结构清晰,很灵活。
客户端配置:
1、当然需要调用的EJB的BEAN必须是远程的:
@Stateless(name="ClassEao")
@Remote(ClassEao.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ClassEaoImpl extends ExamBase<Class> implements ClassEao {
}
我们在EAO的实现上加远程的注解。
2、我们注入Bean的时候需要用远程的JNDI,在自己的web层spring-mvc.xml里面配置,即
<jee:jndi-lookup id="SchoolTeachingBean"
jndi-name="ejb:itoo-basic-schoolteaching-ear/itoo-basic-schoolteaching-core-0.0.1-SNAPSHOT/SchoolTeachingBeanImpl!com.tgb.itoo.basic.service.SchoolTeachingBean"
environment-ref="evn">
</jee:jndi-lookup>
注意上面的jndi-name,我们的项目是打成了一个ear包,并且去掉了ear的版本号:
<build>
<finalName>${project.artifactId}</finalName>
</build>
同时在applicationContext-common.xml里面配置如下:
<util:properties id="evn"
location="classpath:config/jboss-ejb-client.properties"></util:properties>
这样的目的是通过evn找到相应的JBOSS的配置,也就是需要远程调用的JBOSS的ip,端口号,用户名和密码。
3、在自己的Web层添加配置文件jboss-ejb-client.properties
endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
org.jboss.ejb.client.scoped.context=true
jboss.naming.client.ejb.context=true
Context.URL_PKG_PREFIXES=org.jboss.ejb.client.naming
javax.naming.Context.INITIAL_CONTEXT_FACTORY=org.jboss.naming.remote.client.InitialContextFactory
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connectionprovider.create.options.org.xnio.Options.SSL_STARTTLS=false
jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
remote.connections=one
remote.connection.one.host=192.*.*.*
remote.connection.one.port=4447
remote.connection.one.username=adminks
remote.connection.one.password=!adminks123
主要是配置IP和端口号以及需要远程调用的JBOSS的账户名和密码,同时我们还可以在JBOSS中配置多个远程调用的接口。
4、最后一步,在自己的ear包里面加入jboss-deployment-structure.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<sub-deployment name="itoo-assess-studentassess-web-0.0.1-SNAPSHOT.war">
<dependencies>
<module name="org.jboss.xnio" />
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
因为现在用的JBOSS版本是eap 6.2 相比较以前的版本加入了模块的概念(用到才被加载),加入以上配置是为了找到war包里面jndi的配置。
总结:
上面主要介绍了EJB远程调用的客户端的配置,主要是因为现在JBOSS提升版本后,突出的一点是JBOSS的模块化,也是因为这个又爱又恨的模块化出了一系列的问题,解决了一系列的问题。下篇博客继续说远程调用JBOSS的配置。