You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@etch.apache.org by scott comer <we...@mac.com> on 2010/01/12 16:03:13 UTC
Re: Questions about the Event Dispatch and asynchronous callback
Ranganath s wrote:
> Firstly
> i would like to know how Asynchronous Message works from server to client.
> Does that message get the response from the received end? if so what would
> be the duration of it?
>
two way messages (we call them actions) to the client work exactly like
two way messages to the server. the message sender formats the message
and puts it on the wire and waits for a response. the message receiver
reads the message from the wire, dispatches it to the appropriate
implementation method, then formats the result (which may be a value
including null, void, or an exception), and puts that on the wire back
to the sender.
one way messages (we call them events) are slightly different. just as
for two way messages, the sender formats the message and puts it on the
wire. but then the sender returns immediately. as above, the receiver
reads the message from the wire and dispatches it. if the implementation
method returns normally (non-exception case), then nothing else is done.
if the implementation method fails, then a special message with the
exception is formatted and returned to the sender. normally this would
fall into the "unwanted" message handler, delivered to the sender via
_sessionNotify method. more or less an "FYI" thing.
the only thing changed by the asynchronous receiver tag in the above two
scenarios is this: when the message is read from the wire, that thread
(the message receiver thread) normally also dispatches the message to
the implementation method. obviously while the implementation method is
running no more messages can be read and dispatched. under asynchronous
delivery, the message receiver thread hands the message to a thread pool
to perform the task of calling the implementation method. the message
receiver thread is then free to read and dispatch more messages. which
means two things: asynchronous receiver messages can be executed out of
order relative to other messages, each other, and in fact might be
executed simultaneously to other messages; second, responses of
asynchronous receiver messages might be delivered out of order relative
to their execution sequence, with other messages and themselves.
basically, when you have an asynchronous receiver declaration in the
idl, you have to take much more responsibility for synchronization
issues with respect to those methods and the rest.
not sure what "if so what would be the duration of it?" means.
> secondly , say i have a scenario where in i have 1 server say s1 with
> 4 clients say c1,c2,c3,c4 now when ever i change some data in c2 that needs
> to reflect in other clients as well.. So how could this be handled in Apache
> ETCH.
etch itself doesn't handle such a thing automatically. it is a message
passing system, not a data sharing system. but you can use etch to
handle data change scenarios like this:
if one of the clients changes some data, it uses a one way method to
notify the server of the change. let's call that method
dataChanged(...). let's assume the data is identified by name, the value
can be any data type. let's declare dataChanged like this:
@Oneway
@Direction(Both)
void dataChanged(string name, object value)
the server, when it receives a dataChanged, updates it's copy and also
turns around and calls each of the client's with the same information
(the dataChanged method is bi-directional, so either client or server
can call it). the clients, when they receive a dataChanged call, write
down the new value, and life is good.
sort of. if c1 is telling the server that the value changed, obviously
the server need not tell c1 the value changed. that's pretty easy.
the server needs to maintain a list of interested clients. in
particular, when a client connection goes down, it should be removed
from the list.
failure to send to a client should also not stop notification of other
clients.
if both c1 and c2 change the same value, their messages will cross each
other in transit and it is not defined what final value everyone ends up
with. you would need to add a locking protocol and some sort of conflict
resolution mechanism.
scott out
Re: Questions about the Event Dispatch and asynchronous callback
Posted by Ranganath s <ra...@gmail.com>.
thanks a ton for the explanation.
regards
Ranganath
On Tue, Jan 12, 2010 at 8:33 PM, scott comer <we...@mac.com> wrote:
> Ranganath s wrote:
>
>> Firstly
>> i would like to know how Asynchronous Message works from server to
>> client.
>> Does that message get the response from the received end? if so what would
>> be the duration of it?
>>
>>
> two way messages (we call them actions) to the client work exactly like two
> way messages to the server. the message sender formats the message and puts
> it on the wire and waits for a response. the message receiver reads the
> message from the wire, dispatches it to the appropriate implementation
> method, then formats the result (which may be a value including null, void,
> or an exception), and puts that on the wire back to the sender.
>
> one way messages (we call them events) are slightly different. just as for
> two way messages, the sender formats the message and puts it on the wire.
> but then the sender returns immediately. as above, the receiver reads the
> message from the wire and dispatches it. if the implementation method
> returns normally (non-exception case), then nothing else is done. if the
> implementation method fails, then a special message with the exception is
> formatted and returned to the sender. normally this would fall into the
> "unwanted" message handler, delivered to the sender via _sessionNotify
> method. more or less an "FYI" thing.
>
> the only thing changed by the asynchronous receiver tag in the above two
> scenarios is this: when the message is read from the wire, that thread (the
> message receiver thread) normally also dispatches the message to the
> implementation method. obviously while the implementation method is running
> no more messages can be read and dispatched. under asynchronous delivery,
> the message receiver thread hands the message to a thread pool to perform
> the task of calling the implementation method. the message receiver thread
> is then free to read and dispatch more messages. which means two things:
> asynchronous receiver messages can be executed out of order relative to
> other messages, each other, and in fact might be executed simultaneously to
> other messages; second, responses of asynchronous receiver messages might be
> delivered out of order relative to their execution sequence, with other
> messages and themselves. basically, when you have an asynchronous receiver
> declaration in the idl, you have to take much more responsibility for
> synchronization issues with respect to those methods and the rest.
>
> not sure what "if so what would be the duration of it?" means.
>
> secondly , say i have a scenario where in i have 1 server say s1 with
>> 4 clients say c1,c2,c3,c4 now when ever i change some data in c2 that
>> needs
>> to reflect in other clients as well.. So how could this be handled in
>> Apache
>> ETCH.
>>
> etch itself doesn't handle such a thing automatically. it is a message
> passing system, not a data sharing system. but you can use etch to handle
> data change scenarios like this:
>
> if one of the clients changes some data, it uses a one way method to notify
> the server of the change. let's call that method dataChanged(...). let's
> assume the data is identified by name, the value can be any data type. let's
> declare dataChanged like this:
>
> @Oneway
> @Direction(Both)
> void dataChanged(string name, object value)
>
> the server, when it receives a dataChanged, updates it's copy and also
> turns around and calls each of the client's with the same information (the
> dataChanged method is bi-directional, so either client or server can call
> it). the clients, when they receive a dataChanged call, write down the new
> value, and life is good.
>
> sort of. if c1 is telling the server that the value changed, obviously the
> server need not tell c1 the value changed. that's pretty easy.
>
> the server needs to maintain a list of interested clients. in particular,
> when a client connection goes down, it should be removed from the list.
>
> failure to send to a client should also not stop notification of other
> clients.
>
> if both c1 and c2 change the same value, their messages will cross each
> other in transit and it is not defined what final value everyone ends up
> with. you would need to add a locking protocol and some sort of conflict
> resolution mechanism.
>
> scott out
>
>
>
>
--
I blog at http://ranganaths.wordpress.com