1. 程式人生 > >JAVAEE之EJB client訪問remote EJB的幾個注意點

JAVAEE之EJB client訪問remote EJB的幾個注意點

第一,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);
                }