派生类型不会发布给 MassTransit 中的消费者

2024-02-23

我在发布派生类型的通用消息以及使用 MassTransit v2.8.0 调用处理程序时遇到问题。

如果我发布一条类型的消息HtmlBlockNewMessage,消费者永远不会被调用。如果我发布一个ServiceBusMessage反对并改变消费者Consumes<ServiceBusMessage>.Context,调用消费者。

该代码对于派生类型失败。它仅适用于父类型 (ServiceBusMessage)。

Types:

[Serializable]
public class ServiceBusMessage
{
}

[Serializable]
public class ServiceBusResponse
{
    public int ResultCode { get; set; } 
}

// Request
[Serializable]
public class ContentItemMessage : ServiceBusMessage
{
    public string SiteId { get; set; }
    public string PageId { get; set; }
    public string ContentItemId { get; set; }
}

[Serializable]
public class HtmlBlockNewMessage : ContentItemMessage
{
    public string HtmlData { get; set; }
}

// Response
[Serializable]
public class ContentItemMessageResponse : ServiceBusResponse
{
    public string Name { get; set; }
    public string ItemType { get; set; }
    public string ItemHandler { get; set; }       
}

[Serializable]
public class HtmlBlockNewMessageResponse : ContentItemMessageResponse
{
    public string DataId { get; set; }
}

消费者:

public class HtmlBlockConsumer : Consumes<HtmlBlockNewMessage>.Context
{
    private IHtmlDataService htmlDataService;
    public static ILogger Logger { get; set; }

    public HtmlBlockConsumer()
        : this(null)
    {
    }

    public HtmlBlockConsumer(IHtmlDataService htmlDataService)
    {
        Logger = Log4NetLogger.GetLogger();

        this.htmlDataService = htmlDataService ?? IoC.Container.Resolve<IHtmlDataService>();
    }

    public void Consume(IConsumeContext<HtmlBlockNewMessage> message)
    {
    // Do some stuff

        message.Respond(new HtmlBlockNewMessageResponse() { ResultCode = 1 } );
    }

}

发布者端的总线注册:

        var bus = ServiceBusFactory.New(sbc =>
        {
            sbc.EnableMessageTracing();

            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.UseMulticastSubscriptionClient();
            sbc.SetNetwork("Test");
            sbc.UseXmlSerializer();
            sbc.UseControlBus();

            sbc.ReceiveFrom("msmq://localhost/AuctionCMS.Web.Publisher");

            MtServiceBus.ValidateBus(sbc);
        });

        IoC.Container.RegisterInstance(bus);

消费者端的总线注册:

        var bus = ServiceBusFactory.New(sbc =>
        {
            sbc.EnableMessageTracing();

            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.UseMulticastSubscriptionClient();
            sbc.SetNetwork("Test");
            sbc.UseXmlSerializer();
            sbc.UseControlBus();

            sbc.ReceiveFrom("msmq://localhost/AuctionCMS.Consumer");

            sbc.Subscribe(subs =>
            {
                // These are being manually registered due to some issues getting
                // StructureMap to scan my assemblies
                subs.Instance(new HtmlBlockConsumer());
                subs.Instance(new BrowserConsumer());
                subs.Instance(new OfferConsumer());
            });
        });

        IoC.Container.RegisterInstance(bus);

我的发布扩展:

    public static TR Publish<T, TR>(this IServiceBus bus, T message) where T : ServiceBusMessage where TR : ServiceBusResponse
    {
        TR response = null;

        IoC.Container.Resolve<IServiceBus>().PublishRequest(message, callback =>
            {
                callback.SetTimeout(10.Seconds());

                try
                {
                    callback.Handle<TR>(m =>
                        {
                            response = m; /
                        });
                }
                catch (Exception ex)
                {

                    throw;
                }
            });

        return response;
    }

调用代码:

// First I create a message specific to the type of action I am performing 

var message = new HtmlBlockNewMessage() { HtmlData = "Hello" }; 

// Then I call a function which accepts a ContentItemMessage and calls Publish

public void AddContentItem(ContentItemMessage message) 
{
    // Do some preprocessing

    // This call times out
    var response = this.auctionCmsServices.Bus.Publish<ContentItemMessage,
          ContentItemMessageResponse>(message);

    // Do some more processing

}

这是例外

