示例#1
0
        public async Task PublishAsync(EventPublishData data, PublishPreferences preferences)
        {
            var eventDesc = new EventDescriptor {
                Service = data.Service, Event = data.Event
            };
            var subscribers = _eventSubscriber.GetSubscribers(eventDesc).ToList();

            if (subscribers.Count == 0)
            {
                return;
            }

            foreach (var subscriber in subscribers)
            {
                var invokeData = new MethodInvocationData
                {
                    IntentId    = _idGenerator.NewId(),
                    Service     = subscriber.Service,
                    Method      = subscriber.Method,
                    Parameters  = data.Parameters,
                    FlowContext = data.FlowContext,
                    Caller      = new CallerDescriptor(data.Service, data.Event, data.IntentId)
                };

                InvokeInBackground(invokeData, preferences);
            }
        }
 public static void Write(Message message, EventPublishData data, PublishPreferences preferences, ISerializer serializer)
 {
     message.Data["IntentId"]   = data.IntentId;
     message.Data["Service"]    = data.Service.Clone();
     message.Data["Event"]      = data.Event.Clone();
     message.Data["Format"]     = serializer.Format;
     message.Data["Parameters"] = serializer.SerializeToString(data.Parameters);
     message.Data["Caller"]     = data.Caller?.Clone();
     message.Data["SkipLocal"]  = preferences.SkipLocalSubscribers;
 }
示例#3
0
        public Task PublishAsync(EventPublishData data, PublishPreferences preferences)
        {
            var message = new Message
            {
                Type = MessageType.Event,
            };

            EventPublishDataTransformer.Write(message, data, preferences, _serializer);

            _messageHub.Schedule(message);

            return(Task.CompletedTask);
        }
示例#4
0
 private async void InvokeInBackground(MethodInvocationData data, PublishPreferences preferences)
 {
     if (!_serviceResolver.TryResolve(data.Service, out var service) ||
         service.Definition.Type == Modeling.ServiceType.External)
     {
         var communicator = _communicatorProvider.GetCommunicator(data.Service, data.Method, assumeExternal: true);
         await communicator.InvokeAsync(data, default);
     }
     else if (!preferences.SkipLocalSubscribers)
     {
         var message = new HttpCommunicatorMessage {
             IsRetry = false
         };
         await _localMethodRunner.RunAsync(data, message);
     }
 }
        public async Task PublishAsync(EventPublishData data, PublishPreferences preferences)
        {
            var exchangeName = _settings.ExchangeName
                               .Replace("{serviceName}", data.Service.Name)
                               .Replace("{eventName}", data.Event.Name);

            // TODO: declare once? what's the penalty?
            _channel.ExchangeDeclare(
                exchangeName,
                type: "fanout",
                durable: true,
                autoDelete: false,
                arguments: null);

            var properties = CreateMessageProperties(_channel);

            properties.Type = MessageTypes.Event;
            SetIntentId(properties, data.IntentId);
            SetFormat(properties, _serializer);
            properties.Headers.Add("X-Service-Name", data.Service.Name);
            properties.Headers.Add("X-Event-Name", data.Event.Name);
            if (preferences.SkipLocalSubscribers)
            {
                properties.Headers.Add("X-Skip-Local", true);
            }

            var payload = SerializePayload(data);

            _channel.BasicPublish(
                exchange: exchangeName,
                routingKey: "",
                basicProperties: properties,
                body: payload);

            _channel.WaitForConfirms(); // no async version :(
        }
示例#6
0
        public async Task PublishAsync(EventPublishData data, PublishPreferences preferences)
        {
            await LocalPublisher.PublishAsync(data, default);

            await ExternalPublisher.PublishAsync(data, new PublishPreferences { SkipLocalSubscribers = true });
        }