Archived
Glacier2 - SessionNotExistException in session() after connected by factory
Good afternoon!
I am trying to implement a simple java client that communicates with a server via Glacier2+IceStorm and allows the server and the client to send messages to each other. The communication over the Glacier2 and the IceStorm service works well. I am already able to send messages from the client to the server by subscribing to topics. But the server is not able to send messages back. For that, I would like to use callbacks - like in the Chat Demo: https://doc.zeroc.com/display/Doc/Slice+Interfaces.
My problem is that the _session.session() method raises an Glacier2.SessionNotExistException. I don't know where the problem is, because the _session object itself returns a correct communicator() with which I am subscribing to my topics. The _session.isConnected() returns true.
Here are a few lines of code:
` public static String SERVER_IP = "192.168.1.172";
public static String SERVER_PORT = "4063";
public static String ICESTORM_IP = "192.168.1.172";
public static String ICESTORM_PORT = "80";
private Ice.Communicator _communicator;
private Glacier2.SessionHelper _session;
private Glacier2.SessionFactoryHelper _factory;
private Ice.InitializationData _initData;
private ChatSessionPrx _chat;
public Client()
{
}
public void initialize(String[] args)
{
// set initial properties (for Glacier2 and debugging)
Ice.StringSeqHolder argsH = new Ice.StringSeqHolder(args);
Ice.Properties properties = Ice.Util.createProperties(argsH);
properties.setProperty("Ice.Default.Router", "Glacier2/router:tcp -h "+SERVER_IP+" -p "+SERVER_PORT);
properties.setProperty("Ice.RetryIntervals", "-1");
properties.setProperty("Ice.Trace.Network", "2");
_initData = new Ice.InitializationData();
_initData.properties = properties;
// add SessionFactoryHelper for communicator intialization
_factory = new Glacier2.SessionFactoryHelper(_initData, new Glacier2.SessionCallback()
{
@Override
public void connected(Glacier2.SessionHelper session)
throws Glacier2.SessionNotExistException
{
// If the session has been reassigned avoid the spurious callback.
if(session != _session)
{
System.out.println("Warning: Spurious callback. Exit.");
return;
}
System.out.println("Connected to Glacier2 Service.");
setAllCallbacks();
//registerTopics();
}
@Override
public void disconnected(Glacier2.SessionHelper session)
{
System.out.println("Disconnected from Glacier2 Service.");
}
@Override
public void connectFailed(Glacier2.SessionHelper session, Throwable exception)
{
try
{
throw exception;
}
catch(final Glacier2.CannotCreateSessionException ex)
{
System.out.println("Login failed (Glacier2.CannotCreateSessionException):\n" + ex.reason);
}
catch(final Glacier2.PermissionDeniedException ex)
{
System.out.println("Login failed (Glacier2.PermissionDeniedException):\n" + ex.reason);
}
catch(Ice.Exception ex)
{
System.out.println("Login failed (" + ex.ice_name() + ").\n" +
"Please check your configuration.");
}
catch(Throwable ex)
{
ex.printStackTrace();
}
}
@Override
public void createdCommunicator(Glacier2.SessionHelper session)
{
//test(session.communicator() != null);
if(session.communicator() != null)
{
System.out.println("Created communicater by session.");
}
}
});
// Connect to session
System.out.println("Connection to Session...");
_factory.setRouterHost(SERVER_IP);
_session = _factory.connect("", "");
}
private void setAllCallbacks()
{
try
{
System.out.print("Setting all Callbacks...\n");
//variant 1
/*
ChatRoomCallback servant = new ChatRoomCallbackI();
ChatRoomCallbackPrx callback = ChatRoomCallbackPrxHelper.uncheckedCast(_session.addWithUUID(servant));
_chat = ChatSessionPrxHelper.uncheckedCast(_session.session());
_chat.setCallback(callback);*/
//variant 2
_chat = ChatSessionPrxHelper.uncheckedCast(_session.session());
ChatRoomCallbackPrx callback = ChatRoomCallbackPrxHelper.uncheckedCast(_session.addWithUUID(new ChatRoomCallbackI()));
_chat.begin_setCallback(callback);
System.out.print("OK!\n");
}
catch (SessionNotExistException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}`
The actual output looks like this:
Connection to Session... Created communicater by session. -- 26.05.17 14:27:33:383 Network: trying to establish tcp connection to 192.168.1.172:4063 -- 26.05.17 14:27:33:398 Network: established tcp connection local address = 192.168.1.188:14056 remote address = 192.168.1.172:4063 Connected to Glacier2 Service. Setting all Callbacks... Glacier2.SessionNotExistException at Glacier2.SessionHelper.session(SessionHelper.java:156) at Client.setAllCallbacks(Client.java:139) at Client.access$1(Client.java:124) at Client$1.connected(Client.java:71) at Glacier2.SessionHelper$8.run(SessionHelper.java:379) at Glacier2.SessionHelper.dispatchCallback(SessionHelper.java:590) at Glacier2.SessionHelper.connected(SessionHelper.java:372) at Glacier2.SessionHelper.access$600(SessionHelper.java:15) at Glacier2.SessionHelper$11.run(SessionHelper.java:556) at java.lang.Thread.run(Unknown Source)
Maybe you can help me on that?
Thank you very much in advance.
Best,
Kevin
Comments
-
Sound like you have not configure a Glacier2::SessionManager, in this case the session will be nil and the call to session() will raise SessionNotExistException
The Chat Demo includes a sample SessionManager implementation you should also review the Session Management documentation
0 -
Hi, thank you for your fast response.
I thought the Glacier2::SessionManager is only necessary when you are using the Glacier::Application helper class to initiate a session. Right now, I am trying to implement it with the SessionFactoryHelper in order to run it in a GUI application.
https://doc.zeroc.com/display/Ice36/Glacier2+Helper+Classes
Did I understand it wrong? Is there an example how to do it with the SessionFacetoryHelper class?
I reviewed the code with the following example: https://github.com/zeroc-ice/ice-demos/blob/master/java/Chat/src/main/java/ChatDemoGUI/Coordinator.java
Thank you very much.
0 -
Glacier2::SessionManager is implemented in the Server side, if you configure glacier2router to use a SessionManager it will be resposible to create the users sessions and then session helper session method will return a proxy that reference the session object.
see:
ChatDemo session manager implementation and how it is configured in config.glacier2router0 -
Wow, now I got it. Thank you so much. It works!
0