[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Help with Splitter/Aggregator-like behavior

So, I have a situation where I need something like a Splitter and an Aggregator.
But as far as I can tell from reading and googling, maybe my situation is nonstandard?
>From what I can tell, a Splitter and Aggregator are used together within a single route.
In my case, I need the Splitter and Aggregator separated into a sender and receiver, resp.

I'm just looking for someone to tell me if the following fits squarely within the Splitter
and Aggregator patterns - if so, I'll dig in and figure it out - or if there's another pattern
or something else to try.

Thank you in advance for your guidance, and sorry for being so verbose again (just trying to be clear).


On the Splitter side, per usual, I need to split a big message into individual messages.
However, I can't just split and let each individual message continue on the route.
Instead, I need to "wrap" each individual message and stick some header information on it

The situation is very much like the following, which is very UDP-like:

Big messages come in, and they get split into "packages" of a preset size.
All the individual "packages" can be said to belong to a "frame" of data.
The header of the individual messages contain the Frame # and Package # and the Total #
of packages in the frame so the receiver knows when it has received a full frame of data.

Message: 1
     Frame: 1 - Package: 1 - Total: 3
     Frame: 1 - Package: 2 - Total: 3
     Frame: 1 - Package: 3 - Total: 3
Message: 2
     Frame: 2 - Package: 1 - Total: 2
     Frame: 2 - Package: 2 - Total: 2


If I can't accomplish this with a split() of some kind, how could I do it with a regular Processor?
Having a Processor manually split and bundle the data into "packages" is trivial.
But how does the Processor then write the individual messages back to a "direct:processPackage" route point?
Can a Processor invoke (write data to) a route, at some point in the middle of that route?


The Aggregator, as you would expect, needs to do the opposite of the above:

It needs to aggregate "packages" of data until it determines it has a full "frame".
Then it bundles all the package payloads into a single, big message.
When a frame is not full, data does not flow to the rest of the route.
When the frame is full, the data is written to some route mid-point; e.g. "direct:translateMessage".

So, can this sort of "asynchronous" aggregating be done?
Can an aggregating Processor basically maintain state, and decide to write or not write to a route?

Thank you again for any pointers.