簡體   English   中英

您可以為每個 SendEndpoint 定義 UseRawJsonSerializer() 嗎?

[英]Can you define UseRawJsonSerializer() per SendEndpoint?

我們有多個端點; 只有一個是原始的 JSON,沒有來自 MassTransit 的消息標頭。

我將一個 ReceiveEndpoint 配置為能夠使用原始 JSON。作為測試,我將整個總線配置為使用原始 JSON,這按預期工作

僅配置一個 SendEndpoint 來發送原始 JSON 是我需要幫助的。

  • 您能否通過 DI 注入Bus ,使用GetSendEndpoint()獲取 SendEndpoint,然后更改所述 SendEndpoint 的序列化程序?
  • 或者可以只為每條總線定義用於發送的串行器嗎?
  • 我假設publish也存在同樣的問題?

總線配置:

builder.Services.AddMassTransit(x =>
{
    x.AddConsumer<AssemblingConsumer>();
    
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("localhost", h =>
        {
            h.Username("admin");
            h.Password("admin");
        });
        cfg.UseRawJsonSerializer();
        cfg.ReceiveEndpoint("Assembling", ep =>
        {
            ep.ConfigureConsumeTopology = false;
            ep.ClearSerialization();
            ep.UseRawJsonSerializer();
            ep.UseRawJsonDeserializer();
            ep.ConfigureConsumer<AssemblingConsumer>(context);
            // ep.Instance(assemblingConsumer);
        }); 
        cfg.ConfigureEndpoints(context);
    });
})

發送:

var endpoint = _bus.GetSendEndpoint(new Uri("queue:Assembling")).Result;
endpoint.Send<Message>(message);

我看到另一個解決方案:

為一個發送操作創建一個新總線,它使用原始 JSON。發送操作后再次處理總線以避免打開多個不再使用的連接。

  • 這是去go的路,還是有其他解決辦法?
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    cfg.Host("localhost", h =>
    {
        h.Username("admin");
        h.Password("admin");
    }); 
    cfg.UseRawJsonSerializer();
});

ProbeResult result = _bus.GetProbeResult();
Console.WriteLine(JsonConvert.SerializeObject(result)); 

var endpoint = bus.GetSendEndpoint(new Uri("queue:Assembling")).Result;
endpoint.Send<Message>(message);

蠻力,但您可以在發送消息時通過覆蓋序列化程序來更改序列化程序,如下所示:

await InputQueueSendEndpoint.Send(message, x =>
{
    x.Serializer = new SystemTextJsonRawMessageSerializer(RawSerializerOptions.All);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM