[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [xmlblaster] SOCKET problem, why are messages delayed?



PBal wrote:
Hi!

I've chosen XmlBlaster because of its wealth of features, simple tcp socket protocol support, compatibility and possible ease of use, and it looked good. However...
What i'm currently trying to write is a simple rpc framework in java for a quite complex commercial program being developed.
XmlBlaster is simply forwarding volatile PtP messages between two sessions. I've been trying to debug a problem for several days, after applying the ping patch for the SOCKET protocol.
The issue is that sometimes invocations of remote object's methods (on "host A") are not returning their return value, or rather, the messages don't arrive at "host B" immediately as "host A" sent published it. No other messages are being sent by any other host, traffic is zero.
This causes "host B" to get stuck in the invocation while waiting for the message containing the return value.
I noticed that when I wait 60 seconds, some warning messages appear on the xmlBlaster server:


[WARN XmlBlaster.DispatchWorkerPool.asus-1 requestBroker-/node/asus] Generating dead message 'callback:/node/asus/client/server/1/HIGH/1092849962617000000/rpc' from publisher=/node/asus/client/poka/1 because delivery with queue 'callback:/node/asus/client/server/1' failed: XmlBlasterException errorCode=[user.update.error] serverSideException=true location=[SOCKET-HandleClientRequest-server] message=[SOCKET callback of 1 messages failed : errorCode=resource.exhaust message=Timeout of 60000 milliseconds occured when waiting on update(server:6024) response. You can change it with -dispatch/callback/plugin/socket/responseTimeout <millis>] [See URL http://www.xmlblaster.org/xmlBlaster/doc/requirements/admin.errorcodes.listing.html#user.update.error]

[INFO XmlBlaster.DispatchWorkerPool.asus-1 XmlKey] DOM parsed the XmlKey __sys__deadMessage
[INFO XmlBlaster.DispatchWorkerPool.asus-1 TopicHandler-/node/asus/topic/__sys__deadMessage] New topic is ready, history/maxEntries=10, persistence/msgUnitStore/maxEntries=100000000
[WARN XmlBlaster.SOCKET.HandleClient-server SocketExecutor] Ignoring received 'update' message id=server:6024, nobody is interested in it

It seems that the message with id "server:6024" is delivered to your client (called 'server/1') and this client blocks in its update() method. After the timeout (60 sec) suddenly the update() returns.

I believe it is a multi threading dead lock issue in your client code.

Could you please add logging output to your clients update() method
to see if the update arrives and to see if/when the update() returns?

Further you can add the option '-dump[socket] true' on xmlBlaster and
on your client side to see all messages sent and acknowledged..

During the blocking (0 ... 60 sec) you can make a thread dump
(on Linux killall -3 java, on Windows 'Ctrl-Break') to find
out where the dead lock happens.

Probably you can let return CallbackMultiplexer directly in update()
(comment out your business logic) and check if the problem disappears.


I don't understand the meaning of these messages, and assume that their appearance is not normal and has something to do with my problem.


My code to set up the connection to xmlBlaster on both clients is as follows:

String[] args = {
"-protocol", "SOCKET",
"-dispatch/connection/plugin/socket/hostname", host, "-dispatch/connection/plugin/socket/port", String.valueOf(port)};
Global global=new Global(args);
xmlBlasterConnection = global.getXmlBlasterAccess();
ConnectQos qos = new ConnectQos(global);
qos.setSessionTimeout(3600000L);
qos.setPtpAllowed(true);


Address address=new Address(global);
address.setDelay(10000L);
address.setPingInterval(10000L);
address.setRetries(-1);
qos.setAddress(address);


    CallbackAddress cba=new CallbackAddress(global, "SOCKET");
    cba.setDelay(10000L);
    cba.setPingInterval(5000L);
    cba.setRetries(-1);

    qos.addCallbackAddress(cba);

    if (session>=1)
            qos.setSessionName(new SessionName(global, user+"/"+session));
        else
            qos.setSessionName(new SessionName(global, user));
        qos.loadClientPlugin("htpasswd", "1.0", user, pass);

        CallbackMultiplexer cbmpx=new CallbackMultiplexer();
        ConnectReturnQos crq=xmlBlasterConnection.connect(qos, cbmpx);

CallbackMultiplexer implements I_Callback.
I'm not using the get, subscribe or unsubscribe methods, only publishOneway. Receiving messages with CallbackMultiplexer.
Hope this helps to track down my error, misunderstanding or anything.

This code looks OK.

regards

Marcel

Any help is greatly appreciated.

Regards,
Balázs Póka




--
http://www.xmlBlaster.org