返回顶部
首页 > 资讯 > 精选 >处理跨层上下文取消
  • 595
分享到

处理跨层上下文取消

2024-02-06 05:02:28 595人浏览 独家记忆
摘要

问题内容 我正在开发一个带有控制器、服务、存储库等的分层后端 api。 上下文 这些层中的每个方法都采用 context.Context 作为其包含请求上下文的第一个参数。这很方便,因

问题内容

我正在开发一个带有控制器、服务、存储库等的分层后端 api

上下文

这些层中的每个方法都采用 context.Context 作为其包含请求上下文的第一个参数。这很方便,因为任何方法都可以访问各种与请求相关的数据(例如correlationID等)

每个请求上下文都有一个由下面的 TimeoutMiddleware 设置的超时:

func TimeoutMiddleware(timeoutFn func(*gin.Context) time.Duration) gin.HandlerFunc {
    return func(c *gin.Context) {
        timeout := timeoutFn(c)
        ctx, cancel := context.WithTimeout(c.Request.Context(), timeout)
        defer cancel()

        c.Request = c.Request.WithContext(ctx)

        c.Next()
    }
}

func TimeoutFn(c *gin.Context) time.Duration {
    return conf.HttpRouter.DefaultContextTimeout
}

挑战

这个想法是在请求上下文超时时优雅地停止任何正在进行的操作。 根据我对上下文和并发性的理解(非常少),我构建了这个辅助函数:

package helpers

import "context"

// Checks for context cancellation and returns ctx.Err() if canceled.
func HandleContextCancel(ctx context.Context) error {
    select {
    case <-ctx.Done(): // If the context is canceled
        return ctx.Err() // return immediately with the canceled error.

    default: 
        return nil // Continue with the nORMal processing.
    }
}

理论上,如果我想尽快停止任何操作,我需要在应用程序中每个方法的开头调用此函数,如下所示:< /p>

