【问题标题】:problem with masstransit dynamic event publish ( json event )大众运输动态事件发布(json事件)的问题
【发布时间】:2021-12-01 22:02:17
【问题描述】:

我们需要将多个事件作为 json 字符串从 DB 发布。像这样通过公共交通发布这个 json 事件:

   using var scope = _serviceScopeFactory.CreateScope();
            var sendEndpointProvider = scope.ServiceProvider.GetService<ISendEndpointProvider>();
            var endpoint = await sendEndpointProvider.GetSendEndpoint(new System.Uri("exchange:IntegrationEvents.DynamicEvent:DynamicEvent"))
            var json = JsonConvert.SerializeObject(dynamicObject, Newtonsoft.Json.Formatting.None);// sample 
            var obj = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { });
            await endpoint.Send(obj,i=>i.Serializer.ContentType.MediaType= "application/json"); 

在配置中我们使用这个配置:

   cfg.UseRawJsonSerializer();

使用此配置时,json 事件已成功发布,但我们有一个奇怪的问题:“all”事件消费者被空消息数据调用! ...在Rabbitmq jsut 中发布了我们的“动态事件”,但在masstrasit 中,所有消费者都调用了! 感谢您让我们知道我们是否犯了错误

【问题讨论】:

    标签: asp.net-core rabbitmq masstransit messagebroker message-bus


    【解决方案1】:

    您不需要所有的 JSON 操作,只需使用为 RawJson 配置的序列化程序的端点发送消息对象。我将介绍 JSON 互操作性in this video

    此外,MassTransit 不允许发布匿名类型。您或许可以发布动态或 Expando 对象。

    【讨论】:

      【解决方案2】:

      我像这样使用 ExpandoObject 并得到这个异常“Messages types must not be in the System namespace: System.Dynamic.ExpandoObject”:

      dynamic dynamicObject = new ExpandoObject();
      dynamicObject.Id = 1;
      dynamicObject.Name = "NameForName";
      
      await endpoint.Send(dynamicObject);
      

      这样使用我们得到的结果与“all consumer called”相同:

       var dynamicObject = new ExpandoObject() as IDictionary<string, object>;
       dynamicObject.Add("Id", 1);
       dynamicObject.Add("Name", "NameForName");
      

      我观看了您的精彩视频,您直接从 rabbitmq 使用.. 如何在 C# 代码中“使用为 RawJson 配置的序列化程序的端点发送消息对象”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多