package org.rzo.netty.ahessian.rpc.server;
import java.util.Date;
import org.rzo.netty.ahessian.session.Session;
/**
* Continuation offers similar functionality as <a href="http://docs.codehaus.org/display/JETTY/Continuations">Jetty Continuations</a>
* <br>
* A continuation is a mechanism by which an RPC request can be suspended and restarted after a timeout or an asynchronous event has occured.
* <br>
* Typical usage within a service:
* <br>
* The service interface exposed to the client:
* <br>
* <pre>
* public TableData getTableData(Filter filter)
* </pre>
* <br>
* The service object implementation:
* <br>
* <pre>
* public TableData getTableData(Continuation continuation, Filter filter)
* {
* if (requestOk(filter))
* // add client to client list
* addClient(continuation, filter, context);
* else // or send an error
* // continuation.fault(new Exception...());
* }
*
* void onTableDataChange()
* {
* // when table data changes send the new data to all attached clients
* for (client : clients)
* {
* TableData newData = ...
* client.getContinuation().send(newData)
* }
* }
*
* void onTableClosed()
* {
* // on shutdown inform all clients that the invocation is completed and no further
* // data will be sent.
* for (client : clients)
* {
* client.getContinuation().completed(null);
* }
* clients.reset();
* }
* </pre>
*
*/
public interface Continuation
{
/**
* Send an invocation reply to the client
*
* @param result the result
*/
public void send(Object result);
/**
* Send the last reply to the client and inform that this is the last reply for the invocation request
*
* @param result the result
*/
public void complete(Object result);
/**
* Send an error to the client and inform that this is the last reply for the invocation request
*
* @param result the result
*/
public void fault(Throwable result);
/**
* If the client has given us a time out for the invocation calling send, complete or fault after the given
* point in time will result in an exception
*
* @return the tTL
*/
public Date getTTL();
public Session getSession();
}