選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

85 行
2.7 KiB

  1. using Confluent.Kafka;
  2. using JT808.DotNetty.Abstractions;
  3. using Microsoft.Extensions.Logging;
  4. using Microsoft.Extensions.Options;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. namespace JT808.DotNetty.Kafka
  11. {
  12. public class JT808MsgConsumer : IJT808MsgConsumer
  13. {
  14. public CancellationTokenSource Cts => new CancellationTokenSource();
  15. private readonly IConsumer<string, byte[]> consumer;
  16. private readonly ILogger logger;
  17. public string TopicName { get; }
  18. public JT808MsgConsumer(
  19. IOptions<JT808MsgConsumerConfig> consumerConfigAccessor,
  20. ILoggerFactory loggerFactory)
  21. {
  22. consumer = new ConsumerBuilder<string, byte[]>(consumerConfigAccessor.Value).Build();
  23. TopicName = consumerConfigAccessor.Value.TopicName;
  24. logger = loggerFactory.CreateLogger("JT808MsgConsumer");
  25. }
  26. public void OnMessage(Action<(string TerminalNo, byte[] Data)> callback)
  27. {
  28. Task.Run(() =>
  29. {
  30. while (!Cts.IsCancellationRequested)
  31. {
  32. try
  33. {
  34. //如果不指定分区,根据kafka的机制会从多个分区中拉取数据
  35. //如果指定分区,根据kafka的机制会从相应的分区中拉取数据
  36. var data = consumer.Consume(Cts.Token);
  37. if (logger.IsEnabled(LogLevel.Debug))
  38. {
  39. logger.LogDebug($"Topic: {data.Topic} Key: {data.Key} Partition: {data.Partition} Offset: {data.Offset} TopicPartitionOffset:{data.TopicPartitionOffset}");
  40. }
  41. callback((data.Key, data.Value));
  42. }
  43. catch (ConsumeException ex)
  44. {
  45. logger.LogError(ex, TopicName);
  46. Thread.Sleep(1000);
  47. }
  48. catch (OperationCanceledException ex)
  49. {
  50. logger.LogError(ex, TopicName);
  51. Thread.Sleep(1000);
  52. }
  53. catch (Exception ex)
  54. {
  55. logger.LogError(ex, TopicName);
  56. Thread.Sleep(1000);
  57. }
  58. }
  59. }, Cts.Token);
  60. }
  61. public void Subscribe()
  62. {
  63. consumer.Subscribe(TopicName);
  64. }
  65. public void Unsubscribe()
  66. {
  67. consumer.Unsubscribe();
  68. }
  69. public void Dispose()
  70. {
  71. consumer.Close();
  72. consumer.Dispose();
  73. }
  74. }
  75. }