当前位置: 首页 > 知识库问答 >
问题:

未从句柄调用Spring集成流

瞿和硕
2023-03-14

我有以下2个组件,它们应该首先从Mongo中删除文档,然后从Elastic中删除。

主要流程:

@Component
public class DeleteDocumentFlow {

    @Autowired
    private StoreInMongoFlow storeInMongoFlow;

    @Bean
    public IntegrationFlow deleteDocument() {
        return IntegrationFlows.from(Channels.METADATA_DELETE_STATUS.name())
                .handle(storeInMongoFlow.deleteDocumentInMongo())
                .channel("deleteDocumentInES.input")
                .get();
    }
}

服务:

@Component
public class StoreInMongoFlow {
    @Bean
    public IntegrationFlow deleteDocumentInMongo() {
        return flow -> flow.
                <Metadata>handle((p, h) -> {
                    DBObject obj = BasicDBObjectBuilder.start("i", p.getId()).get();
                    DeleteResult documentEntry = this.mongoTemplate.remove(obj, "docs");
                    return documentEntry.getDeletedCount();
                })
                .log(LoggingHandler.Level.INFO, m -> "Number of documents deleted: " + m.getPayload());
    }
}

不幸的是,deleteDocumentInMongo从未被调用。我可以在日志中看到bean已正确注册。

我是做错了什么,还是你需要更多的调试信息?如果我窃听手柄,则deleteDocumentInES。执行输入,但忽略mongo流。

共有1个答案

戚阳曜
2023-03-14

你肯定做了一些根本错误的事情。您试图将一个集成流(IntegrationFlow)视为一个服务,从句柄()调用。这不是设计集成流的目的。有关更多信息,请参阅文档:https://docs.spring.io/spring-integration/docs/current/reference/html/dsl.html#java-数字用户线

DSL提供了一个IntegrationFlow组件来定义通道和它们之间endpoint的组合,但现在IntegrationFlow只起配置作用,在应用程序上下文中填充真正的bean,并且在运行时不使用。

如果您将逻辑声明为单独的IntegrationFlow,则无需担心句柄()-只需使用通道("deleteDocumentInMongo.input")将消息从主流点发送到该MongoDB子流的第一个通道。

如果你想用Elastic做同样的操作,你应该考虑用一个PublishSubscribeChannel来发送一条消息和从这个通道开始的两个流。

由于您用log()结束了deleteDocumentInMongo流,因此您无法得到任何回复和您的。无法访问频道(“deleteDocumentInES.input”)

请阅读更多文档,了解什么是发布订阅、请求回复、服务激活器和流本身。

 类似资料:
  • 我使用Spring boot 1.5.7 我还没有配置CommonMultipartResolver,因为Spring Boot已经处理了文件上传。 如果我的上载超过允许的最大大小,则会抛出一个丑陋的异常。 这由我的控制器处理。 这种处理不仅复杂,而且很遗憾是特定于Tomcat的,因为SizeLimitExceededException位于包。 我如何处理这种错误情况,即无论使用哪个Servlet

  • 我正在使用Spring WebFlux webclient进行REST调用。我将连接超时配置为毫秒,相应地: 方法将为每个/响应代码返回一个空的。如何对连接超时甚至读/写超时进行相同的操作。目前,它只是抛出一个,而不处理该异常

  • 我试图捕获一个,其中包含XML规则中不允许使用的字符。(例如,” 我已经阅读了描述方法的Javadoc。但是,我没有看到它无法捕获ValidationEvent。 从指定的InputStream中解组XML数据并返回结果内容树。使用此形式的解组API时,验证事件位置信息可能不完整。 在最后一次尝试中,我尝试在网上搜索,但什么也找不到<任何帮助都将不胜感激:D 我很抱歉补充一个问题。(POJO类有点

  • 如果其他人已经解决了这个问题,那就只是寻找一些信息。我想同时使用Spring集成和Spring批处理。这两个都是SpringBoot应用程序,理想情况下,我希望将它们和各自的配置分开,这样它们都是自己的可执行jar。我在自己的进程空间中执行它们时遇到问题,我相信我希望,除非有人能说服我,否则,每个程序都能像自己的Spring Boot应用程序一样运行,并用自己的配置文件和属性初始化自己。不过,我遇

  • 动机:我需要在路由到Sftp出站网关之前设置委托SessionFactory的threadKey,然后取消设置threadKey。 根据租户的不同,我需要使用不同的Sftp用户帐户。在我的应用程序中,用户帐户是一个配置问题。yml,我不想为每个新租户写单独的路由。 设置threadKey需要

  • 问题内容: 有谁知道如何获取由Spring Boot创建的Hibernate SessionFactory的句柄? 问题答案: 你可以使用以下方法完成此操作: 其中,entityManagerFactory是一个JPA 。