func DoSomething(ctx context.Context, ...) resterrors.RestErr {
if err := helpers.HandleContextCancel(ctx); err != nil {
    return resterrors.NewRequestTimeoutError(
        fmt.Errorf("DoSomething: %w", err),
    )
}
// ...

同时,我知道在访问数据库的存储库中,大多数函数都需要上下文,例如 QueryQueryRowExec ...,如下所示:

rows, err := pGClient.GetSession().Query(ctx, query, param1, ...)

因此,每次在上面的行中出现错误时,我必须检查错误是否不是由于上下文取消所致,而不是仅返回 internal_server_error 和错误消息,如下所示:

rows, err := pgclient.GetSession().Query(ctx, query, param1, ...)
if err != nil {
   return helpers.MapRepoError("DoSomething: Query Error:", err)
}
func MapRepoError(location string, err error) resterrors.RestErr {
    if errors.Is(err, context.DeadlineExceeded) {
        return resterrors.NewRequestTimeoutError(
            fmt.Errorf("%s request_timeout", location),
        )
    }
    return resterrors.NewInternalServerError(
        fmt.Errorf("%s %w", location, err),
    )
}

使用 HandleContextCancel 函数看起来有点多余,您对此有何看法?


正确答案


您不需要 HandleContextCancel 函数,您可以简单地执行以下操作:

if ctx.Err()!=nil {
  // Context timed out or canceled. Return
  return ctx.Err()
}

如果您的其他错误处理函数正确地包装了此错误(即它们实现了 Unwrap() error 方法,那么您可以在顶层检查错误是否包含超时/取消错误,并决定您要处理什么类型的错误喜欢返回。你不必每一层都这样做。

以上就是处理跨层上下文取消的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 处理跨层上下文取消

本文链接: https://lsjlt.com/news/561259.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 处理跨层上下文取消
    问题内容 我正在开发一个带有控制器、服务、存储库等的分层后端 API。 上下文 这些层中的每个方法都采用 context.Context 作为其包含请求上下文的第一个参数。这很方便,因...
    99+
    2024-02-06
  • gRPC 上下文取消传播
    编程网今天将给大家带来《gRPC 上下文取消传播》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈...
    99+
    2024-04-04
  • goroutine 没有看到上下文取消?
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《goroutine 没有看到上下文取消?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识...
    99+
    2024-04-04
  • Go语言上下文context底层原理
    目录1. context 介绍2. 基本介绍3. 源码分析3.1 Context 接口3.2 emptyCtx3.3 cancelCtx3.4 timerCtx3.5 valueCt...
    99+
    2024-04-02
  • vue上下模糊如何取消
    这篇文章主要介绍“vue上下模糊如何取消”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue上下模糊如何取消”文章能帮助大家解决问题。第一种方法:取消滚动回弹效果Vue.js默认的滚动行为会让你的滚...
    99+
    2023-07-06
  • 如何在 Goroutine 中使用上下文取消功能?
    在 go 中使用上下文取消功能可以优雅地取消正在进行的 goroutine:使用 context 包创建带超时的上下文。在函数返回时使用 defer 取消上下文。在 goroutine ...
    99+
    2024-05-15
    上下文取消
  • 当编写http处理程序时,我们是否必须监听请求上下文取消?
    php小编新一在处理HTTP请求时,是否必须监听请求上下文取消是一个常见的疑问。在实际开发中,通常情况下并不需要显式地监听请求上下文取消,因为PHP的运行环境会自动处理相关的资源释放工...
    99+
    2024-02-09
  • css层叠上下文怎么实现
    这篇文章主要介绍“css层叠上下文怎么实现”,在日常操作中,相信很多人在css层叠上下文怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css层叠上下文怎么实现”的疑惑...
    99+
    2024-04-02
  • CSS层叠上下文实例分析
    这篇文章主要讲解了“CSS层叠上下文实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS层叠上下文实例分析”吧!   一、现象   Z 轴上的显...
    99+
    2024-04-02
  • 处理 mongodb 连接时的上下文
    编程网今天将给大家带来《处理 mongodb 连接时的上下文》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给...
    99+
    2024-04-04
  • Win7下取消共享文件夹上的小锁图标的图文教程
    我们用过Windows 7系统的都会发现,共享后的文件夹图标左下角显示锁,取消共享后依然存在,如图: Window 7系统中小锁其实是开启简单共享后,文件本身访问权限受限的标识。添加所有用户权限后可以消失。 操作步骤:...
    99+
    2023-06-05
    Win7 取消共享文件夹上的小锁图标 图文 图标 小锁 教程
  • 我们如何保证取消的上下文会导致 goroutine 终止?
    php小编子墨将为大家介绍如何保证取消上下文会导致goroutine终止的方法。当我们在使用goroutine时,有时候需要在某个条件满足时取消它,以避免不必要的计算和资源浪费。为了确...
    99+
    2024-02-09
  • CSS中层叠上下文的使用方法
    这篇文章给大家分享的是有关CSS中层叠上下文的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言在有些 CSS 相互影响作用下,对元素设置的 z-index 并不会按实际大小叠加,一直不明白其中的原理,最...
    99+
    2023-06-08
  • kotlin协程上下文异常处理详解
    目录引言一、协程上下文1.CoroutineContext2.CorountineScope3.子协程继承父协程二、协程的异常传递1.协程的异常传播2.不同上下文(没有继承关系)之间...
    99+
    2024-04-02
  • Springboot如何获取上下文ApplicationContext
    目录Springboot获取上下文ApplicationContextspringboot的应用上下文ServletWebServerApplicationContext扩展的功能A...
    99+
    2024-04-02
  • Spring MVC异步上传、跨服务器上传和文件下载
    一、异步上传 之前的上传方案,在上传成功后都会跳转页面。而在实际开发中,很多情况下上传后不进行跳转,而是进行页面的局部刷新,比如:上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。 1.1 JSP页面 编写JSP页...
    99+
    2023-08-31
    java maven spring mvc
  • Postman中怎么处理文件上传和下载
    在Postman中处理文件上传和下载,可以通过以下步骤进行操作: 文件上传: 在Postman中创建一个新的请求。 在请求的H...
    99+
    2024-03-13
    Postman
  • 取消 Win7 共享文件夹留下的小锁
    最有效的方法如下: 1. 右击,共享-特定用户,添加 Everyone ,共享,等待共享完成(文件很多的文件夹可能要较长的时间); 2. 右击,属性-共享-高级共享,取消【共享此文件夹】 ,确定。 这样,即可取消共享,又...
    99+
    2023-05-25
    Win7 共享文件夹 小锁
  • Springboot 如何获取上下文对象
    目录Springboot上下文对象获取或者更简单的写法:spring boot获取上下文 随时取出被spring管理的bean对象方法一:方式二:Springboot上下文对象获取 ...
    99+
    2024-04-02
  • Kotlin协程上下文与上下文元素深入理解
    目录一.EmptyCoroutineContext二.CombinedContext三.Key与Element四.CoroutineContext五.AbstractCoroutin...
    99+
    2022-11-13
    Kotlin 协程上下文 Kotlin 上下文
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作