最近还是在做平台项目,遇到了很多问题,接下来会用几篇博客来分享一下这些问题和解决方法。
首先要说的就是通过Spring管理JNDI来调用EJB。
在开始之初,由于没有看重功能实现,所以就在web端中简单的配置了一下Spring管理JNDI 来调用EJB的配置,而且还会调用成功了。
具体的配置如下:
<bean name="addFunctionAction"
class="com.tgb.collegeplatform.function.addfunction.action.AddFunctionAction"
scope="prototype">
<property name="commonAddBean" ref="commonAddBean"></property>
</bean>
<bean id="commonAddBean" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="common_AddBean/remote"></property>
</bean>
能够从上面的配置看出来,首先Action实例化的时候要注入一个CommonAddBean对象,而CommonAddBean对象是通过JndiObjectFactoryBean对象通过JNDI查找Common_AddBean/remote来找到的ejb对象。
这样会调通是因为这个EJB对象是在本地,而JNDI调用的时候是需要有property的,如果没有配置property的话,也就是默认在的在localhost上来查找。所以会调用成功。
随后,由于开发战友反映JBoss开发重启问题太影响开发效率,所以我就开始做demo,将后台的公共的EJB对象部署到另一台机器上,而这样减轻JBoss启动时候的负载量,或者可以Web端直接用Tomcat开发。
所以写Demo的时候就发现我这里的配置文件是有问题,因为仅仅能够调用localhost的,所以需要多加配置。经过学习并且修改,配置为下面的:
<!-- Spring管理Struts2的Action -->
<bean name="modifyRoleAction"
class="com.tgb.collegeplatform.role.modifyrole.action.ModifyRoleAction"
scope="prototype">
<property name="commonTreeModelQueryBean" ref="commonTreeModelQueryBean"></property>
<property name="commonQueryBean" ref="commonQueryBean"></property>
<property name="commonModifyBean" ref="commonModifyBean"></property>
</bean>
<bean id="commonTreeModelQueryBean" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="common_TreeModelQueryBean/remote"></property>
<property name="jndiEnvironment">
<props>
<prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
<prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>
<!-- <propkey="java.naming.factory.url.pkg">org.jboss.naming</prop>-->
<prop key="java.naming.provider.url">192.168.24.40:1099</prop>
</props>
</property>
</bean>
之后就要验证这个配置的正确性,需要启动Web来测试。
启动之后,就遇到了另外一个问题:javax.naming.CommunicationException Root exceptionis java.rmi.UnknownHostException: Unknown host,分析这个问题,首先应该考虑到的是这个问题一定是出现在服务器,也就是192.168.24.40的机器。
上网搜索了一下问题的解决方法,网上说是JBosss服务器启动时,指定了-b 0.0.0.0 导致出现这个问题。解决方法为run -b 0.0.0.0 -Djava.rmi.server.hostname=你的Ip地址 -Dremoting.bind_by_host=false
之后在在40机器上启动jboss之后添加了上面的参数,之后再调用的时候上面的问题就不出现了。但是又报了另外一个错误,错误很低级了,是没有将pageModel和TreeModel序列号的问题。这个也是以前没有发现的,因为这个jar以前在localhost调用的时候不会出现问题,但是移到远端就出现问题了,这个很好理解。解决方法就是在这两个类上实现序列号接口。在之后又报了另外一个错误,是没有发现org.hibernate.collection.PersistentSet类的异常,因为我使用的Tomcat调用的,所以断定是lib包的问题,就没有再解决(因为我知道在后面还会出现这个问题,到时候一并解决),开始着手部署linux系统把底层的JBoss服务器搭建起来。
这样就算解决了Spring管理JNDI 调用EJB的问题。
其实往往问题的出现是连锁的,需要的是能够从问题中找到问题源头,如何解决问题的本领。还有就是对问题要有预见性,要知道哪里是存在隐患的,要越早的发现问题并且将问题解决掉是非常重要的。