0

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

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

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

这很好,但如果你有一百个听众,问题就来了?

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

喜欢 :

    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) })    
});

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

另一方面,我通过构建总线进行注册:

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});});

但它不尊重我的注册,因为当我看到高级总线消耗的代码时:消耗它从工厂创建的代码而不是从容器中读取的代码。我相信这是一个根本原因。

4

1 回答 1

0

为了解决这个要求,我使用了 IAdvanceBus 中的这个方法:

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

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

于 2015-09-01T08:39:57.973 回答