private async Task OnApplicationMessageReceived(MqttApplicationMessageReceivedEventArgs eventArgs) { var application = ApplicationProvider.Current; if (application?.RequestDelegate == null) { eventArgs.ProcessingFailed = true; return; } using (var scope = ServiceScopeFactory.CreateScope()) { var success = false; var context = new MqttRequestContext(scope.ServiceProvider, eventArgs.ApplicationMessage, eventArgs.ClientId); try { success = await application.RequestDelegate?.Invoke(context); } catch (Exception exc) { Logger.LogError(exc, $"Request failed to process: {exc.Message}"); } eventArgs.ProcessingFailed = !success; } }
public static IMqttApplicationBuilder MapProcessor <TProcessor, TTopicParameters>( this IMqttApplicationBuilder mqttApplicationBuilder, string topicPattern, Func <TTopicParameters, bool> parametersPredicate = null, Action <ITopicBinderFactoryBuilder <TTopicParameters> > topicBinderFactoryBuilderConfigurator = null, MqttQualityOfServiceLevel?qualityOfServiceLevel = null, bool?noLocal = null, bool?retainAsPublished = null, MqttRetainHandling?retainHandling = null) where TProcessor : IMqttRequestProcessor <TTopicParameters> where TTopicParameters : class, new() { var topicBinder = CreateTopicBinder(topicPattern, topicBinderFactoryBuilderConfigurator); return(mqttApplicationBuilder.Map( topicPattern, async context => { if (topicBinder.IsMatch(context.Topic)) { TTopicParameters parameters; try { parameters = topicBinder.Bind(context.Topic); } catch { return false; } if (parametersPredicate?.Invoke(parameters) ?? true) { var parameterizedContext = new MqttRequestContext <TTopicParameters>(context, parameters); var processor = context.ServiceProvider.GetRequiredService <TProcessor>(); return await processor.ProcessRequest(parameterizedContext); } } return false; }, qualityOfServiceLevel, noLocal, retainAsPublished, retainHandling)); }
public static IMqttApplicationBuilder Map <TTopicParameters>( this IMqttApplicationBuilder mqttApplicationBuilder, string topicPattern, MqttRequestDelegate <TTopicParameters> middleware, Func <TTopicParameters, bool> parametersPredicate = null, Action <ITopicBinderFactoryBuilder <TTopicParameters> > topicBinderFactoryBuilderConfigurator = null, MqttQualityOfServiceLevel?qualityOfServiceLevel = null, bool?noLocal = null, bool?retainAsPublished = null, MqttRetainHandling?retainHandling = null) where TTopicParameters : class, new() { var topicBinder = CreateTopicBinder(topicPattern, topicBinderFactoryBuilderConfigurator); return(mqttApplicationBuilder.Map( topicPattern, async context => { if (topicBinder.IsMatch(context.Topic)) { TTopicParameters parameters; try { parameters = topicBinder.Bind(context.Topic); } catch { return false; } if (parametersPredicate?.Invoke(parameters) ?? true) { var ctx = new MqttRequestContext <TTopicParameters>(context, parameters); return await middleware.Invoke(ctx); } } return false; }, qualityOfServiceLevel, noLocal, retainAsPublished, retainHandling)); }
public MqttCommandContext(MqttRequestContext context, TEntity entity, TEntityDefinition entityDefinition) { Entity = entity; EntityDefinition = entityDefinition; ContentType = context.ContentType; CorrelationData = context.CorrelationData; MessageExpiryInterval = context.MessageExpiryInterval; Payload = context.Payload; PayloadFormatIndicator = context.PayloadFormatIndicator; QualityOfServiceLevel = context.QualityOfServiceLevel; ResponseTopic = context.ResponseTopic; Retain = context.Retain; SubscriptionIdentifiers = context.SubscriptionIdentifiers; Topic = context.Topic; TopicAlias = context.TopicAlias; UserProperties = context.UserProperties; ClientId = context.ClientId; }