Hi,
I'm implementing a Camel component which should integrate a rule based system
(RBS, in my case JESS rules engine) into Camel. I need to run one instance of
JESS for each endpoint of the component. The JESS instances are created in the
Endpoints in seperate threads: One thread per endpoint running thr JESS
instance.
A class based on DefaultProducer is processing the Exchanges (InOut). It puts
the Exchange.getIn() message marked with an unique ID into the RBS as a new
fact. The RBS thread than process the fact and after the result is calculated,
it will call back a Java method with the ID and result. The result should now
become the out / reply message for the Exchnage. The callback function is not
called in order, so I have to map the results / callbacks based on the ID to
the corresponging InOut Exchange / process thread.
In more abstract words: In my Producer I call an async subsystem with
calculation request tagged with an ID. Than the process thread should wait till
a "global" callback is called with the same ID and reply and than replys with
this result.
Route (InOut):
from("direct:test).to(jess:test);
Procucer pseudo code:
public void process(Exchange exchange) throws Exception {
String id = exchange.getIn().getHeader("ID");
String message = exchange.getIn().getBody(String.class);
rbs.putRequest(id, message); // Thread save
// Here I want to wait for the result / callback with matching ID from the
rbs thread
exchange.getOut().setBody(result);
}
RBS callback (seperate thread):
void rbsResult(String ID, String result) {
// Inform the matching process thread / exchange about the result
}
I've thought about using a TimoutMap putting IDs and a "CallbackClass" which
informs the correct process thread of the result. Maybe there is an easier way
to achieve this with Camel or you can point me to existing components
implementing sth. similar.
Thanks!