Beispiel #1
0
        public void RaiseEvent <TParameters>(IProxy proxy, EventInfo @event, ref TParameters parameters)
            where TParameters : IValueContainer
        {
            var serviceProxyContext = (ServiceProxyContext)proxy.Context;

            var intent = new RaiseEventIntent
            {
                Id         = _numericIdGenerator.NewId(),
                ServiceId  = serviceProxyContext.Descriptor.Id,
                EventId    = _eventIdProvider.GetId(@event),
                Parameters = parameters
            };

            bool executeInline = !_transitionScope.IsActive || !IsCalledByRoutine(
                _transitionScope.CurrentMonitor.Context,
                // Skip 2 stack frames: current method and dynamically-generated proxy.
                // WARNING! DO NOT PUT 'new StackFrame()' into a helper method!
                new StackFrame(skipFrames: 2, fNeedFileInfo: false));

            if (executeInline)
            {
                RaiseEventInBackground(intent);
            }
            else
            {
                _transitionScope.CurrentMonitor.RegisterIntent(intent);
            }
        }
Beispiel #2
0
 public async void RaiseEventInBackground(RaiseEventIntent intent)
 {
     var actions = new ScheduledActions
     {
         RaiseEventIntents = new List <RaiseEventIntent>
         {
             intent
         }
     };
     await _transitionCommitter.CommitAsync(actions, transitionCarrier : null, ct : default(CancellationToken));
 }
        public void RegisterIntent(RaiseEventIntent intent)
        {
            var transitionContext = Context;
            var actions           = transitionContext.ScheduledActions;

            if (actions.RaiseEventIntents == null)
            {
                actions.RaiseEventIntents = new List <RaiseEventIntent>();
            }
            actions.RaiseEventIntents.Add(intent);
        }
        public void RaiseEvent <TParameters>(IProxy proxy, EventInfo @event, ref TParameters parameters)
            where TParameters : IValueContainer
        {
            var serviceProxyContext = (ServiceProxyContext)proxy.Context;

            var intent = new RaiseEventIntent
            {
                Id         = _idGenerator.NewId(),
                Service    = serviceProxyContext.Descriptor.Id,
                Event      = _eventIdProvider.GetId(@event),
                Parameters = parameters
            };

            bool invokedByRunningMethod = _transitionScope.IsActive &&
                                          IsCalledByRoutine(
                _transitionScope.CurrentMonitor.Context,
                // Skip 2 stack frames: current method and dynamically-generated proxy.
                // WARNING! DO NOT PUT 'new StackFrame()' into a helper method!
                new StackFrame(skipFrames: 2, fNeedFileInfo: false));

            bool ignoreTransaction = !invokedByRunningMethod;

            if (!ignoreTransaction && _transitionScope.IsActive)
            {
                var runningMethodSettings = _communicationSettingsProvider.GetMethodSettings(
                    _transitionScope.CurrentMonitor.Context.MethodRef.Definition);

                if (!runningMethodSettings.Transactional)
                {
                    ignoreTransaction = true;
                }
            }

            if (!ignoreTransaction)
            {
                var eventDefinition = serviceProxyContext.Definition.FindEvent(@event);
                var eventSettings   = _communicationSettingsProvider.GetEventSettings(eventDefinition, external: false);
                if (eventSettings.IgnoreTransaction)
                {
                    ignoreTransaction = true;
                }
            }

            if (ignoreTransaction)
            {
                RaiseEventInBackground(intent);
            }
            else
            {
                _transitionScope.CurrentMonitor.RegisterIntent(intent);
            }
        }
Beispiel #5
0
        public async void RaiseEventInBackground(RaiseEventIntent intent)
        {
            var actions = new ScheduledActions
            {
                RaiseEventIntents = new List <RaiseEventIntent>
                {
                    intent
                }
            };

            var options = new TransitionCommitOptions();

            await _transitionCommitter.CommitAsync(actions, transitionCarrier : null, options : options, ct : default);
        }
Beispiel #6
0
        public async Task PublishEvent(RaiseEventIntent intent)
        {
            var eventDesc = new EventDescriptor {
                ServiceId = intent.ServiceId, EventId = intent.EventId
            };

            if (_eventListeners.TryGetValue(eventDesc, out var subscribers))
            {
                foreach (var subscriber in subscribers)
                {
                    PublishEventInBackground(intent, subscriber);
                }
            }
        }
        public Task PublishEventAsync(RaiseEventIntent intent, CancellationToken ct)
        {
            var message = new Message
            {
                IsEvent             = true,
                [nameof(ServiceId)] = _serializer.SerializeToString(intent.ServiceId),
                [nameof(EventId)]   = _serializer.SerializeToString(intent.EventId),
                ["Parameters"]      = _serializer.SerializeToString(intent.Parameters)
            };

            InMemoryDataStore.BroadcastMessage(message);

            return(Task.FromResult(0));
        }
