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"。
这样可以吗?
我找到了一个解决方案。在我的"后台"上,我期望消息类型为TestMessage
mqService.RegisterHandler<TestMessage>(ServiceController.ExecuteMessage);
但是,当使用MessageQueuePublisher.Publish时,消息的类型为对象,并转到目标队列,因此未得到处理。
所以要解决这个问题,发布方法应该是通用的:
public void Publish<T>(T message)
它不会改变方法的调用方式,但代码并不是很好,因为若您查看它,就不清楚为什么要使用泛型。但至少它有效。