如何创建自定义组件并将其添加到 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 可以在那些我们没有明确定义的地方创建 DirectChannels。或者我们也可以依赖 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 关于此事。

所以,你应该找到很多论据来说服我以这种方式扩展框架:-)。