Beispiel #8
0
        public async Task PublishAsync(RaiseEventIntent intent)
        {
            var eventData = new EventPublishData
            {
                IntentId   = intent.Id,
                Service    = intent.Service,
                Event      = intent.Event,
                Parameters = intent.Parameters
            };

            if (_transitionScope.IsActive)
            {
                var context = (ITransitionContext)_transitionScope.CurrentMonitor.Context;
                eventData.FlowContext = context.FlowContext;
                eventData.Caller      = context.CurrentAsCaller();
            }

            var publisher = _eventPublisherProvider.GetPublisher(intent.Service, intent.Event);
            await publisher.PublishAsync(eventData, default);
        }
Beispiel #9
0
        public void RaiseEvent <TParameters>(IProxy proxy, EventInfo @event, ref TParameters parameters)
            where TParameters : IValueContainer
        {
            var serviceProxyContext = (ServiceProxyContext)proxy.Context;

            var intent = new RaiseEventIntent
            {
                Id         = _numericIdGenerator.NewId(),
                ServiceId  = serviceProxyContext.Service.Id,
                EventId    = _eventIdProvider.GetId(@event),
                Parameters = parameters
            };

            if (_transitionScope.IsActive)
            {
                _transitionScope.CurrentMonitor.RegisterIntent(intent);
            }
            else
            {
                RaiseEventInBackground(intent);
            }
        }
Beispiel #10
0
        public Task PublishEventAsync(RaiseEventIntent intent, CancellationToken ct)
        {
            var eventData = new RoutineEventData
            {
                ServiceId  = intent.ServiceId,
                EventId    = intent.EventId,
                Parameters = _serializer.SerializeToString(intent.Parameters)
            };

            var eventEnvelope = new RoutineEventEnvelope
            {
                CloudEventsVersion = CloudEventsEnvelope.Version,
                EventType          = DasyncCloudEventsTypes.RaiseEvent.Name,
                EventTypeVersion   = DasyncCloudEventsTypes.RaiseEvent.Version,
                Source             = "/" + (intent.ServiceId.ServiceName ?? ""),
                EventID            = intent.Id.ToString(),
                EventTime          = DateTimeOffset.Now,
                ContentType        = "application/json",
                Data = CloudEventsSerialization.Serialize(eventData)
            };

            var content = CloudEventsSerialization.Serialize(eventEnvelope);

            foreach (var eventsDirectory in ReadEventObservers())
            {
                var fileName = intent.Id.ToString() + ".json";
                var filePath = Path.Combine(eventsDirectory, fileName);
                try
                {
                    File.WriteAllText(filePath, content, Encoding.UTF8);
                }
                catch (IOException)
                {
                }
            }

            return(Task.FromResult(0));
        }
Beispiel #11
0
        private async void PublishEventInBackground(
            RaiseEventIntent intent,
            ServiceId subscriber)
        {
            while (true)
            {
                var subscriberServiceDefinition = GetOrFakeServiceDefinition(subscriber);
                var client = _platformHttpClientProvider.GetClient(subscriberServiceDefinition);

                try
                {
                    await client.PublishEvent(intent, subscriberServiceDefinition, _transitionUserContext.Current);

                    return;
                }
                catch
                {
                    await Task.Delay(TimeSpan.FromSeconds(5));

                    continue;
                }
            }
        }
        public async Task PublishEvent(RaiseEventIntent intent, IServiceDefinition subscriberServiceDefinition, NameValueCollection context)
        {
            var uri = string.Concat(_serviceHttpConfigurator.GetUrl(subscriberServiceDefinition), "?react&event=", intent.EventId.EventName, "&service=", intent.ServiceId.ServiceName);

            var json = _dasyncJsonSerializer.SerializeToString(intent);

            var content = new StringContent(json);

            content.Headers.ContentType = new MediaTypeHeaderValue("application/dasync+json");

            if (context?.Count > 0)
            {
                content.Headers.TryAddWithoutValidation(DasyncHttpHeaders.Context, context.Serialize());
            }

            var response = await _httpClient.PutAsync(uri, content);

            var statusCode = (int)response.StatusCode;

            if (statusCode != DasyncHttpCodes.Succeeded && statusCode != DasyncHttpCodes.Scheduled)
            {
                throw new InvalidOperationException($"Unexpected HTTP {statusCode} response:\r\n{await response.Content.ReadAsStringAsync()}");
            }
        }
Beispiel #13
0
 public Task PublishEventAsync(RaiseEventIntent intent, CancellationToken ct)
 {
     throw new NotImplementedException();
 }
 public async void RaiseEventInBackground(RaiseEventIntent intent)
 {
     // TODO: exception handling
     await _singleEventPublisher.PublishAsync(intent);
 }