Esempio n. 1
0
 public static Props Props <TMessage>(
     TopicConfig topicConfig,
     string topicId,
     Func <string, Offset, Source <KeyValuePair <TMessage, Offset>, NotUsed> > eventStreamFactory,
     ISerializer serializer,
     IMessagePropertyExtractor extractor,
     IOffsetStore offsetStore
     ) where TMessage : class
 {
     return(Akka.Actor.Props.Create(() =>
                                    new TaggedOffsetProducerActor <TMessage>(
                                        topicConfig,
                                        topicId,
                                        eventStreamFactory,
                                        serializer,
                                        extractor,
                                        offsetStore
                                        )
                                    ));
 }
Esempio n. 2
0
        public void Init(ActorSystem sys, string topicId, ISerializer serializer, IMessagePropertyExtractor extractor)
        {
            var config = sys.Settings.Config;

            foreach (var tag in Tags)
            {
                Producer.StartTaggedOffsetProducer <TEvent>(
                    sys,
                    Tags,
                    new TopicConfig(config),
                    topicId,
                    (string entityId, Offset o) => ReadSideStream.Invoke(tag, o),
                    serializer,
                    extractor,
                    new SqlServerOffsetStore(
                        new SqlServerProvider(config).GetconnectionProvider(),
                        new OffsetStoreConfiguration(sys.Settings.Config)
                        )
                    );
            }
        }
Esempio n. 3
0
    /// <summary>
    /// Start a Tagged Offset Producer over a cluster distribution
    /// </summary>
    /// <param name="system"></param>
    /// <param name="tags"></param>
    /// <param name="topicConfig"></param>
    /// <param name="topicId"></param>
    /// <param name="Func<string"></param>
    /// <param name="eventStreamFactory"></param>
    /// <param name="offsetStore"></param>
    /// <typeparam name="TMessage"></typeparam>
    public static void StartTaggedOffsetProducer <TMessage>(
        ActorSystem system,
        ImmutableArray <AggregateEventTag> tags,
        TopicConfig topicConfig,
        string topicId,
        Func <string, Offset, Source <KeyValuePair <TMessage, Offset>, NotUsed> > eventStreamFactory,
        ISerializer serializer,
        IMessagePropertyExtractor extractor,
        IOffsetStore offsetStore
        ) where TMessage : class
    {
        var producerConfig = new ProducerConfig(system.Settings.Config);
        var publisherProps = TaggedOffsetProducerActor.Props <TMessage>(
            topicConfig, topicId, eventStreamFactory, serializer, extractor, offsetStore
            );

        var backoffPublisherProps = BackoffSupervisor.PropsWithSupervisorStrategy(
            publisherProps,
            "producer",
            producerConfig.MinBackoff,
            producerConfig.MaxBackoff,
            producerConfig.RandomBackoffFactor,
            SupervisorStrategy.StoppingStrategy
            );

        var clusterShardingSettings = ClusterShardingSettings
                                      .Create(system)
                                      .WithRole(producerConfig.Role);

        new ClusterDistribution(system)
        .Start(
            $"serviceBusProducer-{topicId}",
            backoffPublisherProps,
            tags.Select(x => x.Tag).ToArray(),
            new ClusterDistributionSettings(system, clusterShardingSettings)
            );
    }
Esempio n. 4
0
        private static void RegisterTopic(object t, Service s, ISerializer serializer, IMessagePropertyExtractor extractor, ActorSystem sys)
        {
            var topicCall = (ITopicCall)t;

            if (!(topicCall.TopicHolder is MethodTopicHolder))
            {
                throw new NotImplementedException();
            }

            var producer = ((MethodTopicHolder)topicCall.TopicHolder).Method.Invoke(s, null);

            typeof(ITaggedOffsetTopicProducer <>)
            .MakeGenericType(producer.GetType().GetGenericArguments()[0])
            .GetMethod("Init")
            .Invoke(producer, new object[] { sys, topicCall.TopicId.Name, serializer, extractor });
        }