0

I am trying to call RES server (v 7.1) from EAR deployed on WAS (8.5) instance. I was able to invoke rule server from standalone program and its working without any problems.

However my main problem is to invoke EJB deployed on RES server remotely from another EAR deployed on some other WAS instance. In this case we are not able to look-up the EJB remotely.

As per below thread we should bypass the EJB3 IlrSessionFactory API and should use Java EJB API to look up rule sessions directly.

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

Recommendation from IBM is to use standard java api for ejb lookup or to upgrade to Rule Server 7.5 (latest 8.x).

Code snippet

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

Error

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)
Brett Kail
  • 33,593
  • 2
  • 85
  • 90
Vaibhav
  • 1
  • 1

1 Answers1

0

Check in the SystemOut.log of the RES server what are the binding names for EJBs as it looks like there is no ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote there. Also if you have two servers on the same host under the same name e.g. server1 you may have interoberability issues and need to set JVM property com.ibm.websphere.orb.uniqueServerName to true. For more details check the following page Application access problems

Gas
  • 17,601
  • 4
  • 46
  • 93