如何创建自定义组件并将其添加到spring java dsl中?

时间:2015-07-25 12:36:04

标签: spring-integration

我想创建一个客户组件trace()并希望在流程中使用它。

CustomFlows.from("").trace().get();

这样的东西 你能建议我怎么做吗?似乎IntegrationFlowDefinition已关闭且无法扩展。

1 个答案:

答案 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

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