CORBA MARSHAL 0x4942f896, Unable to read value from underlying bridge : ClassNotFoundException

2.4k Views Asked by At

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;
}
}
3

There are 3 best solutions below

2
On

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.

0
On

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

0
On

In my case, I set value to

List<ColReteral> coll;

coll.setId("1");

remote.update("id", coll);

I got error

CORBA MARSHAL 0x4942f896, Unable to read value from underlying bridge : ClassNotFoundException

Because i forgot

coll = new ArrayList<ColReteral>();

..