MassTransit Consumer 中的异常冒泡导致 Windows 服务崩溃

2023-12-29

我使用 AutoFac 设置了一个包含 2 个消费者的 Windows 服务。在一条快乐的道路上,这确实非常有效。我的印象是大众交通为我处理了例外情况。 正如文档所述:http://docs.masstransit-project.com/en/latest/overview/errors.html http://docs.masstransit-project.com/en/latest/overview/errors.html

最简单的事情就是让异常从你的程序中冒出来 Consumer方法和MassTransit会自动捕获异常 为你

当消费者抛出异常时,MassTransit 确实产生了错误,但我的服务仍然崩溃:

应用程序:WerkgeverService.exe 框架版本:v4.0.30319 描述:由于未处理的异常,进程被终止。 异常信息:AutoMapper.AutoMapperMappingException 堆栈:位于 System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__5(System.Object) 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object) 在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback、System.Object、布尔值)位于 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback、System.Object、布尔值)位于 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 处 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

记录异常是因为我记录了所有未捕获的异常:

Protected Overrides Sub OnStart(args() As String)
        ' Add code here to start your service. This method should set things
        ' in motion so your service can do its work.
        Try
            Initialize()
            AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf HandleBubbledException
        Catch ex As Exception
            Me.EventLog.WriteEntry(ex.Message, EventLogEntryType.Error)
            Throw
        End Try
    End Sub


    Private Sub HandleBubbledException(sender As Object, args As UnhandledExceptionEventArgs)
        Dim exception = DirectCast(args.ExceptionObject, Exception)
        Me.EventLog.WriteEntry(String.Format("Message: {0} {2}Stacktrace:{2}{1}", exception.Message, exception.StackTrace, Environment.NewLine), EventLogEntryType.Error)
    End Sub

异常本身是 AutoMapper 中的一个,并且确实记录在事件日志中(因此它不由 MassTransit 处理):

Message: Missing type map configuration or unsupported mapping.

Mapping types:
Int32 -> Int64
System.Int32 -> System.Int64

QUESTION: 有什么方法可以在不添加的情况下防止服务崩溃try/catch对每一个消费者? AFAIK MassTransit 应该处理这些......


这可能是针对我的情况的,但我想我发现了问题(感谢来自 MassTransit 的人)。

问题是我的消费者启动了一个新线程。

Public Sub Consume(message As IConsumeContext(Of IMessage)) Implements Consumes(Of IConsumeContext(Of IMessage)).All.Consume
    HandleMessageAsync(message)
End Sub
Private Async Sub HandleMessageAsync(context As IConsumeContext(Of IMessage))
    Dim something = Await _controller.GetSomething(context.Message)
    Dim response As New MessageResponse
    response.something = something
    context.Respond(response)
End Sub

该线程不受 MassTransit 的控制,因此它无法捕获该线程的任何异常。我的解决方案是将其更改为:

Public Sub Consume(context As IConsumeContext(Of IMessage)) Implements Consumes(Of IConsumeContext(Of IMessage)).All.Consume
    Dim something = _controller.GetSomething(context.Message).Result
    Dim response As New MessageResponse
    response.something = something
    context.Respond(response)
End Sub

只需确保异常在 Consume 方法退出之前冒泡即可。不然就得自己去抓了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MassTransit Consumer 中的异常冒泡导致 Windows 服务崩溃 的相关文章

