派生类型不会发布给 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 中的消费者 的相关文章

  • 使用 MassTransit 使用交换和路由密钥发布消息

    我已经关注 MassTransit 几个星期了 我对它的可能性很好奇 但是 我似乎无法完全正确地理解这些概念 预期行为我想将消息发布到带有路由密钥的 直接 交换 该路由密钥绑定到两个不同的队列以执行其他活动 当我尝试使用 MassTrans
  • 有没有办法在设置消费者时定义Azure服务总线规则/过滤器?

    在多租户系统中引入 Azure 服务总线和 MassTransit 时 我正在探索我的选择 基本上 该系统由多项服务组成 其中一些是特定于租户的 而另一些则是共享的 服务在内部保存数据 租户数据是隔离的 每个租户都运行相同的服务集 只是他们
  • 有没有办法从 MassTransit 获取原始消息?

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

    我正在按照在 ASP NET Core 应用程序中使用 MassTransit 与 RabbitMQ 和 Autofac 的文档构建一个演示应用程序 我的程序代码 namespace MessageDemo public class Pro
  • 结合到自动状态机中的 Whens

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

    我在使用 LocalStack 测试 MassTransit 时遇到问题 但在 AWS 中使用真正的 SNS SQS 一切正常 因此我怀疑这是 LocalStack 的问题 除非 MassTransit 需要配置 ServiceURL 以外
  • 阻止 MassTransit 为消费者主机创建 RabbitMQ 交换

    是否可以将 MassTransit 配置为不为消费者主机创建 RabbitMQ 交换 我的 RabbitMQ 用户没有足够的权限在消费队列所在的主机上声明交换 因此 MassTransit 无法启动并出现以下错误 Unhandled Exc
  • MassTransit 与 RabbitMQ:消息何时移至错误队列

    我正在使用 RabbitMQ 版本 3 0 2 我在错误队列中看到接近 1000 条消息 我想知道 消息在什么时候被移至错误队列 有没有办法知道为什么某个消息被移动到错误队列 有什么方法可以将消息从错误队列移动到正常队列吗 谢谢 a 无法反
  • 在 Asp.Net Core Web API 中使用 MassTransit 消息时如何对用户进行身份验证?

    我有几个使用 Bearer 身份验证的 Asp Net Core Web APIIdentityServer4 AccessTokenValidation用于内省令牌 验证用户身份并创建声明的中间件 这对于 HTTP 请求来说效果很好 我正
  • 使用 BizTalk 代替 NServiceBus 或 MassTransit 的优点/缺点

    我很好奇它是否考虑使用 BizTalk 来实现 pub sub 消息传递架构 基本上我真正需要的就是你可以使用 NServiceBus 或 MassTransit 做的事情 我的经理倾向于坚持使用直接从 Microsoft 提供的框架 因此
  • CQRS 项目是否需要像 NServiceBus 这样的消息传递框架?

    过去 6 个月的学习曲线充满挑战 CQRS 和 DDD 是罪魁祸首 这很有趣 我们的项目已经完成了 1 2 我还没有时间深入研究的领域是消息传递框架 目前我不使用 DTC 因此如果我的读取模型未更新 那么很可能会出现读取和写入数据库之间的不
  • MassTransit - 等待所有活动完成然后继续处理

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

    我正试图了解消息总线和国际奥委会 但我的脑子里充满了问题 这就是我想到的场景 三台电脑通过局域网连接 无法访问互联网 这三台计算机各自运行一个服务 并自动自我发现其他计算机 换句话说 它们各自在公共总线上发送消息 这表明了他们自己的身份 从
  • 大众运输和简单注射器[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在审查 NET 的 MassTr
  • 如何通过 InMemoryTestHarness 成功驱动 MassTransitStateMachine?

    跟进 如何编写 MassTransitStateMachine 单元测试 https stackoverflow com questions 49763600 how to write masstransitstatemachine uni
  • 在点网核心应用程序中使用 RabbitMQ 跳过 MassTransit 中的队列

    我有三个项目 一个是Dot net core MVC 两个是API项目 MVC 正在调用一个 API 来获取用户详细信息 当询问用户详细信息时 我通过 MassTransit 向队列发送消息 我看到跳过队列 第三个项目中有消费者 即API项
  • MassTransit 是否支持基于 HTTP 传输的 MSMQ?

    HTTP 传输自 MSMQ 3 0 起就可用 但恐怕 MassTransit 不提供使用 HTTP 协议作为队列之间的传输协议的功能 关于这个有一个非常相似的问题here https stackoverflow com questions
  • 如何使用 MassTransit 测试工具通过构造函数依赖注入来测试 Consumer?

    我有一些消息使用者通过构造函数获取依赖项 我想在单元测试中涵盖它们 MassTransit 的测试工具是否提供了一种使用构造函数参数注册消费者的方法 创建消费者测试工具时 您可以指定工厂方法或消费者工厂 harness Consumer
  • MassTransit Autonomous 传奇中的条件转换

    我在传奇中有一些状态 并尝试实施状态检查重试 直到我在收到的消息中获得一些令人满意的值 说吧 我有这样的事情 During Pending When StatusChecked TransitionTo somethingThatDepen
  • 如何在公共交通中记录失败的消息?

    我正在寻找一个好的解决方案来在超出重试限制后立即记录失败消息 而无需处理错误队列 到目前为止我发现了什么 我可以继承InMemory入站消息跟踪器并覆盖是否超出重试限制 但此时除了 id 之外 没有关于消息本身的信息 我可以实施IInbou

随机推荐

  • 打开键盘时隐藏页脚 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反对并改