ZBLOG

gin 同一个请求第一次的请求还在处理,再次申请第二次时,要求直接返回

这个需求可以通过设置上下文的超时时间来实现。具体做法如下:

  1. 在处理请求的函数中,创建一个带有超时时间的上下文对象,并在该上下文中执行业务逻辑。
func handlerFunc(c *gin.Context) {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    // 执行业务逻辑,如果超时则会自动取消
    err := doSomeWork(ctx)

    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, gin.H{"message": "work done"})
}
  1. 如果同一个客户端再次发送请求,可以先检查上一个请求是否还在处理中。如果是,则直接返回错误信息。
var processingRequests = make(map[string]chan struct{})

func handlerFunc(c *gin.Context) {
    // 检查是否有相同请求正在处理中
    id := c.Request.Header.Get("X-Request-ID")
    if _, ok := processingRequests[id]; ok {
        c.JSON(http.StatusBadRequest, gin.H{"error": "request in progress"})
        return
    }

    // 标记当前请求为正在处理状态
    processingRequests[id] = make(chan struct{})
    defer delete(processingRequests, id)

    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

   // 执行业务逻辑,如果超时则会自动取消
   err := doSomeWork(ctx)

   if err != nil {
       c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
       return
   }

   c.JSON(http.StatusOK, gin.H{"message": "work done"})
}

在上面的代码中,我们使用一个全局变量 processingRequests 来记录正在处理中的请求。当有新请求到来时,先检查当前是否有相同请求正在处理中,如果是则直接返回错误信息;否则标记当前请求为正在处理状态,并执行业务逻辑。

需要注意的是,在并发场景下修改共享变量时需要加锁保护,这里为了简化示例代码未做加锁处理。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=3980

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?