随机推荐

  • C# 方法默认是密封的还是虚拟的?

    我知道的定义virtual and sealed关键字 但是如果您不将它们与方法一起使用 那么默认情况下可以覆盖该方法吗 我来自vb net背景 它在 vb net 中是这样的 来自 MSDN 如果未指定 Overridable 或 Not
  • 台式电脑上的 OpenGL|ES

    我正在开发一个 OpenGL 项目 我想将其移植到支持 OpenGL ES 的嵌入式系统 由于 OpenGL ES 是 OpenGL 的子集 在嵌入式系统上编译我的 OpenGL 应用程序有多难 假设我的OpenGL代码在OpenGL ES
  • 开发模式 - 其他用户制作的模板电子表格的副本

    当对主脚本 由另一个帐户拥有 进行更改时 包含处于开发模式的库的电子表格副本是否会立即更新 我创建了一个脚本 gt gt 保存了一个版本 gt gt 在电子表格中添加了一个库引用 在开发模式下 gt gt 制作了该ss的多个副本 在用于创建
  • 使用 php 获取窗口大小 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这段代码有什么问题 window width window height 任何想法 您的代码没有任何问题 但是您无法获取 PHP 变量中的
  • 将 mylyn Gitlab 连接器连接到 Eclipse 时出错

    我正在尝试为 Eclipse Oxygen v4 7 1a 配置 Mylyn Gitlab 连接器 但是当我尝试添加新任务时 它会抛出异常 并且不允许我继续创建新任务 正确输入我的数据和 gitlab 存储库的 url 地址 甚至使用多个
  • 使用sql查询总结时间列

    我有一张表如下 repID ClockIn ClockOut TotalHours 109145 7 50 50 AM 3 37 16 PM 7 46 26 109145 7 52 41 AM 3 44 51 PM 7 52 10 1091
  • C# 禁用 USB ReadPipe 的垃圾收集

    我正在尝试使用 FTDI 的 D3XX NET 从 USB 端口收集数据 收集数据 然后发送到快速傅立叶变换以绘制频谱 即使您丢失了一些数据 这也可以正常工作 你说不出来 但是 如果您随后想要将此数据发送到音频输出组件 您会发现数据丢失 这
  • 如何根据传入远程通知负载中定义的类别添加不同的操作?斯威夫特更新

    我正在我的两个相关应用程序中实现推送通知 到目前为止我能够发送通知 设备到设备以及主题 收到通知后 通知会显示随有效负载发送的 url 处的图像 我的目标是向主题通知添加操作 并且每个主题的操作都不同 Ej 行动为 shop promoti
  • 在 C# 中添加十六进制值

    在我的系统中 我需要添加 2 个十六进制值 那么 如何在 C 中添加十六进制值 我还想知道十六进制值的最大长度以及哪个实例保存这些值 C 支持十六进制文字 http msdn microsoft com en us library aa66
  • Haskell 中的惰性笛卡尔积

    我想在 Haskell 中生成一个相当大但有限的笛卡尔积 然后我需要对其进行迭代 想想平均场模型的配分函数 自然而然的事情使用sequence 像这样 l sequence replicate n 0 1 2 不幸的是 对于大n 这不适合内
  • 如何创建 android:pathData?

    所以我需要在我的应用程序中使用路径数据 有没有办法将已有的图像转换为路径数据 或者唯一的方法是使用 Photoshop 等实际计算所有像素 矢量图像android中的PathData是矢量图形程序的脚本 它并不是完全干净且人类可读的代码作为
  • 无法创建 yeoman web 应用程序

    当我尝试创建一个网络应用程序时 我得到了这个yeoman usr local lib node modules yo node modules insight node modules configstore configstore js
  • 为什么这段C代码可以编译?

    include
  • 在 Logback 中创建自定义布局

    我正在尝试在 logback 中创建自定义布局 如示例中所示手册第 6 章 http logback qos ch xref chapters layouts MySampleLayout html package com dces uti
  • 在 Rails 4 中创建到外部 URL 的 Rails 路由

    我有一堆路由 50 需要映射到外部 URL 我绝对可以按照建议做here https stackoverflow com questions 3622706 creating a rails route to an external url
  • Fortran 77 注释的语法突出显示在 vim 中不起作用

    我有一段用 Fortran 77 编写的代码 我用 vim 读取它 编写代码时 注释位于以c 这是 Fortran 77 中的标准 但是 vim 无法识别它们 因此使用着色语法 这使得代码非常难以阅读 我怎样才能克服这个问题 我看到有一个发
  • 在java中查找字符串中字符频率的有效方法:O(n)

    在最近的一次采访中 我被要求编写以下程序 找出给定字符串中频率最小的字符 因此 我尝试使用 charAt 迭代字符串 并将字符存储为 HashMap 中的键 并将出现次数作为其值 现在我必须再次迭代 Map 才能找到最低的元素 有没有一种更
  • 如何创建具有基本身份验证的 ASP.NET 网页

    我想创建 ASP NET 网页 该网页将提示我弹出基本身份验证窗口 我将在其中输入凭据 我尝试在 PreInit 和 PreLoad 事件处理程序中添加以下代码行 但它仍然没有显示基本身份验证弹出窗口 protected override
  • SQLNonTransientConnectionException 在 Eclipse 中连接 MySQL

    我正在尝试编写代码 使用 Eclipse MySQL Workbench 和 JDBC 8 0 11 将文本文件的数据导入数据库 它给了我一个 ClassNotFoundException 我已经查看了多个其他问题 并且通过将 java c
  • MassTransit Consumer 中的异常冒泡导致 Windows 服务崩溃

    我使用 AutoFac 设置了一个包含 2 个消费者的 Windows 服务 在一条快乐的道路上 这确实非常有效 我的印象是大众交通为我处理了例外情况 正如文档所述 http docs masstransit project com en