使用Spring集成组件在两个JMS队列之间关联消息

使用Spring集成组件在两个JMS队列之间关联消息,jms,spring-integration,spring-integration-dsl,Jms,Spring Integration,Spring Integration Dsl,我有两个JMS队列,我的应用程序使用JMS.messageDrivenChannelAdapter(…)组件订阅了这两个队列 第一个队列接收类型为Paid的消息。第二个队列接收类型为反转的消息 业务场景定义了付费类型和撤销类型的消息之间的相关性 冲销应等待支付后进行处理 如何使用Spring集成实现这种“等待”模式 是否可以在两个JMS队列之间关联消息?请参阅 聚合器使用某种关联策略关联消息,并基于某种发布策略发布组 聚合器通过关联和存储一组相关消息来组合一组相关消息,直到该组被认为是完整的。此

我有两个JMS队列,我的应用程序使用
JMS.messageDrivenChannelAdapter(…)
组件订阅了这两个队列

第一个队列接收类型为
Paid
的消息。第二个队列接收类型为
反转的消息

业务场景定义了
付费
类型和
撤销
类型的消息之间的相关性

冲销
应等待
支付
后进行处理

如何使用Spring集成实现这种“等待”模式

是否可以在两个JMS队列之间关联消息?

请参阅

聚合器使用某种关联策略关联消息,并基于某种发布策略发布组

聚合器通过关联和存储一组相关消息来组合一组相关消息,直到该组被认为是完整的。此时,聚合器通过处理整个组来创建单个消息,并将聚合消息作为输出发送

默认情况下,输出有效负载是分组消息有效负载的列表,但您可以提供自定义输出处理器

编辑

@springboot应用程序
公共类SO55299268应用程序{
公共静态void main(字符串[]args){
run(So55299268Application.class,args);
}
@豆子
公共集成流程in1(连接工厂连接工厂){
返回IntegrationFlows.from(Jms.messageDrivenChannelAdapter(connectionFactory)
.目的地(“队列1”))
.channel(“聚合器输入”)
.get();
}
@豆子
公共集成流程in2(连接工厂连接工厂){
返回IntegrationFlows.from(Jms.messageDrivenChannelAdapter(connectionFactory)
.目的地(“队列2”))
.channel(“聚合器输入”)
.get();
}
@豆子
公共集成流聚合器(){
返回f->f
.合计(a->a
.correlationExpression(“headers.jms\u correlationId”)
.releaseExpression(“size()==2”)
.expireGroupsUponCompletion(真)
.expireGroupsUponTimeout(真)
.groupTimeout(5_000L)
.discard通道(“discards.input”))
.handle(System.out::println);
}
@豆子
公共集成流丢弃(){
返回f->f.handle((p,h)->{
System.out.println(“对“+p”的聚合超时);
返回null;
});
}
@豆子
公共应用程序运行程序(JmsTemplate模板){
返回参数->{
发送(模板“一”、“二”);
发送(模板“三”,空);
};
}
私有void发送(JmsTemplate模板,字符串1,字符串2){
template.convertAndSend(“queue1”,one,m->{
m、 setJMSCorrelationID(一个);
返回m;
});
如果(两个!=null){
template.convertAndSend(“queue2”,两个,m->{
m、 setJMSCorrelationID(一个);
返回m;
});
}
}
}

GenericMessage[payload=[two,one],headers={jms\u redelivered=false,jms\u destination=queue://queue1,jms_correlationId=one,id=784535fe-8861-1b22-2cfa-cc2e67763674,优先级=4,jms_timestamp=1553290921442,jms_messageId=id:Gollum2.local-55540-1553290921241-4:1:3:1:1,timestamp=1553290921457}]

2019-03-22 17:42:06.460信息55396---[ask-scheduler-1]o.s.i.a.AggregatingMessageHandler:正在使用correlationKey[three]终止消息组

聚合超时三分钟


非常感谢你的回答。是否有任何代码示例可以展示聚合器的运行情况?我在答案中添加了一个简单的示例;聚合器有很多属性,因此您应该根据自己的需要来探索它们。非常感谢您提供的示例。如果我想关联自收到
冲销
后1周内发生的
已付
交易的消息,该怎么办?似乎我需要将其持久化到数据库中,并在需要关联时检索记录;请参阅
.messageStore(…)
。该框架提供了一个新的框架。