[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [xmlblaster] connecting
Hi Kai,
please see the inline below. When in failsafe mode you also need to
assign a positive sessionId (otherwise when reconnecting a second time
to the xmlBlaster after having lost the connection, the XmlBlaster will
not know that it is the same session as before).
Regards
Michele
Kai wrote:
> Thanks for explaination. Replies inline.
>
> Michele Laghi wrote:
>> Hi Kai,
>> I think there is a missunderstanding:
>>
>> When you try to connect in failsafe mode (failsafe: register a
>> I_ConnectionStateListener + retries=-1) you don't get an exception even
>> if the server is not available.
>
> I read that retries=-1 is default, isn't it? And I registered a
> ConnectionStateListener. The code I provided is a bit simplified, but I
> got an exception. Maybe my configuration is something missing for
> failsafe mode!?
>
> I tried the following:
> ConnectQos qos = new ConnectQos(glob);
> Address addressProp = new Address(glob);
> addressProp.setDelay(4000L); // retry connecting every 4 sec
> addressProp.setRetries(-1); // -1 == forever
> addressProp.setPingInterval(0L); // switched off
> qos.setAddress(addressProp);
> ConnectReturnQos result = access.connect(qos, new CallBackListener());
>
> But I got an exception!
>
>> What happens is that the connection request is queued on the client side
>> and the XmlBlasterAccess object creates a fake return qos for you. So
>> under a client point of view you are connected (even if the physical low
>> level connection is not established).
>>
>> So isConnected returns true because the connect message was (at least)
>> safely queued on the client side and you are allowed to publish
>> subscribe and so on (as you would be physically connected). The only
>> feature you are not able to do is GET (see the table in the failsafe
>> requirement).
>>
>> Once you connect you are connected. The Connection has several states:
>>
>> POLLING
>> ALIVE
>> DEAD
>>
>> so in your case isConnected() gives true, isPolling() gives also true
>> and isAlive() gives false.
>
> Sorry maybe I'm to stupid but in my case all of this functions return
> false because the field XmlBlasterAccess.connectReturnQos is null!
>
>> So try the following:
>>
>> make a connect (no need to loop in the catch)
>> => you connection msg is queued
>> start the xmlBlaster
>> => your method reachedAlive(..) is invoked
>> stop the xmlBlaster
>> => your method reachedPolling() is invoked
>>
>> So if you really need the server for your work (in many use cases you
>> don't need it) you would block in the thread making the connect and you
>> would release that thread in your reachedAlive() method.
>>
>> Also see the second example in the requirement for more details.
>
> Okay attached you will find my simple test program. I hope I got it
> right. I use the client jar build with "build dist-client" and the
> standalone server with default config.
>
>
> ------------------------------------------------------------------------
>
> import org.xmlBlaster.client.I_Callback;
> import org.xmlBlaster.client.I_ConnectionStateListener;
> import org.xmlBlaster.client.I_XmlBlasterAccess;
> import org.xmlBlaster.client.key.UpdateKey;
> import org.xmlBlaster.client.qos.ConnectQos;
> import org.xmlBlaster.client.qos.ConnectReturnQos;
> import org.xmlBlaster.client.qos.UpdateQos;
> import org.xmlBlaster.util.EmbeddedXmlBlaster;
> import org.xmlBlaster.util.Global;
> import org.xmlBlaster.util.XmlBlasterException;
> import org.xmlBlaster.util.dispatch.ConnectionStateEnum;
> import org.xmlBlaster.util.qos.address.Address;
>
> public class XmlBlasterAccessTest
> {
> class CallBackListener implements I_Callback
> {
>
> /*
> * (non-Javadoc)
> *
> * at see org.xmlBlaster.client.I_Callback#update(java.lang.String,
> * org.xmlBlaster.client.key.UpdateKey, byte[],
> * org.xmlBlaster.client.qos.UpdateQos)
> */
> public String update(String cbSessionId, UpdateKey updateKey, byte[] content, UpdateQos updateQos) throws XmlBlasterException
> {
> // TODO update implementation
> return null;
> }
>
> }
>
> class ConnectionListener implements I_ConnectionStateListener
> {
>
> /*
> * (non-Javadoc)
> *
> * at see org.xmlBlaster.client.I_ConnectionStateListener#reachedAlive(org.xmlBlaster.util.dispatch.ConnectionStateEnum,
> * org.xmlBlaster.client.I_XmlBlasterAccess)
> */
> public void reachedAlive(ConnectionStateEnum oldState, I_XmlBlasterAccess connection)
> {
> // TODO reachedAlive implementation
> System.out.println("reachedAlive");
> synchronized (XmlBlasterAccessTest.this)
> {
> XmlBlasterAccessTest.this.notify();
> }
> }
>
> /*
> * (non-Javadoc)
> *
> * at see org.xmlBlaster.client.I_ConnectionStateListener#reachedDead(org.xmlBlaster.util.dispatch.ConnectionStateEnum,
> * org.xmlBlaster.client.I_XmlBlasterAccess)
> */
> public void reachedDead(ConnectionStateEnum oldState, I_XmlBlasterAccess connection)
> {
> // TODO reachedDead implementation
> System.out.println("reachedDead");
> }
>
> /*
> * (non-Javadoc)
> *
> * at see org.xmlBlaster.client.I_ConnectionStateListener#reachedPolling(org.xmlBlaster.util.dispatch.ConnectionStateEnum,
> * org.xmlBlaster.client.I_XmlBlasterAccess)
> */
> public void reachedPolling(ConnectionStateEnum oldState, I_XmlBlasterAccess connection)
> {
> // TODO reachedPolling implementation
> System.out.println("reachedPolling");
> }
>
> }
>
> public static void main(String[] args)
> {
> XmlBlasterAccessTest test = new XmlBlasterAccessTest();
> test.test();
> }
> I_XmlBlasterAccess access;
> Global glob;
>
> EmbeddedXmlBlaster server;
>
> public void test()
> {
> glob = new Global();
> access = glob.getXmlBlasterAccess();
> access.registerConnectionListener(new ConnectionListener());
>
> try
> {
> ConnectQos qos = new ConnectQos(glob);
qos.setSessionName(new SessionName(glob, "joe/1"));
> Address addressProp = new Address(glob);
> addressProp.setDelay(4000L); // retry connecting every 4 sec
> addressProp.setRetries(-1); // -1 == forever
> addressProp.setPingInterval(0L); // switched off
> qos.setAddress(addressProp);
> ConnectReturnQos result = access.connect(qos, new CallBackListener());
>
> } catch (XmlBlasterException e)
> {
> e.printStackTrace();
> }
>
> boolean alive = access.isAlive();
> boolean connected = access.isConnected();
> boolean polling = access.isPolling();
> if (!alive && connected && polling)
> {
> try
> {
> synchronized (this)
> {
> this.wait();
> }
> } catch (InterruptedException e)
> {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> }
> access.disconnect(null);
> System.out.println("exit");
> }
> }