[RequestTimeoutException: Timeout waiting for response, RequestId: 54910000-307f-20cf-c0c2-08d06b31cf6f]
   MassTransit.RequestResponse.RequestImpl`1.Wait() in d:\BuildAgent-03\work\aa063b4295dfc097\src\MassTransit\RequestResponse\RequestImpl.cs:124
   MassTransit.RequestResponseExtensions.PublishRequest(IServiceBus bus, TRequest message, Action`1 configureCallback) in d:\BuildAgent-03\work\aa063b4295dfc097\src\MassTransit\RequestResponseExtensions.cs:31
   AuctionCMS.Framework.ServiceBus.MtServiceBus.Publish(IServiceBus bus, T message) in c:\Users\rick\Documents\Visual Studio 2012\Projects\AuctionCMS\AuctionCMS.Framework\ServiceBus\MtServiceBus.cs:24
   AuctionCMS.Framework.Entity.Page.AddContentItem(ISite site, String zone, Int32 location, ContentItemMessage message) in c:\Users\rick\Documents\Visual Studio 2012\Projects\AuctionCMS\AuctionCMS.Framework\Entity\Page.cs:48
   AuctionCMS.Framework.Entity.Site.SetDefaultContent() in c:\Users\rick\Documents\Visual Studio 2012\Projects\AuctionCMS\AuctionCMS.Framework\Entity\Site.cs:117
   AuctionCMS.Web.Controllers.AdminSitesController.NewSite(SiteNewModel model, HttpPostedFileBase file) in c:\Users\rick\Documents\Visual Studio 2012\Projects\AuctionCMS\AuctionCMS.Web\Controllers\AdminSitesController.cs:69
   lambda_method(Closure , ControllerBase , Object[] ) +179
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +261
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +34
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +124
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +838059
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +838059
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +838059
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +838059
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +15
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +33
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +838644
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +28
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +65
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +51
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +51
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

Edit:

我采用了通用方法来解决这个问题。从调用者的角度来看,这有点丑陋,但它确实有效。

   public TR AddContentItem<T, TR>(T message) where T : ContentItemMessage where TR : ContentItemMessageResponse
    {
        var response = this.auctionCmsServices.Bus.Publish<T, TR>(message);

        return response;
    }

调用代码现在如下所示:

