在较早的博客文章中,我谈到了虚拟卢布·戈德堡流程,该流程通过一系列复杂的步骤将字符串变成大写,本文的前提是引入Spring Integration Java DSL,作为通过xml配置文件定义集成流程的替代方法。

感谢Artem Bilan ,在写完博客条目后,我学到了一些新东西,并希望在此处记录这些学习内容:

因此,首先是我的原始样本,在这里,我有以下流程(粗体显示):

  1. 接受此类消息-“春天来了,你好”
  2. 将其拆分为单个词(您好,来自,春天,完整)
  3. 将每个单词发送到ActiveMQ队列
  4. 从队列中拾取单词片段并大写每个单词
  5. 将响应放回响应队列
  6. 提取消息,根据单词的原始顺序重新排序
  7. 聚合成一个句子(“ HELLO FROM SPRING INTEG”),然后
  8. 将句子返回给调用应用程序。

EchoFlowOutbound.java:

@Beanpublic DirectChannel sequenceChannel() {return new DirectChannel();}@Beanpublic DirectChannel requestChannel() {return new DirectChannel();}@Beanpublic IntegrationFlow toOutboundQueueFlow() {return IntegrationFlows.from(requestChannel()).split(s -> s.applySequence(true).get().getT2().setDelimiters("\\s")).handle(jmsOutboundGateway()).get();}@Beanpublic IntegrationFlow flowOnReturnOfMessage() {return IntegrationFlows.from(sequenceChannel()).resequence().aggregate(aggregate ->aggregate.outputProcessor(g ->Joiner.on(" ").join(g.getMessages().stream().map(m -> (String) m.getPayload()).collect(toList()))), null).get();}@Bean
public JmsOutboundGateway jmsOutboundGateway() {JmsOutboundGateway jmsOutboundGateway = new JmsOutboundGateway();jmsOutboundGateway.setConnectionFactory(this.connectionFactory);jmsOutboundGateway.setRequestDestinationName("amq.outbound");jmsOutboundGateway.setReplyChannel(sequenceChannel());return jmsOutboundGateway;
}

事实证明,根据Artem Bilan的反馈,这里可以优化一些事情。

首先,请注意我是如何明确定义两个直接通道的:“ requestChannel”(用于启动接收字符串消息的流)和“ sequenceChannel”(用于在消息从jms消息队列返回后处理消息),实际上可以完全删除并这种方式使流程更加简洁:

@Bean
public IntegrationFlow toOutboundQueueFlow() {return IntegrationFlows.from("requestChannel").split(s -> s.applySequence(true).get().getT2().setDelimiters("\\s")).handle(jmsOutboundGateway()).resequence().aggregate(aggregate ->aggregate.outputProcessor(g ->Joiner.on(" ").join(g.getMessages().stream().map(m -> (String) m.getPayload()).collect(toList()))), null).get();
}@Bean
public JmsOutboundGateway jmsOutboundGateway() {JmsOutboundGateway jmsOutboundGateway = new JmsOutboundGateway();jmsOutboundGateway.setConnectionFactory(this.connectionFactory);jmsOutboundGateway.setRequestDestinationName("amq.outbound");return jmsOutboundGateway;
}

现在仅通过声明其名称即可隐式创建“ requestChannel”。 序列频道更有趣,引用了Artem Bilan –

不要为AbstractReplyProducingMessageHandler指定outputChannel并依赖DSL

这意味着jmsOutboundGateway是一个AbstractReplyProducingMessageHandler,其答复通道是由DSL隐式派生的。 进一步地,两种方法被合而为一,这两种方法较早地处理了将消息发送到队列然后在消息返回时继续进行的流程。 恕我直言,由于这一变化,它的确读得更好。

第二个不错的变化是本文介绍的主题是Jms命名空间工厂,当我写上一篇博客文章时,DSL支持定义AMQ入站/出站适配器/网关,现在支持基于Jms的入站/ adapter适配器/网关,这进一步简化了流程,流程现在看起来像这样:

@Bean
public IntegrationFlow toOutboundQueueFlow() {return IntegrationFlows.from("requestChannel").split(s -> s.applySequence(true).get().getT2().setDelimiters("\\s")).handle(Jms.outboundGateway(connectionFactory).requestDestination("amq.outbound")).resequence().aggregate(aggregate ->aggregate.outputProcessor(g ->Joiner.on(" ").join(g.getMessages().stream().map(m -> (String) m.getPayload()).collect(toList()))), null).get();
}

该流的入站Jms部分还简化为以下内容:

@Bean
public IntegrationFlow inboundFlow() {return IntegrationFlows.from(Jms.inboundGateway(connectionFactory).destination("amq.outbound")).transform((String s) -> s.toUpperCase()).get();
}

因此,总而言之,Spring Integration Java DSL是一种简洁配置Spring Integration流的令人兴奋的新方法。 如何简化流的可读性已经令人印象深刻,Jms名称空间工厂的引入使基于JMS的流更进一步。

  • 我已经用本文列出的更改更新了示例应用程序– https://github.com/bijukunjummen/rg-si。

