3

私は、私のアプリでシングルトンとしてカフカプロデューサーを注入しようとしています。インスタンスを破棄するには、現在2つのステップが必要です。まず、バッファをフラッシュし、2回目にdisposeを呼び出す必要があります。パフォーマンスを向上させるには、メッセージが処理されなくなったときにのみこれを行う必要があります。asp.netコア依存性注入設定

私の解決策は、ASP.NETコアで、AddSingleton()メソッドをDIで使用し、ApplicationLifetime.ApplicationStopping.Registerを使用してプロデューサをフラッシュして破棄するコールバックを登録することです。 https://andrewlock.net/four-ways-to-dispose-idisposables-in-asp-net-core/

は一緒に私は私のスタートアップクラスに以下のなかった簡単なテストパット:私はここで見つけるチュートリアル続い

public void ConfigureServices(IServiceCollection services) 
{   
    var producerConfig = new Dictionary<string, object> 
    { 
     { "bootstrap.servers", "192.168.99.100:9092" }, 
     { "client.id", Dns.GetHostName() }, 
        { "api.version.request", true } 
    }; 
    services.AddSingleton(new Producer<Null, string>(producerConfig, null, new StringSerializer(Encoding.UTF8))); 
    services.AddMvc(); 
} 


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime) 
{ 
    loggerFactory.AddConsole(); 
    app.UseMvc(); 
    app.UseWebSockets();    
    if (env.IsDevelopment()) 
    { 
     app.UseDeveloperExceptionPage(); 

    } 
    lifetime.ApplicationStopping.Register(flushAndDispose, app.ApplicationServices.GetRequiredService<Producer>()); 
} 

をそれは私が次のエラーを取得する実行したとき:

An exception of type 'System.InvalidOperationException' occurred in Microsoft.Extensions.DependencyInjection.Abstractions.dll but was not handled in user code: 'No service for type 'Confluent.Kafka.Producer' has been registered.'

答えて

1

また、Producer<T1,T2>は、Producer

から派生したものであり、明示的にを登録していないという前提もあります。にサービスコレクションが含まれているため、プロバイダは解決方法を認識していません。

services.AddSingleton<Producer>(
    c => new Producer<Null, string>(producerConfig, null, 
     new StringSerializer(Encoding.UTF8)));