Трудно рассказать обо всем, что происходит, потому что у меня нет всего вашего кода, но я смог заставить этот поток работать так, как я думаю, вы хотели. BaseObjectTransformer ничего не делает, только устанавливает флаг для объектов, проходящих через него:
...
<context:component-scan base-package="net.grogscave.example" />
<channel id="inputChannel" />
<splitter ref="articleContentExtractor" input-channel="inputChannel"
output-channel="splitArticleStaff" />
<channel id="splitArticleStaff" />
<payload-type-router input-channel="splitArticleStaff">
<mapping type="net.grogscave.example.domain.Article" channel="articleChannel" />
<mapping type="net.grogscave.example.domain.Staff" channel="staffChannel" />
</payload-type-router>
<channel id="articleChannel" />
<transformer input-channel="articleChannel" output-channel="articleOutAggregateChannel"
ref="baseObjectTransformer"/>
<channel id="staffChannel" />
<transformer input-channel="staffChannel" output-channel="articleOutAggregateChannel"
ref="baseObjectTransformer"/>
<channel id="articleOutAggregateChannel" />
<aggregator ref="articleAggregator" input-channel="articleOutAggregateChannel" output-channel="splitArticleInChannel"/>
<channel id="splitArticleInChannel" />
<splitter input-channel="splitArticleInChannel" output-channel="splitArticleOutChannel" />
<channel id="splitArticleOutChannel" />
<payload-type-router resolution-required="true" input-channel="splitArticleOutChannel">
<mapping type="net.grogscave.example.domain.Article" channel="contentOutChannel" />
<mapping type="net.grogscave.example.domain.Staff" channel="staffOutChannel" />
</payload-type-router>
<channel id="contentOutChannel">
<queue capacity="10" />
</channel>
<channel id="staffOutChannel">
<queue capacity="10" />
</channel>
...
Затем я просто выполняю этот поток со следующим кодом в тестовом примере:
...
AbstractApplicationContext context = new ClassPathXmlApplicationContext(
"/META-INF/spring/split-agg-split.xml",
SplitAggSplitTests.class);
MessageChannel inputChannel = context.getBean("inputChannel",
MessageChannel.class);
PollableChannel contentOutChannel = context.getBean("contentOutChannel",
PollableChannel.class);
PollableChannel staffOutChannel = context.getBean("staffOutChannel",
PollableChannel.class);
inputChannel.send(new GenericMessage<String>("Dewey Wins!,A. Fool, C. Lewlis"));
logger.info("==> Article recieved: "
+ contentOutChannel.receive(0).getPayload());
for(int i = 0; i < 2; i++)
{
logger.info("==> Staff recieved: "
+ staffOutChannel.receive(0).getPayload());
}
...
Мой вывод журнала производит все три объекта.
С учетом всего сказанного, вы рассматривали возможность простого удаления дополнительного сплиттера / агрегатора и простого перемещения логики setAuthors в свой первый сплиттер? Я не знаю всех деталей вашего потока, но это может упростить ситуацию.