Spring Integration Java DSL示例

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

我尝试使用DSL来获得示例集成流–我称其为Rube Goldberg流 ,因为它在尝试大写作为输入传递的字符串时遵循复杂的路径。 该流程如下所示,并做了一些疯狂的事情来执行简单的任务:

卢布

  1. 它接受了这样的消息–“春天来了,你好”
  2. 将其拆分为单个词(您好,来自,春天,完整)
  3. 将每个单词发送到ActiveMQ队列
  4. 从队列中,单词片段由浓缩器拾取以大写每个单词
  5. 将响应放回响应队列
  6. 根据单词的原始顺序对其进行拾取,重新排序
  7. 聚合成一个句子(“ HELLO FROM SPRING INTEG”),
  8. 返回到应用程序。

从Spring Integration Java DSL开始,一个简单的基于Xml的配置将大写的String变为:

<channel id="requestChannel"/><gateway id="echoGateway" service-interface="rube.simple.EchoGateway" default-request-channel="requestChannel" /><transformer input-channel="requestChannel" expression="payload.toUpperCase()" />

这里没有什么大不了的事,消息传递网关接收从应用程序传递来的消息,在转换器中将其大写,然后将其返回给应用程序。

在Spring Integration Java DSL中表达这一点:

@Configuration
@EnableIntegration
@IntegrationComponentScan
@ComponentScan
public class EchoFlow {@Beanpublic IntegrationFlow simpleEchoFlow() {return IntegrationFlows.from("requestChannel").transform((String s) -> s.toUpperCase()).get();}
}@MessagingGateway
public interface EchoGateway {@Gateway(requestChannel = "requestChannel")String echo(String message);
}

请注意,@MessagingGateway批注不是Spring Integration Java DSL的一部分,它是Spring Integration中的现有组件,其作用与基于XML的配置中的网关组件相同。 我喜欢这样的事实,即可以使用类型安全的Java 8 lambda表达式而不是Spring-EL表达式来表示转换。 请注意,转换表达式可以用很少的其他方式进行编码:

??.transform((String s) -> s.toUpperCase())

要么:

??.<String, String>transform(s -> s.toUpperCase())

或使用方法引用:

??.<String, String>transform(String::toUpperCase)

再次从基于XML的配置开始,移至更复杂的Rube Goldberg流以完成相同的任务。 有两种配置来表达此流程:

rube-1.xml:此配置负责步骤1、2、3、6、7、8:

  1. 它接受了这样的消息–“春天来了,你好”
  2. 将其拆分为单个词(您好,来自,春天,完整)
  3. 将每个单词发送到ActiveMQ队列
  4. 从队列中,单词片段由浓缩器拾取以大写每个单词
  5. 将响应放回响应队列
  6. 根据单词的原始顺序对其进行拾取,重新排序
  7. 聚合成一个句子(“ HELLO FROM SPRING INTEG”),
  8. 返回到应用程序。
<channel id="requestChannel"/><!--Step 1, 8-->
<gateway id="echoGateway" service-interface="rube.complicated.EchoGateway" default-request-channel="requestChannel"default-reply-timeout="5000"/><channel id="toJmsOutbound"/><!--Step 2-->
<splitter input-channel="requestChannel" output-channel="toJmsOutbound" expression="payload.split('\s')"apply-sequence="true"/><channel id="sequenceChannel"/><!--Step 3-->
<int-jms:outbound-gateway request-channel="toJmsOutbound" reply-channel="sequenceChannel"request-destination="amq.outbound" extract-request-payload="true"/><!--On the way back from the queue-->
<channel id="aggregateChannel"/><!--Step 6-->
<resequencer input-channel="sequenceChannel" output-channel="aggregateChannel" release-partial-sequences="false"/><!--Step 7-->
<aggregator input-channel="aggregateChannel"expression="T(com.google.common.base.Joiner).on(' ').join(![payload])"/>

和rube-2.xml用于步骤4、5:

  1. 它接受了这样的消息–“春天来了,你好”
  2. 将其拆分为单个词(您好,来自,春天,完整)
  3. 将每个单词发送到ActiveMQ队列
  4. 从队列中,单词片段由浓缩器拾取以大写每个单词
  5. 将响应放回响应队列
  6. 根据单词的原始顺序对其进行拾取,重新排序
  7. 聚合成一个句子(“ HELLO FROM SPRING INTEG”),
  8. 返回到应用程序。
<channel id="enhanceMessageChannel"/><int-jms:inbound-gateway request-channel="enhanceMessageChannel" request-destination="amq.outbound"/><transformer input-channel="enhanceMessageChannel" expression="(payload + '').toUpperCase()"/>

