Berin,
nice work as usual.
However, architecturally I have some random thoughts that I'd like to share.
I have looked into SEDA as part of my Avalon-for-C++ project, and regarding
queues, I can not really say whether the queue should or should not be exposed
to the stages producing events for that stage.
Axiom: Stage isa Component
Scenario:
class StageBeforeMyStage implements Stage { ... }
class MyStage implements Stage { ... }
class MyStageWorkElement implements QueueElement {
public MyStageWorkElement (String workDescription) { ... }
public String getWorkDescription () { ... }
}
StageBeforeMyStage produces MyStageWorkElements and feeds them to MyStage.
Now, I thought like this: The queue should hold event objects. But C++
templates enables you to design the queues with type safety - that is, you do
not need to cast the event object after dequeueing it. This is a major
advantage, as you do not need to rely on the previous stage producing the
correct work elements.
I imagine StageBeforeMyStage will use a ComponentManager to
lookup(MyStage.ROLE). Now, what does StageBeforeMyStage see of MyStage? Does it
see the Sink interface?
I would propose that it did not.
I would like to show this interface:
interface TransactionalSink {
public void beginTransaction ();
public void commitTransaction ();
public void abortTransaction ();
}
interface MyStageSink extends TransactionalSink {
public void addWorkDescription (String workDescription);
}
The usage would then be like this:
MyStageSink sink = (MyStageSink) manager.lookup (MyStageSink.ROLE);
.
.
.
try {
sink.beginTransaction ();
sink.addWorkDescription ("Do this.");
sink.addWorkDescription ("Do that.");
sink.commitTransaction ();
} catch (Exception e) {
sink.abortTransaction ();
}
A stage would then be just like a component with asynchronous methods. The
thread pool for each stage would be managed by the component manager the stage
belongs to.
/LS
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>