我想创建一个客户组件trace()并希望在流程中使用它。
像CustomFlows.from("").trace().get();
答案 0 :(得分:1)
这是一项有趣的技术......但是现在我并不相信我们应该允许FlowBuilder
这样的扩展......
请随意就此问题提出GitHub问题,我们将来会看到如何解决这个问题。
对于这样的扩展,您应该了解框架如何在后台运行。
让我们考虑最简单的组件.bridge()
!其目标是将消息从一个通道转移到另一个通道。因此,此组件属于request-reply
类型,并且必须与其两侧的两个通道绑定:
.channel()
.bridge()
.channel()
当然DSL可以在那些我们没有定义明确的地方的地方创建DirectChannel
。或者我们也可以依赖replyChannel
标题,如果我们完成我们的结尾 - .get()
。等等。
BridgeHandler
是一个开箱即用的组件,这就是我们提供
显式DSL方法。
但从另一方面来说,它的代码非常简单:
public class BridgeHandler extends AbstractReplyProducingMessageHandler {
@Override
public String getComponentType() {
return "bridge";
}
@Override
protected Object handleRequestMessage(Message<?> requestMessage) {
return requestMessage;
}
@Override
protected boolean shouldCopyRequestHeaders() {
return false;
}
}
如您所见,它是MessageHandler
实现,因此我们可以直接使用它:
.handle(new BridgeHandler())
从这里向我提出问题:如果您可以使用现有功能达到要求,那么为框架带来一些复杂性的原因是什么:实施MessageHandler
,扩展AbstractPayloadTransformer
。或者甚至只是忘掉它们并使用POJO方法调用来完成所有事情,就像DSL 1.1
一样:
@Override
protected IntegrationFlowDefinition<?> buildFlow() {
return from(this, "messageSource", e -> e.poller(p -> p.trigger(this::nextExecutionTime)))
.split(this)
.transform(this)
.aggregate(a -> a.processor(this, null), null)
.enrichHeaders(Collections.singletonMap("foo", "FOO"))
.filter(this)
.handle(this)
.channel(c -> c.queue("myFlowAdapterOutput"));
}
关于此事,请参阅我的article。
所以,你应该找到许多论据来说服我以这种方式扩展框架: - )。