Skip to content

conventional configuration of send only topics in MQTT is not working #1634

@vzam

Description

@vzam

Describe the bug
When configuring an MQTT sender with a custom IMessageSerializer via ConfigureSenders(...).DefaultSerializer(...), the specified serializer is never invoked when publishing messages. Instead, Wolverine appears to bypass the sender configuration entirely.

To Reproduce

  1. Steps to reproduce the behavior:
  2. Create a new Wolverine project with MQTT support.
  3. Configure an MQTT sender with .DefaultSerializer(new Serializer()) in ConfigureSenders.
  4. Implement a simple IMessageSerializer that throws in Write so you can see if it’s called.
  5. Publish any message through the bus.
  6. Observe that the serializer’s methods are never invoked.
  7. Change configuration to use .PublishMessagesToMqttTopic(...).DefaultSerializer(new Serializer()) and see that it works as expected.

Repro code:

using Wolverine;
using Wolverine.MQTT;
using Wolverine.Runtime.Serialization;

var builder = Host.CreateApplicationBuilder(args);

builder.Services.AddWolverine(cfg =>
{
    // cfg.PublishMessagesToMqttTopic((Event e) => e.Id).DefaultSerializer(new Serializer());
    cfg.PublishMessagesToMqttTopic((Event e) => e.Id);
    
    cfg.UseMqttWithLocalBroker()
        .ConfigureSenders(sub => sub.DefaultSerializer(new Serializer()));
});

builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

public record Event(string Id);

public class Worker(IServiceProvider services) : IHostedService
{
    public async Task StartAsync(CancellationToken cancellationToken)
    {
        using var scope = services.CreateScope();
        
        var bus = scope.ServiceProvider.GetRequiredService<IMessageBus>();
        
        await bus.PublishAsync(new Event("123"));
    }

    public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}

public class Serializer : IMessageSerializer
{
    public byte[] Write(Envelope envelope) => throw new NotImplementedException();

    public object ReadFromData(Type messageType, Envelope envelope) => throw new NotImplementedException();

    public object ReadFromData(byte[] data) => throw new NotImplementedException();

    public byte[] WriteMessage(object message) => throw new NotImplementedException();

    public string ContentType => "text/plain";
}

Expected behavior
The custom serializer passed into .DefaultSerializer(...) should be invoked when publishing messages over MQTT.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions