ServiceBusTrigger POCO反序列化

时间:2016-09-01 20:24:34

标签: azure azure-webjobs azure-webjobssdk

我想看看是否/如何插入用ServiceBusTrigger修饰的参数的反序列化过程?

说我有一个看起来像的函数:

public static void HandleMessage([ServiceBusTrigger("myqueue")] MyCustomType myCustomType) { }

我将如何接管反序列化?我知道有一个IArgumentBindingProvider和IArgumentBinding的概念,但它看起来不像ServiceBusTrigger支持这些概念。

我知道我可以使用GetBody< Stream>()并反序列化,但我想知道我是否可以插入ServiceBusTrigger的管道。通过查看SDK,ServiceBusTrigger有一个IQueueArgumentBindingProviders的硬编码列表,因此我无法添加自己的。

1 个答案:

答案 0 :(得分:0)

如果您查看Azure WebJobs SDK Extensions,可以查看如何创建自己的绑定:

否则ServiceBusConfiguration会公开一个允许您拦截ServiceBusTrigger管道的MessagingProvider属性:

private static void Main()
{
    var sbConfig = new ServiceBusConfiguration()
    {
        MessagingProvider = // you implemetation of the MessagingProvider class goes here !!!
    };
    var config = new JobHostConfiguration();
    config.UseServiceBus(sbConfig);
    new JobHost(config).RunAndBlock();
}

以下是MessagingProvider实施的简单框架:

public sealed class MyMessagingProvider : MessagingProvider
{
    private readonly ServiceBusConfiguration _config;

    public MyMessagingProvider(ServiceBusConfiguration config)
        : base(config)
    {
        _config = config;
    }

    public override MessageProcessor CreateMessageProcessor(string entityPath)
    {
        return new MyMessageProcessor(_config.MessageOptions);
    }

    private class MyMessageProcessor : MessageProcessor
    {
        public MyMessageProcessor(OnMessageOptions messageOptions)
            : base(messageOptions)
        {
        }


        public override Task<bool> BeginProcessingMessageAsync(BrokeredMessage message, CancellationToken cancellationToken)
        {
            // Intercept the message before the execution of the triggerred function
            return base.BeginProcessingMessageAsync(message, cancellationToken);
        }

        public override Task CompleteProcessingMessageAsync(BrokeredMessage message, FunctionResult result, CancellationToken cancellationToken)
        {
            // Intercept the message after the execution of the triggerred function and before being completed
            return base.CompleteProcessingMessageAsync(message, result, cancellationToken);
        }
    }
}

所以你现在的主要功能是:

private static void Main()
{
    var sbConfig = new ServiceBusConfiguration();
    sbConfig.MessagingProvider = new MyMessagingProvider(sbConfig);
    var config = new JobHostConfiguration();
    config.UseServiceBus(sbConfig);
    new JobHost(config).RunAndBlock();
}