/// <summary>
        ///  Construct a <see cref="IBatchEventProcessor{TEvent}"/> that will automatically track the progress by updating its sequence when the <see cref="IEventHandler{TEvent}.OnEvent(TEvent,long,bool)"/> method returns.
        /// </summary>
        /// <param name="exceptionHandler"></param>
        /// <param name="dataProvider">to which events are published.</param>
        /// <param name="sequenceBarrier">on which it is waiting.</param>
        /// <param name="eventHandler">is the delegate to which events are dispatched.</param>
        public BatchEventProcessor(
            IDataProvider <TEvent> dataProvider,
            ISequenceBarrier sequenceBarrier,
            IEventHandler <TEvent> eventHandler,
            IExceptionHandler <TEvent> exceptionHandler)
        {
            _exceptionHandler = exceptionHandler;
            _dataProvider     = dataProvider;
            _sequenceBarrier  = sequenceBarrier;
            _eventHandler     = eventHandler;
            _sequence         = new Sequence();

            if (eventHandler is ISequenceReportingEventHandler <TEvent> reporting)
            {
                reporting?.SetSequenceCallback(_sequence);
            }

            if (eventHandler is IBatchStartAware batchStartAware)
            {
                _batchStartAware = batchStartAware;
            }

            if (eventHandler is ITimeoutHandler timeoutHandler)
            {
                _timeoutHandler = timeoutHandler;
            }

            if (eventHandler is ILifecycleAware lifecycleAware)
            {
                _lifecycleAware = lifecycleAware;
            }
        }
Exemple #2
0
        /// <summary>
        /// Construct a <see cref="WorkProcessor{T}"/>.
        /// </summary>
        /// <param name="ringBuffer">to which events are published.</param>
        /// <param name="barrier">on which it is waiting.</param>
        /// <param name="workHandler">is the delegate to which events are dispatched.</param>
        /// <param name="exceptionHandler">to be called back when an error occurs.</param>
        /// <param name="workSequence">from which to claim the next event to be worked on. It should always be initialised <see cref="Sequence.InitialValue"/></param>
        public WorkProcessor(
            RingBuffer <T> ringBuffer,
            ISequenceBarrier barrier,
            IWorkHandler <T> workHandler,
            IExceptionHandler <T> exceptionHandler,
            ISequence workSequence)
        {
            _ringBuffer       = ringBuffer;
            _barrier          = barrier;
            _workHandler      = workHandler;
            _exceptionHandler = exceptionHandler;
            _workSequence     = workSequence;
            _sequence         = new Sequence();

            if (_workHandler is ITimeoutHandler timeoutHandler)
            {
                _timeoutHandler = timeoutHandler;
            }

            if (_workHandler is ILifecycleAware lifecycleAware)
            {
                _lifecycleAware = lifecycleAware;
            }

            if (_workHandler is IEventReleaseAware eventReleaseAware)
            {
                _eventReleaser = new EventReleaser(_sequence);
                eventReleaseAware.SetEventReleaser(_eventReleaser);
            }
        }
    public T Register <T> (T instance)
    {
        // Registration is ignored during reset
        if (_resetInProgress)
        {
            return(instance);
        }

        ILifecycleAware resettableInstance = instance as ILifecycleAware;

        // If instance does not implement ILifecycleAware, bail.
        if (resettableInstance == null)
        {
            return(instance);
        }

        RegisterInternal(resettableInstance);
        return(instance);
    }
Exemple #4
0
 public AccessorEventHandler(IEventHandler <E> handler)
 {
     this.handler = handler;
     lifecycle    = handler is ILifecycleAware ? (ILifecycleAware)handler : null;
 }
 public static string GetName(this ILifecycleAware caller)
 {
     return(caller.GetType().Name);
 }