新建一个cmd窗口,zkServer命令启动zookeeper

打开另一个cmd窗口,输入:

  1. cd D:\Worksoftware\Apachekafka2.11\bin\windows
  2. kafka-server-start D:\Worksoftware\Apachekafka2.11\config\server.properties
  1. 删除主题:E:\WorkSoftWare\kafka2.11\bin\windows>kafka-run-class.bat kafka.admin.TopicCommand --delete --topic TestSiso --zookeeper localhost:2181

kafka 删除topic 提示marked for deletion

并没有真正删除,如果要真正删除

在每一台机器中的kafka_2.10/config/server.properties 文件加入 delete.topic.enable=true

最后所有机器重新启动kafka

启动kafka成功后,就可以运行项目了

引用了kafka-net.dll

Program.cs

  1. internal class Program
  2. {
  3. private static void Main(string[] args)
  4. {
  5. string header = "kafka测试";
  6. Console.Title = header;
  7. Console.WriteLine(header);
  8. ConsoleColor color = Console.ForegroundColor;
  9. var pub = new KafkaHelper("Test", true);
  10. var sub = new KafkaHelper("Test", false);
  11. Task.Run(() =>
  12. {
  13. while (true)
  14. {
  15. string msg = string.Format("{0}这是一条测试消息", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
  16. pub.Pub(new List<string> {msg});
  17. Console.ForegroundColor = ConsoleColor.Red;
  18. Console.WriteLine("发送消息:" + msg);
  19. //Console.ForegroundColor = color;
  20. Thread.Sleep(2000);
  21. }
  22. });
  23. Task.Run(() => sub.Sub(msg =>
  24. {
  25. Console.ForegroundColor = ConsoleColor.Green;
  26. Console.WriteLine("收到消息:{0}", msg);
  27. //Console.ForegroundColor = color;
  28. }));
  29. Console.ReadLine();
  30. }
  31. }

KafkaHelper.cs代码:


  1. /// <summary>
  2. /// kafka辅助类
  3. /// </summary>
  4. public sealed class KafkaHelper
  5. {
  6. private readonly KafkaConfig _config;
  7. private readonly ConsumerHelper _consumerHelper;
  8. private readonly bool _isProducer = true;
  9. private readonly ProduceHelper _produceHelper;
  10. private BrokerHelper _brokerHelper;
  11. /// <summary>
  12. /// kafka辅助类构造方法
  13. /// </summary>
  14. /// <param name="sectionName">config中配置节点名称</param>
  15. /// <param name="isProducer"></param>
  16. public KafkaHelper(string sectionName, bool isProducer = true)
  17. {
  18. _isProducer = isProducer;
  19. _config = KafkaConfig.GetConfig(sectionName);
  20. _brokerHelper = new BrokerHelper(_config.Broker);
  21. if (isProducer)
  22. _produceHelper = new ProduceHelper(_brokerHelper);
  23. else
  24. _consumerHelper = new ConsumerHelper(_brokerHelper);
  25. }
  26. /// <summary>
  27. /// 是否是生产者模式
  28. /// </summary>
  29. public bool IsProducer
  30. {
  31. get { return _isProducer; }
  32. }
  33. /// <summary>
  34. /// 发送消息到队列
  35. /// </summary>
  36. /// <param name="topic"></param>
  37. /// <param name="datas"></param>
  38. /// <param name="acks"></param>
  39. /// <param name="timeout"></param>
  40. public void Pub(List<string> datas, short acks = 1, TimeSpan? timeout = default(TimeSpan?))
  41. {
  42. _produceHelper.Pub(_config.Topic, datas, acks, timeout, MessageCodec.CodecNone);
  43. }
  44. /// <summary>
  45. /// 订阅消息
  46. /// </summary>
  47. /// <param name="onMsg"></param>
  48. public void Sub(Action<string> onMsg)
  49. {
  50. _consumerHelper.Sub(_config.Topic, onMsg);
  51. }
  52. /// <summary>
  53. /// 取消订阅
  54. /// </summary>
  55. public void UnSub()
  56. {
  57. _consumerHelper.UnSub();
  58. }
  59. }

KafkaConfig.cs代码:

  1. /// <summary>
  2. /// kafka配置类
  3. /// </summary>
  4. public class KafkaConfig : ConfigurationSection
  5. {
  6. /// <summary>
  7. /// 当前配置名称
  8. /// 此属性为必须
  9. /// </summary>
  10. public string SectionName { get; set; }
  11. /// <summary>
  12. /// 代理
  13. /// </summary>
  14. [ConfigurationProperty("broker", IsRequired = true)]
  15. public string Broker
  16. {
  17. get { return (string) base["broker"]; }
  18. set { base["broker"] = value; }
  19. }
  20. /// <summary>
  21. /// 主题
  22. /// </summary>
  23. [ConfigurationProperty("topic", IsRequired = true)]
  24. public string Topic
  25. {
  26. get { return (string) base["topic"]; }
  27. set { base["topic"] = value; }
  28. }
  29. #region 从配置文件中创建kafka配置类
  30. /// <summary>
  31. /// 获取默认kafka配置类
  32. /// </summary>
  33. /// <returns></returns>
  34. public static KafkaConfig GetConfig()
  35. {
  36. return (KafkaConfig) ConfigurationManager.GetSection("kafkaConfig");
  37. }
  38. /// <summary>
  39. /// 获取指定的kafka配置类
  40. /// </summary>
  41. /// <param name="sectionName"></param>
  42. /// <returns></returns>
  43. public static KafkaConfig GetConfig(string sectionName)
  44. {
  45. var section = (KafkaConfig) ConfigurationManager.GetSection(sectionName);
  46. // 跟默认配置相同的,可以省略
  47. if (section == null)
  48. section = GetConfig();
  49. if (section == null)
  50. throw new ConfigurationErrorsException("kafkacofng节点 " + sectionName + " 未配置.");
  51. section.SectionName = sectionName;
  52. return section;
  53. }
  54. /// <summary>
  55. /// 从指定位置读取配置
  56. /// </summary>
  57. /// <param name="fileName"></param>
  58. /// <param name="sectionName"></param>
  59. /// <returns></returns>
  60. public static KafkaConfig GetConfig(string fileName, string sectionName)
  61. {
  62. return GetConfig(ConfigurationManager.OpenMappedMachineConfiguration(new ConfigurationFileMap(fileName)),
  63. sectionName);
  64. }
  65. /// <summary>
  66. /// 从指定Configuration中读取配置
  67. /// </summary>
  68. /// <param name="config"></param>
  69. /// <param name="sectionName"></param>
  70. /// <returns></returns>
  71. public static KafkaConfig GetConfig(Configuration config, string sectionName)
  72. {
  73. if (config == null)
  74. throw new ConfigurationErrorsException("传入的配置不能为空");
  75. var section = (KafkaConfig) config.GetSection(sectionName);
  76. if (section == null)
  77. throw new ConfigurationErrorsException("kafkacofng节点 " + sectionName + " 未配置.");
  78. section.SectionName = sectionName;
  79. return section;
  80. }
  81. #endregion
  82. }

BrokerHelper.cs代码:

  1. /// <summary>
  2. /// 代理人辅助类
  3. /// </summary>
  4. internal class BrokerHelper
  5. {
  6. private readonly string _broker;
  7. public BrokerHelper(string broker)
  8. {
  9. _broker = broker;
  10. }
  11. /// <summary>
  12. /// 获取代理的路由对象
  13. /// </summary>
  14. /// <returns></returns>
  15. public BrokerRouter GetBroker()
  16. {
  17. var options = new KafkaOptions(new Uri(string.Format("http://{0}", _broker)));
  18. return new BrokerRouter(options);
  19. }
  20. }

ConsumerHelper.cs代码:

  1. /// <summary>
  2. /// 消费者辅助类
  3. /// </summary>
  4. internal class ConsumerHelper
  5. {
  6. private readonly BrokerHelper _brokerHelper;
  7. private Consumer _consumer;
  8. private bool _unSub;
  9. public ConsumerHelper(BrokerHelper brokerHelper)
  10. {
  11. _brokerHelper = brokerHelper;
  12. }
  13. public void Sub(string topic, Action<string> onMsg)
  14. {
  15. _unSub = false;
  16. var opiton = new ConsumerOptions(topic, _brokerHelper.GetBroker());
  17. _consumer = new Consumer(opiton);
  18. Task.Run(() =>
  19. {
  20. while (!_unSub)
  21. {
  22. IEnumerable<Message> msgs = _consumer.Consume();
  23. Parallel.ForEach(msgs, msg => onMsg(Encoding.UTF8.GetString(msg.Value)));
  24. }
  25. });
  26. }
  27. public void UnSub()
  28. {
  29. _unSub = true;
  30. }
  31. }

ProduceHelper.cs代码:

  1. /// <summary>
  2. /// 生产者辅助类
  3. /// </summary>
  4. internal class ProduceHelper : IDisposable
  5. {
  6. private readonly Producer _producer;
  7. private BrokerHelper _brokerHelper;
  8. public ProduceHelper(BrokerHelper brokerHelper)
  9. {
  10. _brokerHelper = brokerHelper;
  11. _producer = new Producer(_brokerHelper.GetBroker());
  12. }
  13. public void Dispose()
  14. {
  15. if (_producer != null)
  16. _producer.Dispose();
  17. }
  18. /// <summary>
  19. /// 发送消息到队列
  20. /// </summary>
  21. /// <param name="topic"></param>
  22. /// <param name="datas"></param>
  23. /// <param name="acks"></param>
  24. /// <param name="timeout"></param>
  25. /// <param name="codec"></param>
  26. public void Pub(string topic, List<string> datas, short acks = 1, TimeSpan? timeout = default(TimeSpan?), MessageCodec codec = MessageCodec.CodecNone)
  27. {
  28. //var msgs = new List<Message>();
  29. //foreach (string item in datas)
  30. //{
  31. // msgs.Add(new Message(item));
  32. //}
  33. var msgs = datas.Select(item => new Message(item)).ToList();
  34. _producer.SendMessageAsync(topic, msgs, acks, timeout, codec);
  35. }
  36. }

App.config

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <configSections>
  4. <section name="Test" type="xxxxx.sssss.KafkaConfig, xxxxx.sssss" />
  5. </configSections>
  6. <Test broker="127.0.0.1:9092" topic="TestSiso" />
  7. <startup>
  8. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  9. </startup>
  10. </configuration>

运行结果如图:

Kafka.net使用编程入门(四)的更多相关文章

  1. 脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)

    本文原作者阮一峰,作者博客:ruanyifeng.com. 1.前言 新一代HTTP/2 协议的主要目的是为了提高网页性能(有关HTTP/2的介绍,请见<从HTTP/0.9到HTTP/2:一文读 ...

  2. Kafka.net使用编程入门(三)

    这个世界既不是有钱人的世界,也不是有权人的世界,它是有心人的世界. 一些有用的命令 1.列出主题:kafka-topics.bat --list --zookeeper localhost:2181 ...

  3. Kafka.net使用编程入门(一)

    最近研究分布式消息队列,分享下! 首先zookeeper  和 kafka 压缩包 解压 并配置好! 我本机zookeeper环境配置如下: D:\Worksoftware\ApacheZookeep ...

  4. Kafka.net使用编程入门

    最近研究分布式消息队列,分享下! 首先zookeeper  和 kafka 压缩包 解压 并配置好! 我本机zookeeper环境配置如下: D:\Worksoftware\ApacheZookeep ...

  5. Kafka.net使用编程入门(二)

    1.首先创建一个Topic,命令如下: kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partit ...

  6. cesium编程入门(四)界面介绍及小控件隐藏

    感性认识 界面介绍,viewer Geocoder : 查找位置工具,查找到之后会将镜头对准找到的地址,默认使用bing地图 Home Button :视角返回初始位置. Scene Mode Pic ...

  7. [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手   http://www.52im.net/thread-1729-1-1.html     1.引言 网络编程中TCP协议的三次握手和 ...

  8. 脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?

    本文引用了“帅地”发表于公众号苦逼的码农的技术分享. 1.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢 ...

  9. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言   老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...

随机推荐

  1. HDU 3948 不同回文子串个数

    集训队论文中有求不同子串个数的做法,就是扫一遍height数组,过程中根据height数组进行去重.对于本题也是雷同的,只是每一次不是根据与排名在上一位的LCP去重,而是与上一次统计对答案有贡献的后缀 ...

  2. CSS vertical-align属性

    之前也经常用到vertical-align进行垂直居中对齐,突然发现其中的一些属性值根本就没使用过,也不清楚效果,将今天的研究成果记录下. vertical-align 属性 下表是w3c上列举的属性 ...

  3. app性能测试【通过loadrunner录制】

    随着智能手机近年来的快速增长,从游戏娱乐到移动办公的各式各样的手机APP软件渗透到我们的生活中,对于大型的手机APP测试不仅要关注它的功能性.易用性还要关注它的性能,最近发现LoadRunner12可 ...

  4. 关于WordPress搬家方法步骤的整理

    最近准备更换自己的博客服务器,所以需要将原来服务器上的所有东西都搬到新的服务器.为了数据的安全,在网上找了很多的资料.现在整理一下整个搬家过程的操作步骤.下面进入正题: 1.测试环境这次我使用的示例服 ...

  5. POJ1019-Number Sequence数学

    题目链接:http://poj.org/problem?id=1019 题目大意: 题目的意思很清楚了,就是把数字的每一位都当成是单个的字母来对待,然后求第i位的数是哪一个.(1<=i<= ...

  6. .NET面试题系列[16] - 多线程概念(1)

    .NET面试题系列目录 这篇文章主要是各个百科中的一些摘抄,简述了进程和线程的来源,为什么出现了进程和线程. 操作系统层面中进程和线程的实现 操作系统发展史 直到20世纪50年代中期,还没出现操作系统 ...

  7. JSP页面的静态包含和动态包含

    JSP中有两种包含:静态包含:<%@include file="被包含页面"%>和动态包含:<jsp:include page="被包含页面" ...

  8. Linux设备中的并发控制

    一.自旋锁1.定义自旋锁:spinlock_t lock2.初始化自旋锁:spin_lock_init(lock)3.获得自旋锁:spin_lock(lock)4.释放自旋锁:spin_unlock( ...

  9. 互联网金融P2P主业务场景自动化测试

            互联网金融P2P行业,近三年来发展迅速,如火如荼.         据不完全统计,全国有3000+的企业.  “互联网+”企业,几乎每天都会碰到一些奇奇怪怪的bug,作为在互联网企业工 ...

  10. Android onclick监听事件打开新界面

    一.新建工程 二.新建XML代码 新建一个Button <Button android:layout_width="wrap_content" android:layout_ ...