Spring integration Spring集成流DSL与SQS和Reactive
如何使用DSL为以下步骤设置反应流: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将消息引入通道时,将
SqsMessageDrivenChannelAdapter
Validate
方法验证Json消息[JsonSchemaValidator
类]BusinessService
:业务逻辑,状态机)发布者
,在测试中,发布者是订阅的
。但是,当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出站适配器。直到,这两个都被它们的反应对应物所取代,是吗