Archived
This forum has been archived. Please start a new discussion on GitHub.
Java client can't work with a proxy returned by a java server
in Help Center
Here is an interface implemented in a java server (port 10010) that i'm using in a java client port 10000):
Here is how the Server implements SapRequestManager.registerSapResponse:
Here is how the client invokes SapRequestManager.registerSapResponse:
The problem is that the prxSapRequest the client receives from the server craps out with this exception:
The server can call isAlive() on the proxy passed without any problem. operational.
Sorry I'm not a java coder so maybe that is where the problem. Conceptually I do the same in C++ and the C++ server works fine with the client.
Any ideas where I'm screwing up?
// client stuff ------------------------------------------
interface SapResponse {
bool isAlive();
};
// server stuff ------------------------------------------
interface SapRequest {
bool isAlive();
};
interface SapRequestManager{
SapRequest* registerSapResponse(int iClientID, SapResponse* prxResponse);
};
Here is how the Server implements SapRequestManager.registerSapResponse:
public class SapRequestManagerI extends _SapRequestManagerDisp
{
...
public SapRequestPrx
registerSapResponse(int iClientID,
SapResponsePrx prxSapResponse,
Ice.Current current) throws SapCxnError
{
try
{
prxSapResponse.isAlive();
}
catch(Exception e)
{
e.printStackTrace();
}
Ice.Identity iceIDSapRequest = new Ice.Identity();
iceIDSapRequest.category = "SapRequest";
iceIDSapRequest.name = "" + iClientID;
return prxSapRequest = SapRequestPrxHelper.uncheckedCast(current.adapter.createProxy(iceIDSapRequest));
}
...
}
Here is how the client invokes SapRequestManager.registerSapResponse:
try
{
SapResponsePrx prxSapResponse = SapResponsePrxHelper.checkedCast(Server.communicator().stringToProxy("SapResponse:default -p 10000"));
SapRequestManagerPrx prxSapRequestManager = SapRequestManagerPrxHelper.checkedCast(Server.communicator().stringToProxy("SapRequestManager:default -p 10010"));
SapRequestPrx prxSapRequest;
// register the a SapResponse proxy with the remote SapRequestManager and register the returned SapRequest proxy with the RequestSubmitter
prxSapRequest = prxSapRequestManager.registerSapResponse(Server.M_iPort, prxSapResponse);
// Check if the return object works
prxSapRequest.isAlive();
}
catch(Exception e)
{
e.printStackTrace();
}
The problem is that the prxSapRequest the client receives from the server craps out with this exception:
Ice.ObjectNotExistException
id.name = "10000"
id.category = "SapRequest"
facet = ""
operation = "isAlive"
at IceInternal.Outgoing.invoke(Outgoing.java:147)
at ISapCxn._SapRequestDelM.isAlive(_SapRequestDelM.java:79)
at ISapCxn.SapRequestPrxHelper.isAlive(SapRequestPrxHelper.java:94)
at ISapCxn.SapRequestPrxHelper.isAlive(SapRequestPrxHelper.java:66)
at RequestSubmitter.getSapRequestPrx(RequestSubmitter.java:46)
at RequestSubmitter.run(RequestSubmitter.java:220)
SapRequest.executeFunction failed: null
The server can call isAlive() on the proxy passed without any problem. operational.
Sorry I'm not a java coder so maybe that is where the problem. Conceptually I do the same in C++ and the C++ server works fine with the client.
Any ideas where I'm screwing up?
0
Comments
-
return prxSapRequest = SapRequestPrxHelper.uncheckedCast(current.adapter.createProxy(iceIDSapRequest));
Seems you never add the Object to the adapter, you just return a proxy to a non existing servant Ice.ObjectNotExistException is expected in this case.0 -
Thanks Jose, but no, that isn't the problem.
If the client creates the proxy manually like this, all works ok:SapRequestPrx prxSapRequest = SapRequestPrxHelper.checkedCast(Server.communicator().stringToProxy("SapRequest:default -p 10010")); prxSapRequest.isAlive()
If the server forgot to add the SapRequest object to its adapter, than this would not work. So there is something wrong with the proxy I return from the server, but what?0 -
This proxy:
SapRequest:default -p 10010
Has the identity id.name="SapRequest", id.category="".
The proxy reporting the object not exist exception is:
id.name = "10000" id.category = "SapRequest"
As you can see they are not the same.
The identity id.name = "10000" id.category = "SapRequest"
in stringified form is: "SapRequest/1000".
This format of a stringified proxy is documented https://doc.zeroc.com/display/Ice/Proxy+and+Endpoint+Syntax0 -
Hmm, yes I have these two:
SapRequest:default -p 10010 SapRequest/10000:default -p 10010
But I only have one class:public class SapRequestI extends _SapRequestDisp {/* */}
and I register that class like this:adapter.add(new SapRequestI(), communicator().stringToIdentity("SapRequest")); adapter.activate();
I thought that the Ice.current.id.category was relevant to invoke the correct interface and I could then examine the Ice.current.id.name to connect to the apropriate object.
So do I need to implement a locator to make this work?0