EasyNetQ - 通过非通用消息从IAdvanceBus消费消息

时间:2015-08-31 07:32:40

标签: c# rabbitmq messaging easynetq

是的,我们可以使用自动订阅者功能和普通订阅方法与此订阅ID,但这个解决方案在RMQ队列和交换中有点难看。很难跟踪和分析这些信息。

我使用高级总线并创建了自己的交换和队列。我发布成功,但消费部分有点失望。目前,它采用这种方式:

    IAdvanceBus = bus.Advanced.Consume(queueName, registration => 
{
    registration.Add(typeof(MESSAGE1), info => { ProcessMessage(MESSAGE1) })    
    registration.Add(typeof(MESSAGE2), info => { ProcessMessage(MESSAGE2) })    
    registration.Add(typeof(MESSAGE3), info => { ProcessMessage(MESSAGE3) })    
});

这很好但是如果你有100个听众的问题?

我检查了它只使用通用的注册类型IHandlerRegistration,我们可以使用非通用的方法吗?

喜欢:

RabbitHutch.CreateBus(connectionString, registeredServices => {
IEasyNetQLogger logger;
MyCustomHandlerCollection myHandlers = myDIContainer.Resolve<IMyHandlers>();

registeredServices.Register<IHandlerCollection>(s => 
{ 
    logger = s.Resolve<IEasyNetQLogger>();
    return myHandlers;
});
registeredServices.Register<IHandlerRegistration>(s => myHandlers});});

通过这种方式,我们可以扫描使用此消息的程序集。

另一方面,我通过公共汽车的建设注册:

{{1}}

但它不尊重我的注册,因为当我看到来自高级公共汽车消耗的代码:consume code它是从工厂创建的而不是从容器中读取的。我相信这是根本原因。

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我在IAdvanceBus中使用了这个方法:

IDisposable Consume(IQueue queue, Func<byte[], MessageProperties, MessageReceivedInfo, Task> onMessage);

我滚动了自己的消息调度程序并反序列化队列中的任何消息。集合调度程序将确定消息类型并分派给使用反射创建的特定处理程序。