现在,使用Spring Integration Java DSL表示Rube Goldberg流,配置又分为两部分:

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();}

和EchoFlowInbound.java:

@Bean
public JmsMessageDrivenEndpoint jmsInbound() {return new JmsMessageDrivenEndpoint(listenerContainer(), messageListener());
}@Bean
public IntegrationFlow inboundFlow() {return IntegrationFlows.from(enhanceMessageChannel()).transform((String s) -> s.toUpperCase()).get();
}

同样,这里的代码是完全类型安全的,并且在开发时而不是在运行时(如基于XML的配置)检查任何错误。 我再次喜欢这样一个事实,即转换,聚合语句可以使用Java 8 lamda表达式而不是Spring-EL表达式来简洁地表达。

我在这里未显示的是一些支持代码,用于设置activemq测试基础结构 ,该配置继续保留为xml,我已将此代码包含在示例github项目中。

总而言之,我很高兴看到这种使用纯Java来表达Spring Integration消息流的新方法,并且我期待看到它的持续发展,甚至可能尝试以较小的方式参与其发展。

这是github存储库中的整个工作代码:https://github.com/bijukunjummen/rg-si

资源和致谢:

  • Artem Bilan的 Spring Integration Java DSL 简介博客文章 :https://spring.io/blog/2014/05/08/spring-integration-java-dsl-milestone-1-released
  • Spring Integration Java DSL 网站和Wiki :https://github.com/spring-projects/spring-integration-extensions/wiki/Spring-Integration-Java-DSL-Reference。 我无耻地从这个Wiki复制了很多代码! 另外,非常感谢Artem 对我提出的问题的指导
  • Gary Russell在Spring Integration 4.0上的网络研讨会,其中详细介绍了Spring Integration Java DSL。

翻译自: https://www.javacodegeeks.com/2014/06/spring-integration-java-dsl-sample.html

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

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

相关文章

automake linux,Linux下automake软件编译与发布快速入门

Linux下automake软件编译与发布快速入门2008-04-22eNet&Ciweek进入编辑界面&#xff0c;输入内容如下&#xff1a;AUTOMAKE_OPTIONSforeignbin_PROGRAMSsimserver1 #软件包名称simserver1_SOURCESsimserver1.cpp  #源文件列表&#xff0c;如果有多个则用空格分开LIBS -l…

android fragmentactivity fragment,Android:Activity与Fragment通信(99%)完美解决方案

前言最近一直在想着能否有一种更好的方案来解决&#xff1a;Android中Activity与Fragment之间通信的问题&#xff0c;什么叫更好呢&#xff0c;就是能让Fragment的复用性高&#xff0c;性能还有好(不用反射)&#xff0c;代码还要好维护&#xff0c;不需要为每对Activity和Fragm…

分布式人工智能标记语言(DAIML)示例

DAIML&#xff08;Distributed Artificial Intelligence Markup Language&#xff09;是用于分布式人工智能系统中智能语言的标记库。DAIML主要分为Pattern和Template两部分&#xff0c;Pattern用于模式匹配&#xff0c;Template用于回答模板&#xff0c;下面将分别介绍两者的示…

Ext.js数据展示问题name展示code

出现以上问题是因为model中定义的类型跟数据库不匹配 去掉js中vehicleModel的type或者改为type:int即可。转载于:https://www.cnblogs.com/feifeicui/p/10438900.html

Solr中的前缀和后缀匹配

搜索引擎都是关于查找字符串的。 用户输入一个查询词&#xff0c;然后从反向索引中检索它。 有时&#xff0c;用户正在寻找的值只是索引中值的子字符串&#xff0c;并且用户可能也对这些匹配感兴趣。 对于德语这样的包含复合词&#xff08;例如Semmelkndel&#xff09;的语言&a…

使用FormData进行Ajax请求上传文件

Servlet3.0开始提供了一系列的注解来配置Servlet、Filter、Listener等等。这种方式可以极大的简化在开发中大量的xml的配置。从这个版本开始&#xff0c;web.xml可以不再需要&#xff0c;使用相关的注解同样可以完成相应的配置。 我笔记里也有记文件上传&#xff1a;https://w…

基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息

技术栈 jquery文件上传&#xff1a;jquery.fileupload&#xff0c;github 文档apk 文件解析&#xff1a;app-info-parser&#xff0c;github 文档参考&#xff1a;前端解析ipa、apk安装包信息 —— app-info-parser 支持功能 点击或拖拽上传 apk 文件校验文件类型及文件大小js …

调试以了解终结器

