public QueueTriggerBinding(string parameterName,
                                   QueueServiceClient queueServiceClient,
                                   QueueClient queue,
                                   ITriggerDataArgumentBinding <QueueMessage> argumentBinding,
                                   QueuesOptions queueOptions,
                                   IWebJobsExceptionHandler exceptionHandler,
                                   SharedQueueWatcher messageEnqueuedWatcherSetter,
                                   ILoggerFactory loggerFactory,
                                   IQueueProcessorFactory queueProcessorFactory,
                                   QueueCausalityManager queueCausalityManager)
        {
            _queueServiceClient = queueServiceClient ?? throw new ArgumentNullException(nameof(queueServiceClient));
            _queue                        = queue ?? throw new ArgumentNullException(nameof(queue));
            _argumentBinding              = argumentBinding ?? throw new ArgumentNullException(nameof(argumentBinding));
            _bindingDataContract          = CreateBindingDataContract(argumentBinding.BindingDataContract);
            _queueOptions                 = queueOptions ?? throw new ArgumentNullException(nameof(queueOptions));
            _exceptionHandler             = exceptionHandler ?? throw new ArgumentNullException(nameof(exceptionHandler));
            _messageEnqueuedWatcherSetter = messageEnqueuedWatcherSetter ?? throw new ArgumentNullException(nameof(messageEnqueuedWatcherSetter));
            _queueCausalityManager        = queueCausalityManager ?? throw new ArgumentNullException(nameof(queueCausalityManager));

            _parameterName         = parameterName;
            _loggerFactory         = loggerFactory;
            _queueProcessorFactory = queueProcessorFactory;
            _converter             = CreateConverter(_queue);
            _logger = loggerFactory.CreateLogger <QueueTriggerBinding>();
        }
Пример #2
0
        public QueueTriggerAttributeBindingProvider(INameResolver nameResolver,
                                                    QueueServiceClientProvider queueServiceClientProvider,
                                                    IOptions <QueuesOptions> queueOptions,
                                                    IWebJobsExceptionHandler exceptionHandler,
                                                    SharedQueueWatcher messageEnqueuedWatcherSetter,
                                                    ILoggerFactory loggerFactory,
                                                    IQueueProcessorFactory queueProcessorFactory,
                                                    QueueCausalityManager queueCausalityManager)
        {
            _queueServiceClientProvider = queueServiceClientProvider ?? throw new ArgumentNullException(nameof(queueServiceClientProvider));
            _queueOptions                 = (queueOptions ?? throw new ArgumentNullException(nameof(queueOptions))).Value;
            _exceptionHandler             = exceptionHandler ?? throw new ArgumentNullException(nameof(exceptionHandler));
            _messageEnqueuedWatcherSetter = messageEnqueuedWatcherSetter ?? throw new ArgumentNullException(nameof(messageEnqueuedWatcherSetter));
            _queueCausalityManager        = queueCausalityManager ?? throw new ArgumentNullException(nameof(queueCausalityManager));

            _nameResolver          = nameResolver;
            _loggerFactory         = loggerFactory;
            _queueProcessorFactory = queueProcessorFactory;

            _innerProvider =
                new CompositeArgumentBindingProvider(
                    new ConverterArgumentBindingProvider <QueueMessage>(new CloudQueueMessageDirectConverter(), loggerFactory), // $$$: Is this the best way to handle a direct CloudQueueMessage? TODO (kasobol-msft) is this needed?
                    new ConverterArgumentBindingProvider <string>(new StorageQueueMessageToStringConverter(), loggerFactory),
                    new ConverterArgumentBindingProvider <byte[]>(new StorageQueueMessageToByteArrayConverter(), loggerFactory),
                    new ConverterArgumentBindingProvider <BinaryData>(new StorageQueueMessageToBinaryDataConverter(), loggerFactory),
                    new UserTypeArgumentBindingProvider(loggerFactory)); // Must come last, because it will attempt to bind all types.
        }
        public QueueListenerFactory(
            QueueServiceClient queueServiceClient,
            QueueClient queue,
            QueuesOptions queueOptions,
            IWebJobsExceptionHandler exceptionHandler,
            SharedQueueWatcher messageEnqueuedWatcherSetter,
            ILoggerFactory loggerFactory,
            ITriggeredFunctionExecutor executor,
            IQueueProcessorFactory queueProcessorFactory,
            QueueCausalityManager queueCausalityManager,
            FunctionDescriptor descriptor
            )
        {
            _queue                        = queue ?? throw new ArgumentNullException(nameof(queue));
            _queueOptions                 = queueOptions ?? throw new ArgumentNullException(nameof(queueOptions));
            _exceptionHandler             = exceptionHandler ?? throw new ArgumentNullException(nameof(exceptionHandler));
            _messageEnqueuedWatcherSetter = messageEnqueuedWatcherSetter ?? throw new ArgumentNullException(nameof(messageEnqueuedWatcherSetter));
            _executor                     = executor ?? throw new ArgumentNullException(nameof(executor));
            _descriptor                   = descriptor ?? throw new ArgumentNullException(nameof(descriptor));
            _queueCausalityManager        = queueCausalityManager ?? throw new ArgumentNullException(nameof(queueCausalityManager));

            _poisonQueue           = CreatePoisonQueueReference(queueServiceClient, queue.Name);
            _loggerFactory         = loggerFactory;
            _queueProcessorFactory = queueProcessorFactory;
        }
