You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Martin Ritchie (JIRA)" <qp...@incubator.apache.org> on 2007/04/23 13:05:15 UTC
[jira] Updated: (QPID-406) Provide message interceptors in client &
broker.
[ https://issues.apache.org/jira/browse/QPID-406?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Martin Ritchie updated QPID-406:
--------------------------------
Fix Version/s: M3
> Provide message interceptors in client & broker.
> ------------------------------------------------
>
> Key: QPID-406
> URL: https://issues.apache.org/jira/browse/QPID-406
> Project: Qpid
> Issue Type: New Feature
> Components: C++ Broker, C++ Client, Dot Net Client, Java Broker, Java Client, Python Client, Ruby Client
> Reporter: Alan Conway
> Fix For: M3
>
>
> The interceptor pattern (also known as http://en.wikipedia.org/wiki/Chain_of_responsibility_pattern) allows dynamic extension of processing by delegating work to a dynamically constructed chain of interceptors (or "handlers".) It's well established (CORBA, J2EE, JAXWS etc.) and very flexible.
> The immediate use case for qpid is to support the interop test suite http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification. This calls for automatic timeouts if there is no communication to or from the client for a certain period of time. Resetting the timeout at every send/receive point in test code is tedious and error-prone. A better solution is to allow the test setup to register a timeout interceptor (callback, handler) that resets the timeout for every communication event.
> I'm not stuck on terminology,Interceptor or Handler work for me - the C++ broker already uses handler.
> I suggest a simple generic/templated recursive handler pattern, like the following pseudo-code:
> // Framework:
> interface Handler<T> { void handle(T); }
> interface HandlerFactory<T> { Handler<T> create(Handler<T> next); }
> // Now for the current use case we would write a handler like this:
> class TImeoutHandler : implements Handler<Frame>, HandlerFactory<Frame> {
> Timer timeout;
> Handler<Frame> create(Handler<Frame> next) { return this; }
> void handle(Frame f) { timeout.reset(); }
> }
> // Test setup
> FooTest {
> TimeoutHandler timeoutHandler;
> void setUp() {
> connection = ...;
> connection.addFrameOutHandler(timeoutHandler);
> connection.addFrameInHandler(timeoutHandler);
> }
> // Not shown: the timer needs run a thread that kills the connection if the timer times out.
> The pattern can be extended to other kinds of interceptor, e.g. higher level interceptors for send/receive message, send/receive acknowldgement etc. We can also put interception points at different places in the architecture: per channel, per connection etc. We can start with just solving the current use case and extend as needed.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.