这篇文章涵盖了Java内置概念之一&#xff0c;称为Finalizer 。 这个概念实际上是众所周知的&#xff0c;也是众所周知的&#xff0c;这取决于您是否有足够的时间来仔细研究一下java.lang.Object类。 就在java.lang.Object本身中&#xff0c;有一个名为finalize&#xff08;&…

Zookeeper实现注册与发现

1.Zookeeper的数据模型 (1) Zookeeper的数据模型&#xff0c;类似于树形结构&#xff1a; (2) Zookeeper的每一个节点成为称为Znode&#xff0c;主要用来存储数据。 data : 存储数据信息。acl : 记录Znode的访问权限。child : 当前节点的子节点引用。stat &#xff1a;包含Zn…

class 命名规范

本文是从简书复制的, markdown语法可能有些出入, 想看"正版"和更多内容请关注 简书: 小贤笔记 注: 文章摘自 penggelies07- 简书, super晴天 - CSDN 常见class关键词 布局类&#xff1a;header, footer, container, main, content, aside, page, section 包裹类&am…

web策略类游戏开发(四)一个可以承载万人在线的架构

web策略类游戏开发(四)一个可以承载万人在线的架构 Webgame现在已经开始需要进入大统一服务器时代&#xff0c;每个游戏区域容纳的玩家数量将从现在的几万人发展到几十万人&#xff0c;因此在新的背景下&#xff0c;webgame如何处理大量用户的请求将成为问题。目前一台asp.net做…

复制物料时不复制安全库存

1.打开bos&#xff0c;选择物料-功能控制 2.把允许复制去掉 转载于:https://www.cnblogs.com/RogerLu/p/10441588.html

CSS实现水平垂直居中

1、需求分析 子元素在父元素中水平垂直居中 2、技术分析 基础的css、html 3、详细分析 如图: 3.1 HTML部分 如图所示&#xff0c;大边框内包含一个小边框两部分&#xff0c;设置一个父元素div和一个子元素div。 <div class"container">父元素<div class…

从Java连接到Cassandra

在我的帖子Hello Cassandra中 &#xff0c;我研究了如何下载Cassandra NoSQL数据库并使用cqlsh连接到Cassandra数据库。 在本文中&#xff0c;我将介绍从Java客户端连接到Cassandra数据库的基础知识。 尽管有几种可用于从Java访问Cassandra数据库的 框架 &#xff0c;但我将在…

Django---Model操作

一、字段 1 AutoField(Field)2 - int自增列&#xff0c;必须填入参数 primary_keyTrue3 4 BigAutoField(AutoField)5 - bigint自增列&#xff0c;必须填入参数 primary_keyTrue6 7 注&#xff1a;当model中如果没有自增列&#xff0c;则自动会创建…

Vuex的第一次接触

前言&#xff1a;最近在做Vue实现去哪网&#xff0c;想要实现在城市列表页面&#xff0c;点击某个城市的时候&#xff0c;主页的头部的城市会随着改变&#xff0c;就是首页和城市页面有共用的数据要分享&#xff0c;这里使用Vuex 1. Vuex是什么&#xff1f; 是Vue官方推荐的数…

java IO流小结

Java流操作有关的类或接口&#xff1a; Java流类图结构&#xff1a; 流的概念和作用 流是一组有顺序的&#xff0c;有起点和终点的字节集合&#xff0c;是对数据传输的总称或抽象。即数据在两设备间的传输称为流&#xff0c;流的本质是数据传输&#xff0c;根据数据传输特性将流…

华为android是什么型号,华为手机机型众多,目前这几款最值得入手

华为手机机型众多&#xff0c;目前这几款最值得入手2020-09-22 15:00:033点赞0收藏0评论华为手机可以说是国家手机的代名词。受某种感情的影响&#xff0c;很多人都用华为取代了iPhone。为了表达感情&#xff0c;很多人也纷纷效仿&#xff0c;购买华为手机。但我想说的是支持华…

pt-online-schema-change VS oak-online-alter-table【转】

前言 在上篇文章中提到了MySQL 5.6 Online DDL&#xff0c;如果是MySQL 5.5的版本在DDL方面是要付出代价的&#xff0c;虽然已经有了Fast index Creation&#xff0c;但是在添加字段还是会锁表的&#xff0c;而且在添加删除辅助索引是会加S锁&#xff0c;也就是无法进行写操作。…

vue命令行错误处理

全局安装vue/cli时&#xff1a;npm install -g vue/cli &#xff08;1&#xff09;Error: EACCES: permission denied, access /usr/local/lib/node_modules/vue/cli 原因: 执行命令时没有获得管理员权限 解决办法: 在命令前面加上sudo即可.然后输入电脑的管理员密码操作即可…