spring 长轮询_Spring集成文件轮询和测试

spring 长轮询

我最近实施了一个小项目,在该项目中,我们必须轮询文件夹中的新文件,然后在文件内容上触发服务流。

Spring Integration非常适合此要求,因为它带有一个通道适配器 ,该适配器可以扫描文件夹中的新文件,然后通过消息传递流程获取文件。

本文的目的是介绍如何测试文件轮询器流。

首先考虑使用以下Spring集成配置实现的简单流程:

<beans:beans xmlns="http://www.springframework.org/schema/integration".....<channel id="fileChannel"></channel><channel id="processedFileChannel"></channel><int-file:inbound-channel-adapter directory="${inbound.folder}" channel="fileChannel" filename-pattern="*.*"><poller fixed-delay="5000"></poller></int-file:inbound-channel-adapter><service-activator input-channel="fileChannel" ref="fileHandlerService" method="handle" output-channel="processedFileChannel"></service-activator><logging-channel-adapter id="loggingChannelAdapter" channel="processedFileChannel"></logging-channel-adapter><beans:bean name="fileHandlerService" class="files.RealFileHandlingService"/><context:property-placeholder properties-ref="localProps" local-override="true"/><util:properties id="localProps"></util:properties>
</beans:beans>

在图中更好地表示了这一点:

流程简单测试

现在要测试此流程,我的第一种方法是将示例文件放入类路径中的文件夹中,在测试过程中动态发现并使用该文件夹名称,并将最终消息写入测试通道,并对进入该通道的消息进行断言。 这就是组成原始Spring配置的测试配置的样子:

<beans:beans xmlns="http://www.springframework.org/schema/integration"....<beans:import resource="si-fileprocessing.xml"/><util:properties id="localProps"><beans:prop key="inbound.folder">#{new java.io.File(T(java.io.File).getResource("/samplefolder/samplefile.txt").toURI()).parent}</beans:prop></util:properties><channel id="testChannel"><queue/></channel><bridge id="loggingChannelAdapter" input-channel="processedFileChannel" output-channel="testChannel"></bridge>
</beans:beans>

测试看起来像这样:

@Autowired @Qualifier("testChannel") PollableChannel testChannel;@Test
public void testService() throws Exception{Message<?> message = this.testChannel.receive(5000);assertThat((String)message.getPayload(), equalTo("Test Sample file content"));
}

这可以很好地工作,尤其要注意,可以使用Spring-EL表达式在配置中完全提供路径:

#{new java.io.File(T(java.io.File).getResource("/samplefolder/samplefile.txt").toURI()).parent}

模拟服务

现在,进一步介绍一下,如果我想模拟正在处理文件的服务(files.RealFileHandlingService),该怎么办。 一旦实现了模拟,这里就会出现一个问题。 注入模拟服务的一种方法是使用Mockito和它提供的帮助程序功能,以使用Spring配置文件通过这种方式创建模拟:

<beans:bean name="fileHandlerService" factory-method="mock" class="org.mockito.Mockito"><beans:constructor-arg value="files.FileHandlingService"></beans:constructor-arg>
</beans:bean>

创建此模拟bean之后,可以通过以下方式在junit的@Before注释方法中添加模拟行为:

@Before
public void setUp() {when(fileHandlingServiceMock.handle((File)(anyObject()))).thenReturn("Completed File Processing");
}@Test
public void testService() throws Exception{Message<?> message = this.testChannel.receive(5000);assertThat((String)message.getPayload(), equalTo("Completed File Processing"));
}

如果现在再次进行测试,则令人惊讶的是它将失败,原因是–在调用Junit的@Before方法之前,Spring应用程序上下文已完全初始化,并且轮询进入文件夹的文件的轮询程序已在模拟之前触发行为被添加,因此,如果没有正确的模拟服务行为,测试将失败。

我确定还有其他修复程序,但是对我有用的修复程序实际上是控制扫描哪个文件夹,以及在什么时候将文件放置在文件夹中以触发流。 这很大程度上基于我在Spring Integration项目本身中看到的一些测试 。 诀窍是先使用Spring config创建一个临时文件夹,然后将该文件夹设置为轮询文件夹:

<beans:bean id="temp" class="org.junit.rules.TemporaryFolder"init-method="create" destroy-method="delete"/><beans:bean id="inputDirectory" class="java.io.File"><beans:constructor-arg value="#{temp.newFolder('sitest').path}"/>
</beans:bean> <util:properties id="localProps"><beans:prop key="inbound.folder">#{inputDirectory.getAbsolutePath()}</beans:prop>
</util:properties>

