如何创建自定义组件并将其添加到 spring java dsl 中?
How to create custom component and add it to flow in spring java dsl?
我想创建一个客户组件 trace() 并想在流程中使用它。
类似于CustomFlows.from("").trace().get();
你能建议我怎么做吗?似乎 IntegrationFlowDefinition 已关闭且不可扩展。
这是一项有趣的技术...但是现在我不相信我们应该允许 FlowBuilder
...
欢迎就此事提出 GitHub 问题,我们将在未来看到如何处理。
对于这样的扩展,您应该了解框架在后台的工作方式。
让我们考虑最简单的组件.bridge()
!它的目标是将消息从一个通道传输到另一个通道。因此,此组件属于 request-reply
类型,并且必须与其两侧的这两个通道相关联:
.channel()
.bridge()
.channel()
当然,DSL 可以在那些我们没有明确定义的地方创建 DirectChannel
s。或者我们也可以依赖 replyChannel
header,如果我们以其结尾 - .get()
结束流程。等等。
BridgeHandler
是一个 out-of-the-box 组件,这就是我们提供
明确的 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 关于此事。
所以,你应该找到很多论据来说服我以这种方式扩展框架:-)。
我想创建一个客户组件 trace() 并想在流程中使用它。
类似于CustomFlows.from("").trace().get();
你能建议我怎么做吗?似乎 IntegrationFlowDefinition 已关闭且不可扩展。
这是一项有趣的技术...但是现在我不相信我们应该允许 FlowBuilder
...
欢迎就此事提出 GitHub 问题,我们将在未来看到如何处理。
对于这样的扩展,您应该了解框架在后台的工作方式。
让我们考虑最简单的组件.bridge()
!它的目标是将消息从一个通道传输到另一个通道。因此,此组件属于 request-reply
类型,并且必须与其两侧的这两个通道相关联:
.channel()
.bridge()
.channel()
当然,DSL 可以在那些我们没有明确定义的地方创建 DirectChannel
s。或者我们也可以依赖 replyChannel
header,如果我们以其结尾 - .get()
结束流程。等等。
BridgeHandler
是一个 out-of-the-box 组件,这就是我们提供
明确的 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 关于此事。
所以,你应该找到很多论据来说服我以这种方式扩展框架:-)。