Spring integration Spring集成流DSL与SQS和Reactive

Spring integration Spring集成流DSL与SQS和Reactive,spring-integration,spring-webflux,spring-integration-dsl,spring-integration-aws,Spring Integration,Spring Webflux,Spring Integration Dsl,Spring Integration Aws,如何使用DSL为以下步骤设置反应流: 使用SqsMessageDrivenChannelAdapter 使用Validate方法验证Json消息[JsonSchemaValidator类] 将json转换为对象 将对象传递给服务激活器(BusinessService:业务逻辑,状态机) 持久化对象R2DBC出站适配器 我在看这个: 在上面的示例中,创建了一些专用流,这些流返回发布者,在测试中,发布者是订阅的。但是,当SqsMessageDrivenChannelAdapter将消息引入通道时,将

如何使用DSL为以下步骤设置反应流:

  • 使用
    SqsMessageDrivenChannelAdapter
  • 使用
    Validate
    方法验证Json消息[
    JsonSchemaValidator
    类]
  • 将json转换为对象
  • 将对象传递给服务激活器(
    BusinessService
    :业务逻辑,状态机)
  • 持久化对象R2DBC出站适配器
  • 我在看这个:

    在上面的示例中,创建了一些专用流,这些流返回
    发布者
    ,在测试中,发布者是
    订阅的
    。但是,当
    SqsMessageDrivenChannelAdapter
    将消息引入通道时,将触发my flow

    对于上述步骤1至5的场景,如何实现反应流配置

    更新:添加示例代码

    @Bean
    公共集成流导入流(){
    IntegrationFlows.from(sqsInboundChannel())
    .handle((有效负载,messageHeaders)->jsonSchemaValidator.validate(有效负载.toString())
    .transform(Transformers.fromJson(Entity.class))
    .handle((有效负载,messageHeaders)->businessService.process((实体)有效负载))
    .处理(
    Jpa.outboundAdapter(this.entityManagerFactory)
    .entityClass(实体)
    .persistMode(persistMode.PERSIST),
    ConsumerEndpointSpec::transactional)
    .get();
    }
    @豆子
    公共消息生产者sqsMessageDrivenChannelAdapter(){
    SqsMessageDrivenChannelAdapter SqsMessageDrivenChannelAdapter=
    新的SqsMessageDrivenChannelAdapter(asyncSqsClient,queueName);
    sqsMessageDrivenChannelAdapter.setAutoStart(true);
    setOutputChannel(sqsInboundChannel());
    返回sqsMessageDrivenChannelAdapter;
    }
    @豆子
    public MessageChannel sqsInboundChannel(){
    返回MessageChannels.flux().get();
    }
    
    更新2:使用执行器通道将JPA移动到差异线程

    @Bean
    公共集成流导入流(){
    IntegrationFlows.from(sqsInboundChannel())
    .handle((有效负载,messageHeaders)->jsonSchemaValidator.validate(有效负载.toString())
    .transform(Transformers.fromJson(Entity.class))
    .handle((有效负载,messageHeaders)->businessService.process((实体)有效负载))
    .channel(persistChannel())
    .处理(
    Jpa.outboundAdapter(this.entityManagerFactory)
    .entityClass(实体)
    .persistMode(persistMode.PERSIST),
    ConsumerEndpointSpec::transactional)
    .get();
    }
    @豆子
    公共消息生产者sqsMessageDrivenChannelAdapter(){
    SqsMessageDrivenChannelAdapter SqsMessageDrivenChannelAdapter=
    新的SqsMessageDrivenChannelAdapter(asyncSqsClient,queueName);
    sqsMessageDrivenChannelAdapter.setAutoStart(true);
    setOutputChannel(sqsInboundChannel());
    返回sqsMessageDrivenChannelAdapter;
    }
    @豆子
    public MessageChannel sqsInboundChannel(){
    返回MessageChannels.flux().get();
    }
    @豆子
    public MessageChannel persistChannel(){
    return MessageChannels.executor(Executors.newCachedThreadPool()).get();
    }
    
    您可能需要更加熟悉到目前为止我们在Spring Integration中针对反应流所做的工作:

    您使用该测试类显示的示例与您的用例完全不相关。在该测试中,我们试图涵盖我们在Spring集成中公开的一些API,类似于单元测试。它与整个流程无关

    您的用例实际上只是一个完整的黑盒流,从SQS listener开始,到R2DBC结束。因此,在您的流程中,没有必要尝试将部分内容转换为
    发布者
    ,然后将其带回流程的另一部分:您不需要跟踪某些方式并自己订阅该
    发布者

    您可以考虑在流中的端点之间放置<代码> FrxMeaseChanks<代码>,但对您的用例仍然没有意义。仅仅因为

    org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer
    在消费者线程上没有阻塞,以便为来自下游的背压做好准备,它就不会像您期望的那样完全响应

    流中唯一真正反应性的部分是R2DBC出站通道适配器,但它可能不会给您带来太多价值,因为数据源不是反应性的


    正如我所说:您可以尝试在
    SqsMessageDrivenChannelAdapter
    定义之后放置
    通道(通道->通道.flux())
    ,从该点开始反应流。同时,您应该尝试将
    maxNumberOfMessages
    设置为
    1
    ,使其在从SQS中提取下一个mesasge之前等待一个可用空间。

    您编写了什么代码?我已使用该代码更新了原始帖子我已在帖子中添加了一个示例代码。在上面的流中,由于
    sqsInboundChannel
    是一个流量通道,它应该启动一个反应流,然后将每个
    .handle
    链接到
    sqsInboundChannel
    是否正确?。在这个场景中,即上面的代码,每个处理程序是否应该接受并返回一个
    Mono
    ?例如,
    jsonSchemaValidator.validate
    ?目前在上述代码中还有两个非反应性组件--
    SimpleMessageListenerContainer
    和JPA出站适配器。直到,这两个都被它们的反应对应物所取代,是吗