-1

I want to execute rules on Rule Execution Server from a Java stand-alone client using an EJB3 rule session.

public class TestGameExecute {
public static void main(String[] args) {
    Map<String,Object> inputParameters = new HashMap<String, Object>();
    Map<String,Object> resMap = null;
    IlrEJB3SessionFactory ejbSF;
    IlrStatelessSession rs;

    Game game = new Game(10,3);
    inputParameters.put("GAME", game);
    Hashtable<String, String> jndiProperties = new Hashtable<String, String>();
    jndiProperties.put("java.naming.provider.url", "corbaloc:iiop:********");
    jndiProperties.put("java.naming.factory.initial", "com.ibm.websphere.naming.WsnInitialContextFactory");
    jndiProperties.put("java.naming.security.principal", "username");
    jndiProperties.put("java.naming.security.credentials", "password");



    try {
        ejbSF = new IlrEJB3SessionFactory(jndiProperties);
        ejbSF.setRemote(true);
        ejbSF.setStatelessRemoteJndiName("ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote");
        rs = ejbSF.createStatelessSession();
        IlrSessionRequest request = ejbSF.createRequest();
        request.setRulesetPath(new IlrPath("/GAMLCDDRuleAppPhaseII/SiorkCDDRuleProject_PhaseII"));
        request.setInputParameters(inputParameters);
        request.setForceUptodate(true);
        request.setTraceEnabled(true);
        request.getTraceFilter().setInfoAllFilters(true);
        IlrSessionResponse response = rs.execute(request);
        resMap = response.getOutputParameters();
        Game retGame =(Game)resMap.get("GAME");
        System.out.println(retGame.getWinner());

    } catch (IlrSessionCreationException e) {
        e.printStackTrace();
    } catch (IlrSessionException e) {
        e.printStackTrace();
    }
}
}

And I get this error below:

Exception in thread "P=421238:O=0:CT" java.rmi.MarshalException: CORBA MARSHAL 0x4942f896 No; nested exception is: org.omg.CORBA.MARSHAL: SERVER (id=614476eb, host=gamlwm000t01.esunbank.com.tw) TRACE START: org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge : Unable to read value from underlying bridge : ClassNotFoundException com.siork.cdd.Game vmcid: IBM minor code: 896 completed: No at com.ibm.rmi.iiop.CDRReader.read_value(CDRReader.java:1649) at com.ibm.rmi.iiop.CDRReader.read_abstract_interface(CDRReader.java:1606) at com.ibm.rmi.iiop.CDRReader.read_abstract_interface(CDRReader.java:1591) at ilog.rules.res.session.impl.ejb3._EJSRemote0SLIlrStatelessSessionEJB3_fdcc75a4_Tie.execute(_EJSRemote0SLIlrStatelessSessionEJB3_fdcc75a4_Tie.java:100) at ilog.rules.res.session.impl.ejb3._EJSRemote0SLIlrStatelessSessionEJB3_fdcc75a4_Tie._invoke(_EJSRemote0SLIlrStatelessSessionEJB3_fdcc75a4_Tie.java) at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:669) at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:523) at com.ibm.rmi.iiop.ORB.process(ORB.java:523) at com.ibm.CORBA.iiop.ORB.process(ORB.java:1575) at com.ibm.rmi.iiop.Connection.doRequestWork(Connection.java:3039) at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2922) at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:64) at com.ibm.ejs.oa.pool.PooledThread.run(ThreadPool.java:118) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1815) SERVER (id=614476eb, host=gamlwm000t01.esunbank.com.tw) TRACE END.

I have search the soulution about this quest on Internet

Game.java

package com.siork.cdd;

import java.io.Serializable;

import ilog.rules.bom.annotations.BusinessName;

public class Game implements Serializable {
private static final long serialVersionUID = 1L;
public static String GAME = "GAME";
private int banker_point;
private int player_point;
private String winner;

public Game() {}

public Game(@BusinessName("BANKER") int banker_point,
            @BusinessName("PLAYER") int player_point) {
    this.banker_point = banker_point;
    this.player_point = player_point;
}
public int getBanker_point() {
    return banker_point;
}
public void setBanker_point(int banker_point) {
    this.banker_point = banker_point;
}
public int getPlayer_point() {
    return player_point;
}
public void setPlayer_point(int player_point) {
    this.player_point = player_point;
}
public String getWinner() {
    return winner;
}
public void setWinner(String winner) {
    this.winner = winner;
}
}
ChrisGPT was on strike
  • 127,765
  • 105
  • 273
  • 257
AnthonyLu
  • 23
  • 5

2 Answers2

0

Your Java stand-alone client "TestGameExecute" needs to have com.siork.cdd.Game on it's classpath in order to be able to unmarshall an instance of this class over RMI.

F Rowe
  • 2,042
  • 1
  • 11
  • 12
  • Do you mean that I have to put Game.java into the proper classpath? com.siork.cdd |_ Game.java |_ TestGameExecute.java but I still get the same error – AnthonyLu Dec 04 '17 at 01:41
  • No, you have to put the compiled class file, Game.CLASS, not the java source file, Game.JAVA on the classpath of your standllone client. What is the command line you use to invoke the client? You may find this IBM ODM KnowledgeCenter topic helpful:https://www.ibm.com/support/knowledgecenter/SSQP76_8.9.1/com.ibm.odm.dserver.rules.res.developing/topics/tsk_res_dev_ejb_packag_j2ee.html – F Rowe Dec 04 '17 at 13:41
0

Its a JDK issue. Check your JDK version, upgrade it, for me it worked whe should be 8.x

Amrit
  • 1