Пример #4
0
            public void Initialize(
                ExtensionConfigContext context,
                QueueServiceClientProvider queueServiceClientProvider,
                IContextGetter <IMessageEnqueuedWatcher> contextGetter,
                QueueCausalityManager queueCausalityManager)
            {
                _queueServiceClientProvider   = queueServiceClientProvider;
                _messageEnqueuedWatcherGetter = contextGetter;
                _queueCausalityManager        = queueCausalityManager;

                // IStorageQueueMessage is the core testing interface
                var binding = context.AddBindingRule <QueueAttribute>();

                binding
                .AddConverter <byte[], QueueMessage>(ConvertByteArrayToCloudQueueMessage)
                .AddConverter <string, QueueMessage>(ConvertStringToCloudQueueMessage)
                .AddConverter <BinaryData, QueueMessage>(ConvertBinaryDataToCloudQueueMessage)
                .AddOpenConverter <OpenType.Poco, QueueMessage>(ConvertPocoToCloudQueueMessage);

                context // global converters, apply to multiple attributes.
                .AddConverter <QueueMessage, byte[]>(ConvertCloudQueueMessageToByteArray)
                .AddConverter <QueueMessage, string>(ConvertCloudQueueMessageToString)
                .AddConverter <QueueMessage, BinaryData>(ConvertCloudQueueMessageToBinaryData);

                var builder = new QueueBuilder(this);

                binding.AddValidator(ValidateQueueAttribute);

                binding.BindToCollector <QueueMessage>(this);

                binding.BindToInput <QueueClient>(builder);

                binding.BindToInput <QueueClient>(builder);
            }
        private static void TestOwnerIsNull(QueueMessage message)
        {
            // Act
            Guid?owner = QueueCausalityManager.GetOwner(message);

            // Assert
            Assert.Null(owner);
        }
Пример #6
0
 public QueuesExtensionConfigProvider(QueueServiceClientProvider queueServiceClientProvider, IContextGetter <IMessageEnqueuedWatcher> contextGetter,
                                      QueueTriggerAttributeBindingProvider triggerProvider, QueueCausalityManager queueCausalityManager)
 {
     _contextGetter = contextGetter;
     _queueServiceClientProvider = queueServiceClientProvider;
     _triggerProvider            = triggerProvider;
     _queueCausalityManager      = queueCausalityManager;
 }
Пример #7
0
        public async Task <bool> ExecuteAsync(IStorageQueueMessage value, CancellationToken cancellationToken)
        {
            Guid?parentId = QueueCausalityManager.GetOwner(value);
            IFunctionInstance instance  = _instanceFactory.Create(value, parentId);
            IDelayedException exception = await _innerExecutor.TryExecuteAsync(instance, cancellationToken);

            return(exception == null);
        }
        public void SetOwner_IfUnsupportedValueType_Throws()
        {
            // Arrange
            var  jobject = CreateJsonObject(123);
            Guid g       = Guid.NewGuid();

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => QueueCausalityManager.SetOwner(g, jobject), "token");
        }
Пример #9
0
            // Hook JObject serialization to so we can stamp the object with a causality marker.
            private static Task <JObject> SerializeToJobject(object input, Attribute attrResolved, ValueBindingContext context)
            {
                JObject objectToken        = JObject.FromObject(input, JsonSerialization.Serializer);
                var     functionInstanceId = context.FunctionInstanceId;

                QueueCausalityManager.SetOwner(functionInstanceId, objectToken);

                return(Task.FromResult <JObject>(objectToken));
            }
Пример #10
0
        public async Task <FunctionResult> ExecuteAsync(CloudQueueMessage value, CancellationToken cancellationToken)
        {
            Guid?parentId = QueueCausalityManager.GetOwner(value);
            TriggeredFunctionData input = new TriggeredFunctionData
            {
                ParentId     = parentId,
                TriggerValue = value
            };

            return(await _innerExecutor.TryExecuteAsync(input, cancellationToken));
        }
Пример #11
0
        public async Task <FunctionResult> ExecuteAsync(QueueMessage value, CancellationToken cancellationToken)
        {
            Guid?parentId = QueueCausalityManager.GetOwner(value);
            TriggeredFunctionData input = new TriggeredFunctionData
            {
                ParentId       = parentId,
                TriggerValue   = value,
                TriggerDetails = PopulateTriggerDetails(value)
            };

            return(await _innerExecutor.TryExecuteAsync(input, cancellationToken).ConfigureAwait(false));
        }
        public void SetOwner_IfValidOwner_AddsOwner()
        {
            // Arrange
            var jobject = CreateJsonObject(new Payload {
                Val = 123
            });
            Guid g = Guid.NewGuid();

            // Act
            QueueCausalityManager.SetOwner(g, jobject);

            // Assert
            AssertOwnerEqual(g, jobject.ToString());
        }
        public void SetOwner_IfEmptyOwner_DoesNotAddOwner()
        {
            // Arrange
            var jobject = CreateJsonObject(new Payload {
                Val = 123
            });
            Guid g = Guid.Empty;

            // Act
            QueueCausalityManager.SetOwner(g, jobject);

            // Assert
            AssertOwnerIsNull(jobject.ToString());
        }
        public IStorageQueueMessage Convert(TInput input)
        {
            JToken token;

            if (input == null)
            {
                token = new JValue((string)null);
            }
            else
            {
                JObject objectToken = JObject.FromObject(input, JsonSerialization.Serializer);
                Debug.Assert(objectToken != null);
                QueueCausalityManager.SetOwner(_functionInstanceId, objectToken);
                token = objectToken;
            }

            string contents = token.ToJsonString();

            return(_queue.CreateMessage(contents));
        }
 private static Guid?GetOwner(string message)
 {
     return(QueueCausalityManager.GetOwner(CreateMessage(message)));
 }
 public QueueTriggerExecutor(ITriggeredFunctionExecutor innerExecutor, QueueCausalityManager queueCausalityManager)
 {
     _innerExecutor         = innerExecutor;
     _queueCausalityManager = queueCausalityManager;
 }