//有时候我们需要无限循环获取数据,直到超时为止 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.Map; public class LoopRunner { private static final Logger logger = LoggerFactory.getLogger(LoopRunner.class); private final String NO_MESSAGES_FOUND = "No messages found yet"; private static final int SLEEP_TIME = 500; private Long maxWait = 10000L; private boolean timedOut = false; public LoopRunner(long maxWait) { this.maxWait = maxWait; } public LoopRunner(Long maxWait) { this.maxWait = maxWait; } public <T> T run(LoopCondition<T> lc) { timedOut = false; T data = null; long started = System.currentTimeMillis(); ProcessTimer processTimer = new ProcessTimer(); while (System.currentTimeMillis() - started < maxWait) { String foundMessages = NO_MESSAGES_FOUND; data = lc.getData(); if (lc.test(data)) { if (data instanceof Collection<?>) { int totalCount = ((Collection<?>) data).size(); logMessageStateCounts(data, lc); logger.info("Found " + totalCount + " expected number of messages"); } return data; } try { if (data != null) foundMessages = logMessageStateCounts(data, lc); long millisecondsRemaining = maxWait - processTimer.getExecutionTimeInMilliseconds(); if (millisecondsRemaining > 0) logger.info(foundMessages + ", wait time so far: " + processTimer.getExecutionTime() + ", timing out in " + millisecondsRemaining + " ms, checking again in " + SLEEP_TIME + " ms"); Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { throw new RuntimeException(e); } } logger.warn("Timed out - could not find expected number of messages"); timedOut = true; return data; } public boolean isTimedOut() { return timedOut; } private <T> String logMessageStateCounts(T data, LoopCondition<T> lc) { Map<String, Integer> foundMessageStatusCounts = lc.getStatusCounts(data); if (foundMessageStatusCounts != null) { for (String status : foundMessageStatusCounts.keySet()) { return "Found " + foundMessageStatusCounts.get(status) + " messages with a status of " + status; } } return NO_MESSAGES_FOUND; } }
需要实现的接口:
import java.util.Map; public interface LoopCondition<T> { boolean test(T data); T getData(); Map<String, Integer> getStatusCounts(T foundMessages); }
相关推荐
循环Job允许我们设置一个或多个步骤,在满足特定条件时反复执行,例如,当处理的数据量达到某个阈值或直到所有数据都被处理。这在需要多次调用同一接口获取大量分页数据时非常有用。 描述中提到的变量运用是Kettle...
使用ajax请求数据,并用循环的方式放到表格里,展示到页面。
请求体(如果有的话)通常包含实际的请求数据。 在Nginx中,当接收到客户端的HTTP请求时,它会逐步解析这些数据。在上一节中,我们讨论了如何读取和解析请求行。当请求行解析完成后,Nginx会调用`ngx_...
以下将详细讲解如何实现“sdcard循环读取数据”的相关知识点。 1. **获取SD卡路径**: 在Android中,获取SD卡的根目录可以使用`Environment.getExternalStorageDirectory()`方法。这个方法返回一个`File`对象,...
使用Ajax get请求数据的小例子,使用$.each()循环显示到表格,里面有接口,大家可以使用,欢迎指导学习
循环发送数据意味着在一个循环结构中反复调用`send()`函数,直到所有数据发送完毕或达到特定条件。 下面是一个简单的TCP循环发送数据的C语言示例: ```c #include #include #include #include #include int ...
标题中的“Kettle实现步骤循环执行”涉及到的是数据集成工具Pentaho Data Integration(简称Kettle或PDI)的一种高级用法,即如何在工作流(Job)或转换(Transformation)中实现步骤的循环执行。Kettle是一款强大的...
本示例中的"获取数据库数据循环提交到接口"是一个典型的Java应用程序,它从MySQL数据库中检索数据并逐条发送到一个外部接口。这个过程涉及到几个关键的技术点,包括Java编程、数据库连接、SQL查询以及API调用。 ...
在循环内部,可以设置一个Table Input步骤,通过SQL查询来获取指定页码的数据。对于大数据,可能需要结合使用Limit Rows步骤来限制每页的记录数量。 4. **数据抽取与转换**:在获取每页数据后,可以应用各种Kettle...
Vue如何从接口请求数据 在本文中,我们将介绍如何使用Vue.js从接口请求数据,并将其应用于实际项目中。通过本文,您将了解到如何使用Vue.js的生命周期钩子函数、methods、数据绑定等概念来实现数据请求和处理。 ...
### JMeter 使用 CSV Data Set Config 实现不重复数据的多次循环执行 #### 一、背景与目标 在软件测试过程中,经常会遇到需要模拟大量不同用户的场景。例如,一个抽奖活动可能需要模拟数百甚至数千个不同的用户...
本篇文章主要探讨如何结合递归和Promise按顺序请求数据。 首先,我们面临的问题是如何确保多个API请求按照特定顺序执行。在传统的回调函数模式中,这通常会导致“回调地狱”,代码难以理解和维护。而Promise则通过...
本文将深入探讨如何利用Kettle实现一种简单的循环方式,特别是在从Oracle源表分页读取数据并写入Oracle目标表的应用场景中。 首先,我们需要理解Kettle的工作原理。Kettle通过Job和Transformation两个主要组件来...
多线程循环读取csv文件执行请求以及CSV Data Set Config配置信息,如有什么疑问,可以在博客下留言,https://blog.csdn.net/u012811841/article/details/108710930
本示例将探讨如何在JMeter中创建一个压测脚本,该脚本能够循环读取数据,并确保数据只被读取一次。这种用法在测试场景中十分常见,比如模拟用户登录时使用一次性验证码或令牌。 1. **JMeter基础** JMeter是用Java...
在JavaScript编程中,for循环常用于迭代处理一系列数据或执行重复任务。然而,当在循环内部发送AJAX请求时,可能会遇到一些问题,特别是在请求处理速度无法跟上循环迭代速度的情况下。本文将深入探讨这个问题,并...
通过这个案例,我们可以总结出在Vue项目中实现先请求数据再渲染DOM的最佳实践:首先,在`created`钩子函数中发起数据请求。然后,利用`this.$nextTick`确保在数据加载完成后执行DOM操作,无论是直接在数据请求的回调...
在这个处理器中,你可以通过`prev`对象获取上一个样本(即HTTP请求)的响应数据。例如,如果你的响应数据是JSON格式,你可以使用`prev.getResponseDataAsString()`获取整个响应字符串,再使用JSON库解析出需要的参数...
HTTP协议是互联网上应用最为广泛的一种网络协议,而POST是HTTP协议中的一个请求方法,常用于向服务器发送数据,例如提交表单或者上传文件。在Kettle中,我们可以通过Job或Transformation中的"HTTP"组件来实现HTTP...