从QueueClient.OnMessage回调中获取队列名称

时间:2016-07-21 14:46:44

标签: c# azure azureservicebus azure-servicebus-queues

QueueClient.OnMessage将回调函数Action<BrokeredMessaged>作为参数,由内部消息泵执行,该消息泵在消息可用时不断轮询队列(或订阅)。

我一直在查看Reflector中的BrokeredMessage类型但是找不到从BrokeredMessage对象获取消息来自的队列名称的方法(最后一部分是键)。如果可以的话,如何将其拉出来?

2 个答案:

答案 0 :(得分:0)

最后找出了一个使用反射的解决方案:

public void OnMessageCallback(BrokeredMessage message) {
    var context = message.GetType().GetProperty("ReceiveContext", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(message);
    var receiver = (MessageReceiver)context.GetType().GetProperty("MessageReceiver", BindingFlags.Public | BindingFlags.Instance).GetValue(context);
    var queueName = receiver.Path;
}

答案 1 :(得分:0)

如果您使用var newsListView: UIViewController! newsListView = mainStoryboard.instantiateViewControllerWithIdentifier("NewsList") sideMenuController()?.setContentViewController(newsListView) ,则可以执行以下操作:

QueueClient.OnMessage

如果您不想使用匿名函数,可以将queueName传递给将要处理消息的函数:

var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{

    // You always have access to the queue path
    var queueName = client.Path;
});

并称呼你这样的功能:

public void ProcessMessage(BrokeredMessage message, string queueName)
{

}

编辑:使用MessageReceiver

Azure ServiceBus SDK提供了一个抽象来接收来自队列或订阅的消息:

var client = QueueClient.CreateFromConnectionString("MyConnectionString");
client.OnMessage(message =>
{
    ProcessMessage(message , client.Path);
});