page.AddContentItem(new HtmlBlockNewMessage() { HtmlData = “这是一些html" });


尤金的评论是正确的。这里发生的事情是您正在发布一条类型的消息ContentItemMessage。一个消费者HtmlBlockNewMessage由于消息被发布为ContentItemMessage and a ServiceBusMessage. 大众运输消息输入错误 https://stackoverflow.com/questions/7236971/masstransit-message-mis-typing这是关于其工作原理的众多事情之一。

您的选择:

  1. 更改 AddContentItem 以使用通用的,可能带有约束
  2. 使用反射以正确的类型信息调用 Publish
  3. 调整发布内容的方式,让这不再是问题

最重要的是,您应该始终按照您希望收到的类型进行发布。消息传递中的多态性很棘手。

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

派生类型不会发布给 MassTransit 中的消费者 的相关文章

  • 传奇中的公共交通延迟响应

    我正在研究在公共交通中使用传奇来协调跨多个服务的活动 传奇的生命周期很短 如果一切顺利的话不到 2 秒 对于我的用例 我想使用请求 响应方法 即客户端请求命令 saga 处理该命令 在接收消息时经历一些状态更改 并最终响应启动 saga 的
  • 有没有办法从 MassTransit 获取原始消息?

    我有一个具有通用参数的消费者IEvent 该类型是所有消息的基接口 以及子接口IEvent还有一些其他属性 我希望能够访问具有嵌套类型的所有属性的原始消息 而不仅仅是IEvent范围 这些属性可以通过 RMQ 管理仪表板查看 我认为应该有一
  • 如何清除 MassTransit 队列?

    我想在集成测试设置例程中删除队列中的所有消息 如何实现 谷歌搜索 智能感知暴力没有运气 如果重要的话 我使用 RabbitMq 作为传输 无法从 MassTransit 内的队列中 删除 对于测试 您可以通过使用临时的随机队列 URIrab
  • 结合到自动状态机中的 Whens

    我正在向 MassTransit 状态机传奇发出请求并等待回复 但我可能会遇到两个错误 MyRequest TimeoutExpired 已过期 我的请求 故障 我不关心在哪些条件下未满足请求 我希望这两种情况都会导致发布错误消息 但是 我
  • Localstack 与 MassTransit 未收到消息

    我在使用 LocalStack 测试 MassTransit 时遇到问题 但在 AWS 中使用真正的 SNS SQS 一切正常 因此我怀疑这是 LocalStack 的问题 除非 MassTransit 需要配置 ServiceURL 以外
  • MassTransit Consumer 中的异常冒泡导致 Windows 服务崩溃

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

    我正在使用 RabbitMQ 版本 3 0 2 我在错误队列中看到接近 1000 条消息 我想知道 消息在什么时候被移至错误队列 有没有办法知道为什么某个消息被移动到错误队列 有什么方法可以将消息从错误队列移动到正常队列吗 谢谢 a 无法反
  • Mass Transit:当存在不同消息类型时确保消息处理顺序

    我是公共交通新手 我想了解它是否对我的情况有帮助 我正在构建一个使用 CQRS 事件源架构实现的示例应用程序 并且我需要一个服务总线 以便将命令堆栈创建的事件分派到查询堆栈反规范化器 假设我们的域中有一个聚合 我们称之为Photo 以及两个
  • 在 Asp.Net Core Web API 中使用 MassTransit 消息时如何对用户进行身份验证?

    我有几个使用 Bearer 身份验证的 Asp Net Core Web APIIdentityServer4 AccessTokenValidation用于内省令牌 验证用户身份并创建声明的中间件 这对于 HTTP 请求来说效果很好 我正
  • 使用 MSMQ 和 SQL Server 进行分布式事务,但有时会出现脏读

    我们的 SQL Server 2014 数据库设置为READ COMMITTED SNAPSHOT 我们使用 MSMQ 和分布式事务 我们使用 MassTransit 2 10 在我们系统的一部分中 我们从队列中读取一条消息 进行数据库更新
  • 配置要在 Consumer 中传递的端点时添加元数据

    因此 当我配置端点并设置ep Consumer
  • MassTransit - 等待所有活动完成然后继续处理

    如果我有很多活动 是否会导致资源阻塞或请求超时 这是我的场景 我有一个 api 控制器 它向消费者发送订单请求 我使用请求 响应模式来接收错误信息来自消费者的属性并基于该属性响应返回 如果它为空我想返回OK 否则 返回BadRequest
  • 消息总线中的总线发现

    我正试图了解消息总线和国际奥委会 但我的脑子里充满了问题 这就是我想到的场景 三台电脑通过局域网连接 无法访问互联网 这三台计算机各自运行一个服务 并自动自我发现其他计算机 换句话说 它们各自在公共总线上发送消息 这表明了他们自己的身份 从
  • MassTransit/RabbitMq 错误队列 - 如何删除消息?

    我有一个队列 QueueName 我定义了消费者和错误消息消费者如下 cfg ReceiveEndpoint queueName QueueName e gt e UseMessageRetry r gt r Immediate 2 e A
  • 大众运输和简单注射器[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在审查 NET 的 MassTr
  • 如何覆盖 MassTransit 默认交换和队列拓扑约定?

    正如 在我关于SO的一个问题中 所指出的 为什么 MassTransit 中的简单配置会创建 2 个队列和 3 个交换机 https stackoverflow com questions 56064182 why a simple con
  • MassTransit 2.6.1 请求/响应模式 - 响应超时

    我正在将 MassTransit 作为 ServiceBus 实现来在 Web 项目中使用 我正在玩请求 响应 http docs masstransit project com en latest overview request htm
  • 公共交通所有故障消息由一名故障消费者处理

    如何拥有一个通用消费者来处理所有故障消息 我是否需要为每条故障消息注册故障消费者 为何不消费Fault public class WantAllFaultsGimmeThem IConsumer
  • MassTransit 是否支持基于 HTTP 传输的 MSMQ?

    HTTP 传输自 MSMQ 3 0 起就可用 但恐怕 MassTransit 不提供使用 HTTP 协议作为队列之间的传输协议的功能 关于这个有一个非常相似的问题here https stackoverflow com questions
  • MassTransit AzureServiceBus 生成的队列

    我有一个托管在 Azure Service Fabric 解决方案中的 MT 设置的工作配置 我有一个发送消息的 API 和一个读取消息的无状态应用程序 在无状态应用程序中 我告诉它使用类型的消息TestMessage具有以下内容 cont

随机推荐

  • 打开键盘时隐藏页脚 ionic4

    参考了这个链接 在键盘打开 Ionic3 上隐藏页脚 https stackoverflow com questions 48386422 hide footer on keyboard open ionic3 但问题也是一样的 问题与上图
  • 如何使用 OSGi 和 EE6 模块化企业应用程序?

    我知道已经有一些与该主题相关的问题 但我还找不到真正的解决方案 目前我正在使用 EE6 JPA CDI JSF 开发应用程序 我想采用一种更加模块化的方法 而不是将所有内容打包到 WAR 或 EAR 中并将整个内容部署在应用程序服务器上 我
  • WooCommerce 在产品标题中显示产品类别

    我有一个运行 WooCommerce 版本 2 3 8 的 Wordpress 版本 4 2 2 电子商务网站 在我的个人产品页面上 我希望将产品的标题设置为还包括我在 WooCommerce 中创建的以及该产品所属的自定义类别 我找到与单
  • 项目贡献者的 github graphql 查询

    我想使用 GitHub Graphql api 查询项目贡献者 有人能给我任何提示吗 刚刚尝试了一段时间 我想我错过了一些小元素 我想要得到某样东西https api github com repos facebook react cont
  • 核心数据图像不会加载到 NSTableView 图像单元中

    在我的代码中 我将图像存储到我的核心数据模型中 工作正常 如果我将视图设置为具有 NSImageView 并将其数据绑定到 Controller Key selection 和 modelKeyPath myImagePath 则它可以工作
  • 如何通过htaccess在URL中添加index.php

    实际上我需要通过 htaccess 文件在我的应用程序 URL 中添加 index php 我的网址是这样的 http localhost 8080 myapp xyz abs html 我需要将其更改为 http localhost 80
  • 在 PHP 中检索相对 DOM 节点

    我想检索文档中下一个元素标签的数据 例如 我想找回 blockquote Content 1 blockquote 仅适用于每个不同的跨度 span span blockquote Content 1 blockquote blockquo
  • 如何生成一次性密码(OTP / HOTP)?

    我们决定通过为客户发布 iPhone Android 和 Blackberry 应用程序的方式开始进行多重身份验证 Think 的一次性密码系统 我知道如何生成一个独特的string通过使用基于帐户密钥加上设备序列号 或其他唯一标识符 的
  • FirstOrDefault 之后对象是否仍连接到列表?

    这是我的代码 Event thisEvent from i in list where i eventID eventID select i FirstOrDefault if thisEvent null thisEvent eventR
  • 命名空间“System.Data”中不存在类型或命名空间名称“OracleClient”

    当尝试运行我的代码时 我收到以下错误 CS0234 命名空间 System Data 中不存在类型或命名空间名称 OracleClient 是否缺少程序集引用 我已经引用了System Data dll and System Data Or
  • 无需安装即可替代 xuggler 进行视频编码? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在创建一个截屏 Java Web Start 应用程序 使用 xuggler 编码视频需要 在客户端
  • 如何去除凸度缺陷?

    我正在尝试从轮廓检测并精细定位图像中的某些对象 我得到的轮廓通常包含一些噪音 可能来自背景 我不知道 这些对象应该看起来类似于矩形或正方形 如下所示 我通过形状匹配得到了非常好的结果 cv matchShapes 来检测其中包含或不包含噪声
  • 使用自制程序和 Xcode 8.1.1 安装 Mongodb 失败

    跑步时brew install mongodb 我得到以下输出 Updating Homebrew mongodb A full installation of Xcode app 8 3 2 is required to compile
  • 单击按钮时以特殊顺序保存数据

    我创建了一个应用程序 用户可以在其中添加一些注释到特定的car 在我的例子中 用户必须能够添加评论并对汽车进行评分 const App gt const state setState useState visible false const
  • sveltekit 中的 SPA / SSR

    我有一个页面 categories 在里面load函数来自 categories page server js我通过加载类别data来自数据库作为 JSON 对象 我将它们显示在 categories page svelte作为一个列表 当
  • 关联词的邻近度

    假设我有一段大约一段时间的对话文本记录 1小时 我想知道哪些词彼此相邻 我将使用什么类型的统计技术来确定哪些单词聚集在一起以及它们彼此之间的接近程度如何 我怀疑某种聚类分析或主成分分析 要确定单词的邻近度 您必须构建一个图表 每个单词都是一
  • 找不到“RdlCompile”任务

    我正在尝试使用 rldc 文件进行编译和项目 但出现以下两个错误之一 无法从程序集 Microsoft ReportViewer Common Version 10 0 0 0 Culture neutral PublicKeyToken
  • Qt:使TableView的宽度适合内容的宽度

    我有一个窗口 其中包含QTableView which 栏目根据内容进行调整并且是宽度固定 The QTableView嵌套在一个QWidget依次嵌套在QScrollArea依次嵌套在tabbed QMdiArea哪一个是centralW
  • 如何在 GWT 中解析大数据 (XML)

    在我的 GWT 应用程序中 我从 REST 服务器检索 XML 数据 我正在使用 Piriti XML 解析器https code google com p piriti wiki Xml https code google com p p
  • 派生类型不会发布给 MassTransit 中的消费者

    我在发布派生类型的通用消息以及使用 MassTransit v2 8 0 调用处理程序时遇到问题 如果我发布一条类型的消息HtmlBlockNewMessage 消费者永远不会被调用 如果我发布一个ServiceBusMessage反对并改