0

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

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

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

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

IBM 的建议是使用标准 java api 进行 ejb 查找或升级到 Rule Server 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)
4

1 回答 1

0

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

于 2015-03-04T09:48:14.190 回答