Java 检查RESTAPI是否在特定时间间隔内被调用
假设有两个RESTAPI是使用Java和spring实现的 如果要提出一个请求()(第一个API)(我们的应用程序使用),它会在后端进行一些处理,但不会返回实际结果,而是返回成功响应 对我的请求所需的响应需要一些时间,例如13分钟,而这个实际响应是通过应用程序公开的另一个API发送的,例如()(第二个API) 我想用java编写代码,这样在我使用第一个API发出请求后,第二个API的响应不会超过13分钟。如果超过13分钟,则执行失败部分,如果少于13分钟,则执行成功部分Java 检查RESTAPI是否在特定时间间隔内被调用,java,spring,spring-boot,Java,Spring,Spring Boot,假设有两个RESTAPI是使用Java和spring实现的 如果要提出一个请求()(第一个API)(我们的应用程序使用),它会在后端进行一些处理,但不会返回实际结果,而是返回成功响应 对我的请求所需的响应需要一些时间,例如13分钟,而这个实际响应是通过应用程序公开的另一个API发送的,例如()(第二个API) 我想用java编写代码,这样在我使用第一个API发出请求后,第二个API的响应不会超过13分钟。如果超过13分钟,则执行失败部分,如果少于13分钟,则执行成功部分 如何使用SpringBo
如何使用SpringBoot、Java实现这一点。应该有某种方法在SpringBoot中不断检查是否在时间间隔(13分钟)内调用了第二个API。非常感谢您的帮助。这并不是Java特有的,它听起来更像是一个架构问题
- 用户或进程通过调用第一个api请求资源X
- 返回“OK”(200)响应
- 用户或进程通过调用第二个api请求资源Y(通知)
- 如果在调用Y和调用X之间经过的时间少于Z,则发送响应A;否则发送响应B
uuid.randomUUID()
这意味着第一个api发送回任何请求的响应将在某个地方具有相同的uuid,因为这对于第二个api是必要的
例如:
对api X的请求由spring rest控制器(或类似控制器)接收。在其中的某个地方(即控制器调用的服务层),将创建一个唯一标识符,并在数据库中保存一条记录。此唯一标识符必须在响应中返回
对api Y的请求是使用X响应中返回的uuid发出的。然后可以使用它来恢复为该请求保存在数据库中的更多信息(例如时间戳)
编辑
根据注释中的更多指示,需要三个组件:rest控制器、数据存储/检索服务和调度器
引发请求的代码:
Response r = post("/Requests");
db.insert(r.getUniqueId(), now);
接收通知的代码:
void listener(NotificationRequest r) {
db.delete(r.getUniqueId());
// do the success action
}
定期运行以检查未完成请求的代码:
for (DbRecord r: db.selectAllRecords()) {
if (r.time - now > 15 minutes) {
db.delete(r.id);
// do the failure action
}
}
这显然都是伪代码。我建议您必须首先分析代码和API调用。确切地说,在从数据库获取数据(在这种情况下,您需要优化数据库查询)或从客户机/DB等处理记录时,它会占用更多的时间 您可以使用市场上的任何监控工具进行第一次分析。您将了解您的API调用、方法执行时间、线程转储等 此链接提供了一些工具名称。 如果您使用的是spring,那么使用spring构建库来获取应用程序的度量 请使用以下链接获取更多参考信息:
发出请求时,在数据库中写入一条记录,记录时间。然后有一个@Scheduled组件,它每分钟检查一次未完成的请求,并采取适当的错误操作。您对notify endpoint的实现将执行成功操作。您能否帮助我了解如何在此处检查未完成的请求(第二次API调用)读取您在发出请求时放入数据库的记录,并将您记录的时间与当前时间进行比较。抱歉,我无法理解你的答案。在你的回答中有2个部分,一个错误的动作是由被调度的组件处理的,成功的动作是由通知端点处理的。考虑通知在5分钟内完成。成功的部分将被执行,如何使错误动作不被执行,因为它是独立运行的。告诉@scheduled组件notify endpoint被命中,并停止计算时间。我通过维护Hashmap解决了这个问题。无论何时调用第一个API,Hashmap都会有一个条目,当通过第二个API收到响应时,它会在Hashmap中删除该条目并调用checktimeout()方法,该方法的任务是每分钟(特定间隔)检查Hashmap中是否存在条目?如果存在,则尚未收到第二个api响应,或者收到响应,并检查是否跨越13分钟的时间间隔。如果跨越且条目仍然存在,则将采取失败工作流。我们必须假设有一些键从/Requests返回,该键也在/notifyRaisedRequestsRect的请求中发送,我忘了在回答中写下假设。我已经更新了它,谢谢指点。考虑第二个API花费了很长的时间(40分钟),然后终端用户必须等待40分钟才能得到性能问题的错误响应。这里的要求是,如果调用第一个API和第二个API之间的时间超过13分钟。