Java 检查RESTAPI是否在特定时间间隔内被调用

Java 检查RESTAPI是否在特定时间间隔内被调用,java,spring,spring-boot,Java,Spring,Spring Boot,假设有两个RESTAPI是使用Java和spring实现的 如果要提出一个请求()(第一个API)(我们的应用程序使用),它会在后端进行一些处理,但不会返回实际结果,而是返回成功响应 对我的请求所需的响应需要一些时间,例如13分钟,而这个实际响应是通过应用程序公开的另一个API发送的,例如()(第二个API) 我想用java编写代码,这样在我使用第一个API发出请求后,第二个API的响应不会超过13分钟。如果超过13分钟,则执行失败部分,如果少于13分钟,则执行成功部分 如何使用SpringBo

假设有两个RESTAPI是使用Java和spring实现的

如果要提出一个请求()(第一个API)(我们的应用程序使用),它会在后端进行一些处理,但不会返回实际结果,而是返回成功响应

对我的请求所需的响应需要一些时间,例如13分钟,而这个实际响应是通过应用程序公开的另一个API发送的,例如()(第二个API)

我想用java编写代码,这样在我使用第一个API发出请求后,第二个API的响应不会超过13分钟。如果超过13分钟,则执行失败部分,如果少于13分钟,则执行成功部分


如何使用SpringBoot、Java实现这一点。应该有某种方法在SpringBoot中不断检查是否在时间间隔(13分钟)内调用了第二个API。非常感谢您的帮助。

这并不是Java特有的,它听起来更像是一个架构问题

  • 用户或进程通过调用第一个api请求资源X
  • 返回“OK”(200)响应
  • 用户或进程通过调用第二个api请求资源Y(通知)
  • 如果在调用Y和调用X之间经过的时间少于Z,则发送响应A;否则发送响应B
正如评论中所建议的,解决这个问题的一种方法是使用一个数据库为每个对FirstAPI(X)的请求保留一个带有时间戳的唯一记录。当调用第二个api(Y)时,它是straghtforward:获取时间差并相应地采取行动

至于为第一个api的每个请求生成唯一标识符,根据记录的存储位置,您可以做不同的事情,但我的建议是保持它非常简单,并使用随机uuid:
uuid.randomUUID()

这意味着第一个api发送回任何请求的响应将在某个地方具有相同的uuid,因为这对于第二个api是必要的

例如:

对api X的请求由spring rest控制器(或类似控制器)接收。在其中的某个地方(即控制器调用的服务层),将创建一个唯一标识符,并在数据库中保存一条记录。此唯一标识符必须在响应中返回

对api Y的请求是使用X响应中返回的uuid发出的。然后可以使用它来恢复为该请求保存在数据库中的更多信息(例如时间戳)

编辑

根据注释中的更多指示,需要三个组件:rest控制器、数据存储/检索服务和调度器

  • 通过控制器对第一个api进行调用,该控制器使用服务存储特定于该请求的信息。控制器的响应将uuid返回给用户以供参考
  • 调度器使用相同的服务定期检查是否进行了第二次呼叫,并根据经过的时间量决定要做什么
  • 如果进行了第二次呼叫,它还使用相同的服务来保存相关数据和/或根据需要删除旧记录

  • 引发请求的代码:

       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分钟。