我的基础设施:
在'Main'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方法时,它似乎正常工作(没有抛出异常),但我的消息没有达到“背景”。
这样可以吗?
答案 0 :(得分:2)
我找到了解决方案。在我的'背景'上我希望消息的类型为TestMessage
mqService.RegisterHandler<TestMessage>(ServiceController.ExecuteMessage);
但是当使用 MessageQueuePublisher.Publish 时,消息的类型为 object ,并且转到对象队列并且未被处理。
所以要解决这个问题,Publish方法应该是通用的:
public void Publish<T>(T message)
它不会改变方法的调用方式,但是代码不是很好,因为如果你看一下,就不清楚为什么要使用泛型。但至少它有效。