2015-03-02 56 views
0

我想從部署在WAS(8.5)實例上的EAR調用RES服務器(v 7.1)。我能夠從獨立程序調用規則服務器,並且其工作沒有任何問題。將WAS連接到JRules使用ejb

但是,我的主要問題是從部署在其他WAS實例上的另一個EAR遠程調用部署在RES服務器上的EJB。在這種情況下,我們無法遠程查找EJB。

根據以下線程,我們應該繞過EJB3 IlrSessionFactory API,並應使用Java EJB API直接查找規則會話。從IBM

http://www-01.ibm.com/support/docview.wss?uid=swg21586621

的建議是使用標準的Java API的EJB查找或升級到規則服務器7.5(最新8.x的)。

代碼片斷

// Initialization 
       Map<String, Object> outputParms = null; 


       IlrStatelessSession session=null; 
       IlrSessionResponse response=null; 

       // IlrSessionFactory factory = getFactory(); 

       try { 

         sessionFactory = JRulesInvoker.getFactory(); 

         Hashtable<String, String> env = new Hashtable<String, String>(); 
         env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory"); 
         env.put(Context.PROVIDER_URL,"corbaloc:iiop:localhost:28004"); 
         Context ctx = new InitialContext(env); 

         Object lookupResult = ctx.lookup("ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote"); 

         PortableRemoteObject aPortableRemoteObject = new PortableRemoteObject(); 
         session = (IlrStatelessSession) aPortableRemoteObject.narrow(lookupResult, IlrStatelessSession.class); 

         IlrPath path = new IlrPath(ruleApp, ruleSet); 



         IlrSessionRequest request = sessionFactory.createRequest(); 

         request.setRulesetPath(path); 

         request.setInputParameters(inputParms); 


         request.getTraceFilter().setInfoTotalRulesFired(true); 
         request.getTraceFilter().setInfoExecutionEvents(true); 
         request.setTraceEnabled(true); 

         // session = sessionFactory.createStatelessSession(); 
         System.out.println("created session " + IlrJNDIConstants.STATELESS_SESSION_EJB3_NAME); 

         response = session.execute(request); 

         System.out.println(response.getRulesetExecutionTrace().getTotalRulesFired() + " rule(s) fired."); 
         System.out.println("Execution output=" + response.getRulesetExecutionOutput()); 


         // Return the result(s) 
         outputParms = response.getOutputParameters(); 

         if (logger.isEnabledFor(Level.DEBUG)) { 
            if (response.getRulesetExecutionOutput() != null) { 
              logger.debug("RuleSet execution output: \n" + response.getRulesetExecutionOutput()); 
            } 
         } 

       }catch (IlrSessionCreationException cx) { 
         if (logger.isEnabledFor(Level.ERROR)) { 
            logger.error(cx.getMessage(), cx); 
         }   
       } catch (IlrSessionException e) { 
         if (logger.isEnabledFor(Level.ERROR)) { 
            logger.error(e.getMessage(), e); 
         } 
       } catch (NamingException e) { 
         if (logger.isEnabledFor(Level.ERROR)) { 
            logger.error(e.getMessage(), e); 
         } 
       } 

錯誤

Context: idewas/nodes/ide/servers/server1, name: ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote: First component in name ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote not found. 
javax.naming.NameNotFoundException: Context: idewas/nodes/ide/servers/server1, name: ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote: First component in name ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote not found. [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0] 
at com.ibm.ws.naming.jndicos.CNContextImpl.mapNotFoundException(CNContextImpl.java:4563) 
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1821) 
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1776) 
at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1433) 
at com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:615) 
at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:165) 
at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:179) 
at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161) 
at javax.naming.InitialContext.lookup(InitialContext.java:436) 

回答

0

檢查在RES服務器的SystemOut.log什麼是EJB的綁定名稱,因爲它看起來像沒有ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote那裏。同樣,如果您在同一主機上有兩個相同名稱的服務器,例如您可能有可能出現的問題,並需要將JVM屬性com.ibm.websphere.orb.uniqueServerName設置爲true。欲瞭解更多詳情,請查看以下頁面Application access problems