现在,仅在测试运行期间将文件放置在临时文件夹中,这样@Before注释方法就有机会向模拟添加行为,并且可以明确声明模拟行为:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("si-test.xml")
public class FileHandlingFlowTest {@Autowired @Qualifier("testChannel") private PollableChannel testChannel;@Autowired private FileHandlingService fileHandlingServiceMock;@Autowired @Qualifier("inputDirectory") private File inputDirectory;@Beforepublic void setUp() {when(fileHandlingServiceMock.handle((File)(anyObject()))).thenReturn("Completed File Processing");}@Testpublic void testService() throws Exception{Files.copy(new File(this.getClass().getResource("/samplefolder/samplefile.txt").toURI()), new File(inputDirectory, "samplefile.txt"));Message<?> message = this.testChannel.receive(5000);assertThat((String)message.getPayload(), equalTo("Completed File Processing"));}
}

参考: all和其他博客中来自JCG合作伙伴 Biju Kunjummen的Spring集成文件轮询和测试 。

翻译自: https://www.javacodegeeks.com/2013/05/spring-integration-file-polling-and-tests.html

spring 长轮询

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

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

相关文章

java扫描指定package注解_java获取包下被指定注解的类

方案一&#xff1a; 采用reflections 框架(此框架依赖com.google.guava)2、项目依赖org.reflectionsreflections0.9.11com.google.guavaguava21.03、实现代码//入参 要扫描的包名Reflections f new Reflections("com.ggband.netty.execute.command");//入参 目标注解…

您将在下一个项目中使用JSF吗?

上周有一篇很棒的stackoverflow博客文章&#xff0c;主题是“ JavaScript框架的残酷生命周期” 。 这篇文章是关于Javascript UI框架&#xff08;angularjs&#xff0c;angular&#xff0c;jquery和react&#xff09;的流行和流行的速度。 这篇文章的关键指标是每月关于框架的问…

java dao层 service层_dao层与service层的区别

service是业务层&#xff0c;dao是数据访问层。这个问题我也曾经考虑过学java的时候&#xff0c;都是在service里直接调用dao&#xff0c;service里面就new一个dao类对象&#xff0c;调用&#xff0c;其他有意义的事没做&#xff0c;也不明白有这个有什么用然后百度了一下我们都…

java heapsort_排序算法笔记:堆排序 HeapSort in java

