第一,EJBClient不能为javafx项目,因为会导致
java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
无解
第二,引入gf-client.jar和jndi-properties.jar的时候,不能将其拷贝出来,必须放在原位置,因为这两个文件还引用了glassfish其他的文件,如果移动位置,会导致错误
这里有个题外话,如果发布项目不可能带一个glassfish吧,其实我测试过,只有glassfish的lib文件夹和modules文件夹有用,其他文件夹都可以删除,这两个文件夹100M
其实里面大多数都没用,但是因为我只测试了jdni,如果需要其他东西的话,比如JPA,那么乱删一通可能就会出现问题,还是先保留
第三,使用jdni的客户端必须具备查找接口的class或者java文件,这里netbeans做了优化,简化了操作,当创建一个远程接口的时候,必须让你制定一个应用程序客户端,这样,EJB引用这个应用程序的jar,这样,方便了来回拷来拷去,client这边一保存,那边同步修改,
第四,远程访问的问题,windows的ejb client访问部署在windows上的ejb没有问题,linux上的client访问windows上部署的ejb没有问题,但是windows访问linux上部署的ejb就会出现错误,程序卡死不动,其实这个和查找不到对象是一个现象,可以将其IP或端口修改到一个不存在的地址,现象和windows client上访问linux上部署ejb一样,都是卡死不动,
这个问题我弄了两天,在国内的论坛上见到有人描述了这个现象,但是没有提出解决方案,最后在老外的一篇帖子上找到了解决方案,综合两篇帖子,虽然不能完全明白,但是也可以解决这个问题了,这里说一个现象,就是在winows上部署一个ejb在linux上部署一个ejb,先开启linux glassfish,关闭windows glassfish,用windows ejb client访问linux ejb,这时你会发现无法访问,程序卡死在那里,这时,开启windows上的glassfish,会发现,程序开始向下执行了,所以,不是windows上的glassfish自己访问自己,是在linux那里饶了一个圈又回来了,这个问题我也没想清楚,但是解决这个问题很简单,就是在glassfish的控制台上的server-config:ORB->IIOP->orb-listener-1的IP地址修改为本机IP地址即可,注意:localhost和127.0.0.1都不行,另外default-config不需要修改。
至此,EJB Client应该就可以远程访问EJB了,这里说下题外话,为什么需要用EJB Client:虽然现在B/S架构能解决大多数问题,但是,浏览器毕竟权限太低,如果要对本地文件进行操作的话,最好还是用client形式,毕竟自由得多。
最后,给出一个EJB Client访问部署在glassfish上的remote EJB的源代码
try {
// TODO code application logic here
Properties props=new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");//glassfish专用字符串JBOSS和此不同
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
// props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");//IP
// props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");//PORT
InitialContext ctx = new InitialContext(props);
Object sss= ctx.lookup("java:global/ApplicationEJB/CallEJB");
JOptionPane.showMessageDialog(null,"ok");
} catch (NamingException ex) {
JOptionPane.showMessageDialog(null,"error");
Logger.getLogger(JavaFXApplication1.class.getName()).log(Level.SEVERE, null, ex);
}