1+ using Microsoft . Extensions . Logging ;
2+ using Ydb . Sdk ;
3+ using Ydb . Sdk . Services . Topic ;
4+ using Ydb . Sdk . Services . Topic . Reader ;
5+ using Ydb . Sdk . Services . Topic . Writer ;
6+
7+ const int countMessages = 100 ;
8+ const string topicName = "topic_name" ;
9+
10+ var loggerFactory = LoggerFactory . Create ( builder => builder . AddConsole ( ) . SetMinimumLevel ( LogLevel . Information ) ) ;
11+
12+ var logger = loggerFactory . CreateLogger < Program > ( ) ;
13+
14+ var config = new DriverConfig (
15+ endpoint : "grpc://localhost:2136" ,
16+ database : "/local"
17+ ) ;
18+
19+ await using var driver = await Driver . CreateInitialized (
20+ config : config ,
21+ loggerFactory : loggerFactory
22+ ) ;
23+
24+ var topicClient = new TopicClient ( driver ) ;
25+
26+ await topicClient . CreateTopic ( new CreateTopicSettings
27+ {
28+ Path = topicName ,
29+ Consumers = { new Consumer ( "Consumer_Example" ) }
30+ } ) ;
31+
32+ var readerCts = new CancellationTokenSource ( ) ;
33+
34+ var writerJob = Task . Run ( async ( ) =>
35+ {
36+ // ReSharper disable once AccessToDisposedClosure
37+ await using var writer = new WriterBuilder < string > ( driver , topicName )
38+ {
39+ ProducerId = "ProducerId_Example"
40+ } . Build ( ) ;
41+
42+ for ( var i = 0 ; i < countMessages ; i ++ )
43+ {
44+ await writer . WriteAsync ( $ "Message num { i } : Hello Example YDB Topics!") ;
45+ }
46+
47+ readerCts . CancelAfter ( TimeSpan . FromSeconds ( 3 ) ) ;
48+ } ) ;
49+
50+ var readerJob = Task . Run ( async ( ) =>
51+ {
52+ // ReSharper disable once AccessToDisposedClosure
53+ await using var reader = new ReaderBuilder < string > ( driver )
54+ {
55+ ConsumerName = "Consumer_Example" ,
56+ SubscribeSettings = { new SubscribeSettings ( topicName ) }
57+ } . Build ( ) ;
58+
59+ try
60+ {
61+ while ( ! readerCts . IsCancellationRequested )
62+ {
63+ var message = await reader . ReadAsync ( readerCts . Token ) ;
64+
65+ logger . LogInformation ( "Received message: [{MessageData}]" , message . Data ) ;
66+
67+ try
68+ {
69+ await message . CommitAsync ( ) ;
70+ }
71+ catch ( Exception e )
72+ {
73+ logger . LogError ( e , "Failed commit message" ) ;
74+ }
75+ }
76+ }
77+ catch ( OperationCanceledException )
78+ {
79+ }
80+ } ) ;
81+
82+ await writerJob ;
83+ await readerJob ;
84+ await topicClient . DropTopic ( new DropTopicSettings { Path = topicName } ) ;
0 commit comments