/*** 堆排序* 简述:* 首先使用建立最大堆的算法建立好最大堆&#xff0c;然后将堆顶元素(最大值)与最后一个值交换&#xff0c;同时使得堆的长度减小1 &#xff0c;调用保持最大堆性质的算法调整&#xff0c;使得堆顶元素成为最大值&#xff0c;此时最后一个元素已被排除在外* …

从Java 10中删除的API

在博客文章“ JDK 10 Release Candidate Phase ”中&#xff0c;我研究了JDK 10可能包含的十二个新功能。 在本文中&#xff0c;我介绍了一些可能会在JDK 10中删除的API&#xff0c;并探讨了一些在JDK 10中建议弃用的API。本文中的信息基于当前版本&#xff08;2018/1 / “ Jav…

使用java自带的日志管理_java日志管理

1.相关概念日志统一框架(日志门面)&#xff1a;apache commons logging、slf4j日志实现框架(实现层)&#xff1a;JDK自带的logging(java.util.logging)、log4j、Java Util Logging、log4j2、logback.(1)JDK自带的logging(java.util.logging)用法&#xff1a;1 importjava.util.…

在会话中使用JWT

在黑客新闻&#xff0c;reddit和博客上&#xff0c;该主题已经讨论了很多次。 共识是–请勿使用JWT&#xff08;用于用户会话&#xff09;。 而且我在很大程度上同意对JWT的典型论点 &#xff0c; 典型的“但我可以使其工作……”的解释以及JWT标准的缺陷的批评 。 。 我不会…

java案例源代码_求java案例源代码 越多越好!

展开全部import java.awt.*;import java.awt.event.*;import java.lang.*;import javax.swing.*;public class Counter extends Frame{//声明三个面板的布局GridLayout gl1,gl2,gl3;Panel p0,p1,p2,p3;JTextField tf1;TextField tf2;Button b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,…

安卓4.4玩java_Android4.4运行过程中闪退java.lang.NoClassDefFoundError

上周五项目测试时发现一个奇怪的Bug&#xff0c;项目中依赖了一个第三方框架&#xff0c;但是在android4.0-4.4.4之间的系统中运行会直接闪退&#xff0c;抛出错误异常为java.lang.NoClassDefFoundError。第一次遇到这样的问题&#xff0c;google了好久找到了以下几个原因&…

java method方法_Java Method.getTypeParameters方法代碼示例

import java.lang.reflect.Method; //導入方法依賴的package包/類private void validateRuleMethod(MethodRuleDefinition, ?> ruleDefinition, Method ruleMethod, RuleSourceValidationProblemCollector problems) {if (Modifier.isPrivate(ruleMethod.getModifiers())) …

update se_Java SE 7 Update 25 –发行说明进行了解释。

update se昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是最后一次与Oracle其他所有Oracle产品都不适合的Oracle重要补丁更新计划。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布…

java scavenge_请概述一下Java中都有哪些垃圾收集器

1、Serial(串行GC)收集器Serial收集器是一个新生代收集器&#xff0c;单线程执行&#xff0c;使用复制算法。它在进行垃圾收集时&#xff0c;必须暂停其他所有的工作线程(用户线程)。是Jvmclient模式下默认的新生代收集器。对于限定单个CPU的环境来说&#xff0c;Serial收集器由…

Java中的异步等待

编写异步代码很困难。 试图了解异步代码应该做什么的难度更大。 承诺是尝试描述延迟执行流程的一种常见方式&#xff1a;首先做一件事&#xff0c;然后再做另一件事&#xff0c;以防万一出错再做其他事情。 在许多语言中&#xff0c;承诺已成为协调异步行为的事实上的方法。 J…

java web ssh启动运行程序_[javaweb开发SSH] myeclipse启动tomcat时的bug

以前用的是myeclipse10.0的版本,我也不知道以前设置了什么,比较正常.由于以前的myeclipse无法装svn,所以装了一个10.7当连接数据库正常时,自然是好的一旦连接数据库不正常了(我故意将数...以前用的是myeclipse10.0的版本, 我也不知道以前设置了什么,比较正常.由于以前的myeclip…

java简单文本编译器_java -简易文本编辑器

import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;/*** Title:java -简易文本编辑器 ** Description: 08.5.5 简易功能* 1。 打开文件时&#xff0c;无法选择文件&#xff0c;需手动输入* 2. 文件大小超出 多行文本域时&#xff0c;未实现滚动…

阿帕奇光束

Apache Beam是一个开放源代码统一模型&#xff0c;用于定义批处理和流数据并行处理管道。 使用一种开源的Beam SDK&#xff0c;您可以构建一个定义管道的程序。 然后&#xff0c;该管道由Beam支持的分布式处理后端之一执行&#xff0c;这些后端包括Apache Apex &#xff0c; Ap…

java音乐登陆界面_第四篇——Spring音乐登录界面设计及实现(C#)

Spring音乐播放器&#xff0c;我们小组设计其启动时有一个登录界面&#xff0c;用户初次可以注册&#xff0c;输入用户名和密码&#xff0c;点击注册即将输入信息保存到register文本文件中&#xff1b;如果已有用户名&#xff0c;输入用户名和密码&#xff0c;点击登录&#xf…

java中线性结构的例子_java数据结构--线性结构

一、数据结构数据结构由数据和结构两部分组成&#xff0c;就是将数据按照一定的结构组合起来&#xff0c;这样不同的组合方式有不同的效率&#xff0c;可根据需求选择不同的结构应用在相应在场景。数据结构大致分为两类&#xff1a;线性结构(如数组&#xff0c;链表&#xff0c…

过滤序列,惰性序列_Java 8的惰性序列实现

过滤序列,惰性序列我刚刚在GitHub上发布了LazySeq库-这是我最近进行的Java 8实验的结果。 我希望你会喜欢它。 即使您觉得它不是很有用&#xff0c;它仍然是Java 8&#xff08;以及一般而言&#xff09;中的函数式编程的一课。 而且它可能是第一个针对Java 8的社区库&#xff0…

Spring Boot和JSP

本指南展示了如何使用Spring Boot通过JSP创建MVC Web应用程序。 先决条件&#xff1a; Eclipse IDE&#xff08;最新版本&#xff09; Maven的4 Java 1.8 1.创建Maven Web项目 打开eclipse&#xff0c;然后创建一个新的Maven Web项目&#xff0c;并将其命名为SpringBootWe…