使用ejb将WAS连接到JRules



我正试图从部署在WAS(8.5)实例上的EAR调用RES服务器(v7.1)。我能够从独立程序中调用规则服务器,它的工作没有任何问题。

然而,我的主要问题是从部署在其他WAS实例上的另一个EAR远程调用部署在RES服务器上的EJB。在这种情况下,我们无法远程查找EJB。

根据下面的线程,我们应该绕过EJB3 IlrSessionFactory API,并且应该使用JavaEJB API来直接查找规则会话。

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

IBM建议使用标准的javaapi进行ejb查找,或者升级到RuleServer7.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)

检查RES服务器的SystemOut.log,EJB的绑定名称是什么,因为那里看起来没有ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote。此外,如果同一主机上有两台服务器,名称相同,例如server1,则可能存在互操作性问题,需要将JVM属性com.ibm.websphere.orb.uniqueServerName设置为true。有关更多详细信息,请查看以下页面应用程序访问问题

相关内容

  • 没有找到相关文章

最新更新