ServiceStack RedisMessageQueueClient异常行为

本文关键字:异常 RedisMessageQueueClient ServiceStack | 更新日期: 2023-09-27 18:29:26

我的基础设施:

  • Main-ServiceStack自托管控制台应用程序。'Main向MQ发送消息
  • 后台-ServiceStack自托管控制台应用程序。'后台"接收来自MQ的消息
  • 本地安装的Redis

在"主"AppHost中,我配置Redis管理器:

container.Register<IRedisClientsManager>(
    new PooledRedisClientManager("localhost:6379"));

然后我在服务中的某个地方运行此代码:

using (var client = new RedisMessageQueueClient(TryResolve<IRedisClientsManager>()))
{
    client.Publish(new TestMessage { Value = "From ping" });
}

一切都很好,我可以在"后台"收到消息。但问题来了,当我在类中包装这个代码:

public class MessageQueuePublisher : IMessageQueuePublisher
{
    public void Publish(object message)
    {
        using (var client = new RedisMessageQueueClient(
            EndpointHost.AppHost.TryResolve<IRedisClientsManager>()))
        {
            client.Publish(message);
        }
    }
} 

当我从执行上一个代码的同一个地方调用MessageQueuePublisher.Publish方法时,它似乎工作正常(没有引发异常),但我的消息没有到达"Background"。

这样可以吗?

ServiceStack RedisMessageQueueClient异常行为

我找到了一个解决方案。在我的"后台"上,我期望消息类型为TestMessage

mqService.RegisterHandler<TestMessage>(ServiceController.ExecuteMessage);

但是,当使用MessageQueuePublisher.Publish时,消息的类型为对象,并转到目标队列,因此未得到处理。

所以要解决这个问题,发布方法应该是通用的:

public void Publish<T>(T message)

它不会改变方法的调用方式,但代码并不是很好,因为若您查看它,就不清楚为什么要使用泛型。但至少它有效。