【问题标题】:Connecting WAS to JRules USING ejb使用 ejb 将 WAS 连接到 JRules
【发布时间】:2015-05-02 10:50:13
【问题描述】:

我正在尝试从部署在 WAS (8.5) 实例上的 EAR 调用 RES 服务器 (v 7.1)。我能够从独立程序调用规则服务器并且它的工作没有任何问题。

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

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

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

IBM 的建议是使用标准 java api 进行 ejb 查找或升级到 Rule Server 7.5(最新 8.x)。

代码 sn-p

// 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)

【问题讨论】:

    标签: java websphere ejb-3.0 jrules


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      相关资源
      最近更新 更多