public IMessageInputter<MessagePayload> BuildChannel(SubscriberSendChannelSchema schema)
        {
            SendMessageCache cache = CreateCache(schema);
            MessageProcessor startPoint = CreateStartPoint();

            RegisterCacheWithAcknowledgementHandler(cache);
            BuildPipeline(schema, startPoint, cache);
            NotifySubscriberSendChannelBuilt(schema);

            return startPoint;
        }
 void BuildPipeline(SubscriberSendChannelSchema schema, MessageProcessor startPoint, SendMessageCache cache)
 {
     MessagePipelineBuilder.Build()
         .With(startPoint)
         .ToProcessor(new MessageSendTimeRemover())
         .ToProcessor(new MessageAddresser(schema.FromAddress, schema.SubscriberAddress))
         .ToProcessor(new SendChannelMessageCacher(cache))
         .ToMessageRepeater(cache, systemTime, taskRepeater, schema.RepeatStrategy)
         .ToProcessor(new SendChannelMessageCacheUpdater(cache))
         .ToProcessor(new SequenceOriginRecorder(cache))
         .ToProcessor(new PersistenceSourceRecorder())
         .Queue()
         .ToProcessor(new LoadBalancer(cache, taskScheduler))
         .ToProcessor(new LastSentRecorder(systemTime))
         .ToProcessor(authenticationSessionAttacherFactory.Create(schema.SubscriberAddress))
         .ToEndPoint(messageSender);
 }
 SendMessageCache CreateCache(SubscriberSendChannelSchema schema)
 {
     return messageCacheFactory.BuildSendCache(PersistenceUseType.SubscriberSend, schema.SubscriberAddress, schema);
 }
 static void NotifySubscriberSendChannelBuilt(SubscriberSendChannelSchema schema)
 {
     Messenger.Send(new SubscriberSendChannelBuilt
     {
         CacheAddress = schema.SubscriberAddress,
         SubscriberAddress = schema.SubscriberAddress,
         PublisherAddress = schema.FromAddress
     });
 }