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

在较早的博客文章中,我谈到了虚拟卢布·戈德堡流程,该流程通过一系列复杂的步骤将字符串变成大写,本文的前提是引入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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冯诺依曼计算机结构教案,冯诺依曼结构的计算机-同济大学精品课程.PPT

冯诺依曼结构的计算机-同济大学精品课程* 第一章 概 述 同济大学软件学院 课程的内容: 1.介绍单计算机系统的硬件组成 (内部结构、工作机制) 2.计算机自动工作的原理 3.在对工作原理了解的基础上,讲述有关计算机设 计的…

非安装版的PostgreSQL8.3.3的首次使用经历

第一次用Postgre,已经是好多年以前了,隐约记得是在linux下边,build半天,然后手动配置库文件之类。 今天在整理资料的时候发现,Postgre出现了解压缩直接使用的版本,上边注明了for expert only. 呵呵&#xf…

腾讯TBS X5 WebView的简单使用

工作中经常涉及H5网页的加载工作,最多使用的就是安卓系统控件WebView,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久,体验很差。 那能不能边加…

针对新手的Java EE7和Maven项目–第5部分–使用Arquillian / Wildfly 8进行单元测试

从前面的部分恢复 第1 部分 , 第2 部分 , 第3 部分 , 第4部分 , 这是第一篇“额外”的帖子,基于我正在此系列博客文章上“构建”的Maven JavaEE7演示项目。 我们已经定义了一个坚实的结构和一些模块。 在这样的应用程…

C/S,B/S的区别与联系

C/S 是Client/Server 的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用 大型数据库系统,如Oracle、Sybase、Informix 或SQL Server。客户端需要安装专用的客户 端软件。 B/S是Brower/Server 的缩写,客户机上只要安装一个…

五年级下册电子计算机与多媒体,语文人教版五年级下册《电子计算机与多媒体》.doc...

《电子计算机与多媒体》教学设计沈彦坤 石家庄市鹿泉区石井乡封庄小学?一、概述??语文,五年级五年级下册,第一课时熟悉课文内容,学会生字,理解新词意思,学习课文1-3段。了解计算机的产生与发展,了解什么是多媒体,计算机与多媒体…

Airflow安装与使用

# Airflow 1.10安装本次安装Airflow版本为1.10,其需要依赖Python和DB,本次选择的DB为Mysql。本次安装组件及版本如下:Airflow 1.10.0Python 3.6.5Mysql 5.7# 整体流程1. 建表2. 安装3. 配置4. 运行5. 配置任务启动scheduleairflow schedul…

Wordpress安装

Wordpress是一种用PHP语言和MySQL的数据库的开源的免费Blog引擎,用户可以在支持PHP和MySQL数据库的服务器上建立自己的Blog,它具有非常强大的功能和成千上万的插件和模板主题。安装步骤如下(本文以Wordpress2.6中文版为例): (1) 在MySQL中创建Wordpress库&#xff0…

python 内置标准库socketserver模块的思考

socketserver模块简化了编写网络服务器的任务, 在很大程度上封装了一些操作, 你可以看成是事件驱动型的设计, 这很不错。它定义了两个最基本的类--服务器类 BaseServer, 请求处理类 BaseRequestHandler. BaseServer 基本服务器类封装了基本的一些socket操作, socket原语中对so…

关于素数的一些定理

1.何谓素数? 指在一个大于1的整数中,如果一个数只能整除1与本身,则该数为素数(质数),否则为合数。 1既不是素数也不是合数 2.素数个数无限多 3.所有大于2的素数都可以唯一的表示为两个平方数之差 pa^2-b^2(…

教师节的感触

刚喝了点酒,因为今天是教师节,我觉得博客是一个很好的平台,可以把自己的一些感想就是的发表出来。把音乐放出来一 边写着博客是一种很自我的感觉,可以在微酣的时候把自己的点滴感受好好的梳理一下倒是一种不错的方式。这是自己第一…

Spring 4.1和Java 8:java.util.Optional

由于Spring 4.1的Java 8的的java.util.Optional ,容器对象可能会或可能不包含非空值,支持与RequestParam , RequestHeader和MatrixVariable 。 使用Java 8的java.util.Optional请确保参数永远不会为null 。 请求参数 在此示例中,…

计算机网络层实验路由表苏州科技,苏州科技大学计算机网络实验报告课案.docx...

苏州科技大学计算机网络实验报告课案苏州科技学院 电子信息实验中心实验报告课  程计算机网络原理学    名徐金玮班  级计算机1312专  业计算机科学与技术指导教师陶滔学年 / 学期2015~2016学年第一学期实验一 物理层实验实验项目性质:设计性  计划学…

Fibonacci again and again

Fibonacci again and again http://acm.hdu.edu.cn/showproblem.php?pid1848 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12494 Accepted Submission(s): 5439 Problem Description任何一个大学生对菲波那…

使用闭包的方式实现一个累加函数 addNum

使用闭包的方式实现一个累加函数 addNum,参数为 number 类型,每次返回的结果 上一次计算的值 传入的值,如: addNum(10); //10 addNum(12); //22 addNum(30); //52 写法一 1 function sum(numberOne) {2 var count…

妈妈的菜谱-豉油鸡

我妈周末来我家,给我做一道豉油鸡,我记录下来,分享给大家 1、下午四点半左右,我、老弟以及亲妈,到隔壁市场鸡场,挑选了一只类似的芦花阉鸡活鸡,价格是17块钱每斤,大概三斤多点&#…

【Vegas2008】9月19日-青椒炒南瓜

南瓜,在俺们家,宁夏也叫葫芦。这道菜泡米饭相当好吃。 主料:青椒、南瓜 配料:葱、姜 调料:盐、味精、胡椒粉 做法:1,南瓜切块,青椒切块;2,油烧至6成熟&#x…

计算机机房t4,机房等级-T2-T3-T4-如何划分

如何在众多的IDC服务商中的辨别出服务器和机房环境的好坏呢?小编告诉大家有这么个指标是我们在选购服务器的时候可以参考,且具有权威性的。国际正常时间协会(the Uptime Institute,简称UI)依据数据中心基础设施的可用性把机房划分为四个级别&#xff1a…

在N + 1场景中使用@NamedEntityGraph更有选择地加载JPA实体

N 1问题是使用ORM解决方案时的常见问题。 当您将某些OneToMany关系的fetchType设置为lazy时,会发生这种情况,以便仅在访问Set / List时才加载子实体。 假设我们有一个具有两个关系的Customer实体:每个客户的一组订单和一组地址。 OneToMany…

JetBrains系列IDE快捷键大全(转载)

编辑 快捷键组合说明Ctrl Space代码自动完成提示(选择)Alt Enter显示意图动作和快速修复Ctrl P参数信息 (在调用方法参数忘记的时候,提示)Ctrl Q快速查找文件,可以查找当前类定义的文件等Ctrl 鼠标滑过…