[
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.