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>(); }
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; }
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); }
public QueuesExtensionConfigProvider(QueueServiceClientProvider queueServiceClientProvider, IContextGetter <IMessageEnqueuedWatcher> contextGetter, QueueTriggerAttributeBindingProvider triggerProvider, QueueCausalityManager queueCausalityManager) { _contextGetter = contextGetter; _queueServiceClientProvider = queueServiceClientProvider; _triggerProvider = triggerProvider; _queueCausalityManager = queueCausalityManager; }
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"); }
// 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)); }
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)); }
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; }