翻译自: https://www.javacodegeeks.com/2014/07/spring-integration-java-dsl-sample-further-simplification-with-jms-namespace-factories.html

Spring Integration Java DSL示例–使用Jms名称空间工厂进一步简化相关推荐

  1. Spring Integration Java DSL示例

    现在已经为Spring Integration引入了新的基于Java的DSL ,这使得可以使用基于纯Java的配置而不是基于Spring XML的配置来定义Spring Integration消息流. ...

  2. spring集成mq_使用Spring Integration Java DSL与Rabbit MQ集成

    spring集成mq 我最近参加了在拉斯维加斯举行的2016年Spring大会 ,很幸运地看到了我在软件世界中长期敬佩的一些人. 我亲自遇到了其中的两个人,他们实际上合并了几年前我与Spring In ...

  3. 使用Spring Integration Java DSL与Rabbit MQ集成

    我最近参加了在拉斯维加斯举行的2016年Spring会议 ,很幸运地看到了我在软件世界中长期敬佩的一些人. 我亲自遇到了其中的两个人,他们实际上合并了几年前我与Spring Integration相关 ...

  4. RabbitMQ –使用Spring集成Java DSL串行处理消息

    如果您曾经需要使用RabbitMQ来串行处理消息,并且有一群监听器来处理消息,那么我所看到的最好方法是在监听器上使用"独占消费者"标志,每个监听器上有1个线程来处理消息. 专用使用 ...

  5. java中channelmessage,MessageStore支持的QueueChannel与Spring Integration Java Config

    Spring Integration reference guide指的是使用MessageStore实现为QueueChannel提供持久性. 提到了很多次,但是所有示例都使用XML配置,即 但是Q ...

  6. spring配置详解-属性注入(p名称空间SPEL表达式)

    所谓了解的话讲了一般是不会用的,看一下了解的注入方式,还有一种叫p名称空间注入方式,是Spring最近发出来的,因为Bean注入方式已经深入人心了,所以后面这两种注入方式,哪怕是好,也不愿意去用,因为 ...

  7. Spring Integration 4.0:完整的无XML示例

    1.简介 Spring Integration 4.0终于发布了 ,并且此版本具有非常好的功能. 本文介绍的一种可能性是完全不使用XML即可配置集成流程. 那些不喜欢XML的人仅使用JavaConfi ...

  8. Spring Integration –轮询文件的创建和修改

    1引言 文件支持是Spring Integration与外部系统通信的另一个端点. 在这种情况下,它提供了几个组件来读取,写入和转换文件. 在这篇文章中,我们将编写一个监视目录的应用程序,以便读取其中 ...

  9. Spring认证指南:如何构建使用Spring Integration来获取数据

    原标题:如何构建使用Spring Integration来获取数据,处理数据并将其写入文件的应用程序.(Spring中国教育管理中心) 本指南将引导您完成使用 Spring Integration 创 ...

最新文章

  1. 用axis开发webservice实践
  2. 大厂程序员年薪_程序员羡慕深圳老师的待遇:年薪25万起,请问哪个科技厂可以比...
  3. android编程读取sd卡txt文件,如何读取SD卡中的txt文件?
  4. phper必知必会之类库自动加载的七种方式(三)
  5. js方法点击复制文本
  6. pandas中read_csv的缺失值处理
  7. TCP/IP协议与Http协议的区别
  8. 万稞pw80线切割编程软件_数控编程软件(CAM)大盘点,你选用的哪种?
  9. 信息化分析:集团企业信息化规划和实施研究
  10. docker---docker save
  11. 【Linux】编辑器vim的育婴式教程(勉强够用)
  12. 搜狗收录怎么增加-搜狗站长推送工具
  13. linux 多个文件内容查找,Linux 根据一个文件内容查找另一个文件中的内容
  14. 视频教程-深度学习与PyTorch入门实战教程-深度学习
  15. python笔记:数据分析的实际应用 工具小记
  16. 学习Simulink(主要面向电力电子和电力系统分析)笔记(长期更新)
  17. 中计算机软件,以下软件中属于计算机应用软件的是( )。
  18. 什么是异常?异常的详细介绍
  19. SAP MM 事务代码VL04为STO创建外向交货单
  20. 折腾amd加持的tensorflow和keras

热门文章

  1. IDEA使用笔记(八)——自动生成 serialVersionUID 的设置
  2. mysql 密码hash算法_如何用hash创建一个mySQL用户(‘sha256’,$salt.$password)?
  3. java设计模式代理模式_Java中的代理设计模式
  4. 顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...
  5. java登录界面命令_Java命令行界面(第12部分):CLAJR
  6. flowable背压 取消_使用Flowable.generate()生成可感知背压的流– RxJava常见问题解答...
  7. javadocs_不会吸引人的JavaDocs源样本
  8. svn: 没有演进历程信息_使用默认方法的接口演进–第二部分:接口
  9. input发送a.jax_Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型
  10. jms.jar 2.0_JMS 2.0中JMSContext的类型