static async Task RunAsync() { int process = System.Diagnostics.Process.GetCurrentProcess().Id; Console.WriteLine($"サブスクライバーをプロセス {process} で起動しました。"); // コンソールからパラメーターを受け取る Console.WriteLine("bootstrap servers を入力してください(省略時 127.0.0.1):"); var bootstrapServers = Console.ReadLine(); if (string.IsNullOrEmpty(bootstrapServers)) { bootstrapServers = "127.0.0.1"; } Console.WriteLine($"コンシューマーグループIDを入力してください(省略時 {Constants.DefaultComsumerGroupID}):"); var groupID = Console.ReadLine(); if (string.IsNullOrEmpty(groupID)) { groupID = Constants.DefaultComsumerGroupID; } Console.WriteLine($"トピックを入力してください(省略時 {Constants.DefaultTopic}):"); var topic = Console.ReadLine(); if (string.IsNullOrEmpty(topic)) { topic = Constants.DefaultTopic; } // キャンセルトークンを生成する using var cancelTokenSource = new CancellationTokenSource(); Console.CancelKeyPress += (_, e) => { e.Cancel = true; cancelTokenSource.Cancel(); }; // 動作設定を生成する var subscriberSetting = new MessageSubscriberSetting() { BootstrapServers = bootstrapServers, ConsumerGroupID = groupID }; // observable パターンでメッセージを監視する var factory = new SampleMessageSubscriberFactory(subscriberSetting, new SampleLogger()); Console.WriteLine($"メッセージの受信処理を開始します。終了するには Ctrl+C を押してください。"); var subscriber = factory.CreateSubscriber <SampleMessageKey, SampleMessageBody>(topic); using var releaser = subscriber.Subscribe(new SampleMessageObserver()); await subscriber.SubscribeAsync(cancelTokenSource.Token).ConfigureAwait(false); Console.WriteLine("メッセージの受信処理を終了しました。"); }
/// <summary> /// インスタンスを生成します。 /// </summary> /// <param name="keyDeserializer">キーに対するデシリアライザ</param> /// <param name="messageDeserializer">メッセージに対するデシリアライザ</param> /// <param name="subscriberSetting">動作設定</param> /// <param name="topic">トピック</param> /// <param name="logger">ロガー</param> public MessageSubscriber(IDeserializer <TKey> keyDeserializer, IDeserializer <TMessage> messageDeserializer, MessageSubscriberSetting subscriberSetting, string topic, ILogger logger) : base() { KeyDeserializer = keyDeserializer; MessageDeserializer = messageDeserializer; SubscriberSetting = subscriberSetting; Topic = topic; Logger = logger ?? Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance; }
/// <summary> /// コンシューマーの動作設定を取得します。 /// </summary> /// <param name="consumerSetting">コンシューマーの動作設定</param> /// <returns>動作設定のキーと値の組み合わせ</returns> protected IEnumerable <KeyValuePair <string, string> > GetConsumerConfig(MessageSubscriberSetting consumerSetting) { if (consumerSetting.BootstrapServers == null || consumerSetting.BootstrapServers == "") { throw new NullReferenceException("ブートストラップサーバーが設定されていません。"); } if (consumerSetting.ConsumerGroupID == null || consumerSetting.ConsumerGroupID == "") { throw new NullReferenceException("コンシューマーグループIDが設定されていません。"); } return(new ConsumerConfig() { BootstrapServers = consumerSetting.BootstrapServers, GroupId = consumerSetting.ConsumerGroupID, EnableAutoCommit = false, AutoOffsetReset = AutoOffsetReset.Earliest }); }
/// <summary> /// インスタンスを生成します。 /// </summary> /// <param name="subscriberSetting">サブスクライバーの動作設定</param> /// <param name="logger">ロガー</param> protected MessageSubscriberFactoryBase(MessageSubscriberSetting subscriberSetting, ILogger logger) { SubscriberSetting = subscriberSetting; Logger = logger; }
/// <summary> /// インスタンスを生成します。 /// </summary> /// <param name="subscriberSetting">サブスクライバーの動作設定</param> /// <param name="logger">ロガー</param> internal SampleMessageSubscriberFactory(MessageSubscriberSetting subscriberSetting, ILogger logger) : base(subscriberSetting, logger) { }