Hi Alex,

This discussion is independent of the transport; that is, it applies equally 
well to the socket transport, for example.

Here's an abstraction of the behavior for the case of a synchronous invocation.

1. The application calls Client.invoke().

2. The client side of the transport marshals the invocation to the network and 
waits for the result.

3. The server side of the transport unmarshals the invocation and passes it the 
application's ServerInvocationHandler.

4. The ServerInvocationHandler returns a result.

5. The server side of the transport marshals the result to the network.

6. The client side of the transport unmarshals the result and returns it.

7. Client.invoke() returns the result to the application.

Now, suppose that the client gets disconnected sometime after step 2.  The 
ServerInvocationHandler would, by default, have no way of knowing of the 
connection failure, it would return its result, and the transport would fail in 
step 5, throwing an exception.  However, Remoting does have a way of informing 
the application on the server side of connection failures by way of the Lease 
mechanism, in which a connection is continuously checked at some configured 
rate.  Please see Chapter 8, "Connection Exception Listeners and Leasing" of 
the Remoting documentation at

http://labs.jboss.com/portal/jbossremoting/docs/guide/ch08.html

for more information about setting up leasing.  When leasing is enabled on the 
server and the client requests leasing for a connection, then the 
org.jboss.remoting.ConnectionListener registered with the server by a call to 
Connector.addConnectionListener() will be informed if that connection has 
failed.  The ConnectionListener could then take whatever steps are appropriate 
to the application, including, for example, attempting to return the result at 
a later time.

The idea of returning the result at a later time leads us to the general 
possibility of asynchronous processing and callbacks.  Remoting supports the 
ability of the server to send information to the client, independent of any 
particular invocation.  Briefly, the application registers an 
InvokerCallbackHandler on the client side with a call to Client.addListener(), 
and, on the server side, the ServerInvocationHandler is informed of the 
existence of the InvokerCallbackHandler by a call to 
ServerInvocationHandler.addListener(), which passes in a server side "proxy" of 
the InvokerCallbackHandler.  The ServerInvocationHandler can pass information 
to the client at any time by calling handleCallback() on the proxy.  

Callbacks could be used with or without the ConnectionListener.  For example, 
in the case of a synchronous invocation, the ServerInvocationHandler could 
cache the result and, if informed by the ConnectionListener of a connection 
failure, it could attempt to deliver the result as a callback.  Or, the 
application could be designed to return all result asynchronously by callback.  
In either case, when the ServerInvocationHandler calls 
InvokerCallbackHandler.handleCallback() (which is analogous to 
Client.invoke()), it will be informed, by catching an exception, of the failure 
to return a callback and it can reschedule the callback for a later time.

I've omitted other modes of using callbacks, e.g., pull callbacks.  For more 
information, see section 5.6 "Callbacks" of the Remoting documentation:

http://labs.jboss.com/portal/jbossremoting/docs/guide/ch05.html#d0e2609

By the way, if you investigate further and want to submit an example of failure 
handling, it would be appreciated.

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4023495#4023495

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4023495
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to