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

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

cd D:\Worksoftware\Apachekafka2.11\bin\windows

kafka-server-start  D:\Worksoftware\Apachekafka2.11\config\server.properties
删除主题: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

 internal class Program
{
private static void Main(string[] args)
{
string header = "kafka测试"; Console.Title = header;
Console.WriteLine(header);
ConsoleColor color = Console.ForegroundColor; var pub = new KafkaHelper("Test", true); var sub = new KafkaHelper("Test", false); Task.Run(() =>
{
while (true)
{
string msg = string.Format("{0}这是一条测试消息", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
pub.Pub(new List<string> {msg}); Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("发送消息:" + msg);
//Console.ForegroundColor = color;
Thread.Sleep(2000);
}
}); Task.Run(() => sub.Sub(msg =>
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("收到消息:{0}", msg);
//Console.ForegroundColor = color;
})); Console.ReadLine();
}
}

KafkaHelper.cs代码:


/// <summary>
/// kafka辅助类
/// </summary>
public sealed class KafkaHelper
{
private readonly KafkaConfig _config; private readonly ConsumerHelper _consumerHelper;
private readonly bool _isProducer = true;
private readonly ProduceHelper _produceHelper;
private BrokerHelper _brokerHelper; /// <summary>
/// kafka辅助类构造方法
/// </summary>
/// <param name="sectionName">config中配置节点名称</param>
/// <param name="isProducer"></param>
public KafkaHelper(string sectionName, bool isProducer = true)
{
_isProducer = isProducer;
_config = KafkaConfig.GetConfig(sectionName);
_brokerHelper = new BrokerHelper(_config.Broker);
if (isProducer)
_produceHelper = new ProduceHelper(_brokerHelper);
else
_consumerHelper = new ConsumerHelper(_brokerHelper);
} /// <summary>
/// 是否是生产者模式
/// </summary>
public bool IsProducer
{
get { return _isProducer; }
} /// <summary>
/// 发送消息到队列
/// </summary>
/// <param name="topic"></param>
/// <param name="datas"></param>
/// <param name="acks"></param>
/// <param name="timeout"></param>
public void Pub(List<string> datas, short acks = 1, TimeSpan? timeout = default(TimeSpan?))
{
_produceHelper.Pub(_config.Topic, datas, acks, timeout, MessageCodec.CodecNone);
} /// <summary>
/// 订阅消息
/// </summary>
/// <param name="onMsg"></param>
public void Sub(Action<string> onMsg)
{
_consumerHelper.Sub(_config.Topic, onMsg);
} /// <summary>
/// 取消订阅
/// </summary>
public void UnSub()
{
_consumerHelper.UnSub();
}
}

KafkaConfig.cs代码:

 /// <summary>
/// kafka配置类
/// </summary>
public class KafkaConfig : ConfigurationSection
{
/// <summary>
/// 当前配置名称
/// 此属性为必须
/// </summary>
public string SectionName { get; set; } /// <summary>
/// 代理
/// </summary>
[ConfigurationProperty("broker", IsRequired = true)]
public string Broker
{
get { return (string) base["broker"]; }
set { base["broker"] = value; }
} /// <summary>
/// 主题
/// </summary>
[ConfigurationProperty("topic", IsRequired = true)]
public string Topic
{
get { return (string) base["topic"]; }
set { base["topic"] = value; }
} #region 从配置文件中创建kafka配置类 /// <summary>
/// 获取默认kafka配置类
/// </summary>
/// <returns></returns>
public static KafkaConfig GetConfig()
{
return (KafkaConfig) ConfigurationManager.GetSection("kafkaConfig");
} /// <summary>
/// 获取指定的kafka配置类
/// </summary>
/// <param name="sectionName"></param>
/// <returns></returns>
public static KafkaConfig GetConfig(string sectionName)
{
var section = (KafkaConfig) ConfigurationManager.GetSection(sectionName);
// 跟默认配置相同的,可以省略
if (section == null)
section = GetConfig();
if (section == null)
throw new ConfigurationErrorsException("kafkacofng节点 " + sectionName + " 未配置.");
section.SectionName = sectionName;
return section;
} /// <summary>
/// 从指定位置读取配置
/// </summary>
/// <param name="fileName"></param>
/// <param name="sectionName"></param>
/// <returns></returns>
public static KafkaConfig GetConfig(string fileName, string sectionName)
{
return GetConfig(ConfigurationManager.OpenMappedMachineConfiguration(new ConfigurationFileMap(fileName)),
sectionName);
} /// <summary>
/// 从指定Configuration中读取配置
/// </summary>
/// <param name="config"></param>
/// <param name="sectionName"></param>
/// <returns></returns>
public static KafkaConfig GetConfig(Configuration config, string sectionName)
{
if (config == null)
throw new ConfigurationErrorsException("传入的配置不能为空");
var section = (KafkaConfig) config.GetSection(sectionName);
if (section == null)
throw new ConfigurationErrorsException("kafkacofng节点 " + sectionName + " 未配置.");
section.SectionName = sectionName;
return section;
} #endregion
}

BrokerHelper.cs代码:

 /// <summary>
/// 代理人辅助类
/// </summary>
internal class BrokerHelper
{
private readonly string _broker; public BrokerHelper(string broker)
{
_broker = broker;
} /// <summary>
/// 获取代理的路由对象
/// </summary>
/// <returns></returns>
public BrokerRouter GetBroker()
{
var options = new KafkaOptions(new Uri(string.Format("http://{0}", _broker)));
return new BrokerRouter(options);
}
}

ConsumerHelper.cs代码:

 /// <summary>
/// 消费者辅助类
/// </summary>
internal class ConsumerHelper
{
private readonly BrokerHelper _brokerHelper; private Consumer _consumer; private bool _unSub; public ConsumerHelper(BrokerHelper brokerHelper)
{
_brokerHelper = brokerHelper;
} public void Sub(string topic, Action<string> onMsg)
{
_unSub = false; var opiton = new ConsumerOptions(topic, _brokerHelper.GetBroker()); _consumer = new Consumer(opiton); Task.Run(() =>
{
while (!_unSub)
{
IEnumerable<Message> msgs = _consumer.Consume();
Parallel.ForEach(msgs, msg => onMsg(Encoding.UTF8.GetString(msg.Value)));
}
});
} public void UnSub()
{
_unSub = true;
}
}

ProduceHelper.cs代码:

/// <summary>
/// 生产者辅助类
/// </summary>
internal class ProduceHelper : IDisposable
{
private readonly Producer _producer;
private BrokerHelper _brokerHelper; public ProduceHelper(BrokerHelper brokerHelper)
{
_brokerHelper = brokerHelper; _producer = new Producer(_brokerHelper.GetBroker());
} public void Dispose()
{
if (_producer != null)
_producer.Dispose();
} /// <summary>
/// 发送消息到队列
/// </summary>
/// <param name="topic"></param>
/// <param name="datas"></param>
/// <param name="acks"></param>
/// <param name="timeout"></param>
/// <param name="codec"></param>
public void Pub(string topic, List<string> datas, short acks = 1, TimeSpan? timeout = default(TimeSpan?), MessageCodec codec = MessageCodec.CodecNone)
{
//var msgs = new List<Message>();
//foreach (string item in datas)
//{
// msgs.Add(new Message(item));
//}
var msgs = datas.Select(item => new Message(item)).ToList(); _producer.SendMessageAsync(topic, msgs, acks, timeout, codec);
}
}

App.config

<?xml version="1.0" encoding="utf-8"?>

<configuration>
<configSections>
<section name="Test" type="xxxxx.sssss.KafkaConfig, xxxxx.sssss" />
</configSections>
<Test broker="127.0.0.1:9092" topic="TestSiso" />
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</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. struts2 之 struts2数据处理

    开门见山,struts2的数据处理总结: 1. 在servlet中,如果要获取页面提交的数据要使用requerst.getParameter方法来获取,并且每次需要进行相关的类型转换工作,数据的获取及 ...

  2. js中元素(图片)切换和隐藏显示问题

    这个知识点其实也简单,(当然是在理清思路的情况下),在没预习的情况下听的还真是艰难,上课以来唯一的一次懵逼了一天,感觉乱乱的,全是新属性,所以今晚的我破天荒的熬夜敲代码,一定要弄懂! 现在就来梳理下头 ...

  3. CF 690C3. Brain Network (hard) from Helvetic Coding Contest 2016 online mirror (teams, unrated)

    题目描述 Brain Network (hard) 这个问题就是给出一个不断加边的树,保证每一次加边之后都只有一个连通块(每一次连的点都是之前出现过的),问每一次加边之后树的直径. 算法 每一次增加一 ...

  4. cmd中关闭windows2008错误弹窗

    net stop sharedaccess reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Windows /v ErrorMode / ...

  5. 推送一个已有的代码到新的 gerrit 服务器

    1.指定项目代码库中迭代列出全部ProductList(.git)到pro.log文件中 repo forall -c 'echo $REPO_PROJECT' | tee pro.log pro.l ...

  6. 在ABP框架中使用MapTo容易犯的错误

    用自己的话说:MapTo其实就是两个实体间的数据转换.不用像以前那样p.name=p1.name 这样赋值,一旦实体的属性多到十几个以上的时候,这样赋值代码就显得有些臃肿了,如下面: Resource ...

  7. LeetCode 108: Convert Sorted Array to Binary Search Tree DFS求解

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 解题 ...

  8. 使用Spigot搭建MineCraft服务器

    MineCraft 这种游戏还是人多了好玩,以前的服务器放在同学的Windows电脑上,每次我们想玩的时候就让让去打开,但是总是有一些原因,想玩的时候服务器没开着,不想玩的时候服务器空开着费电.昨天一 ...

  9. Cocos2d-x 3.2 环境搭建

    参考文章地址: 1.Cocos2d-x官方安装说明文档:http://cn.cocos2d-x.org/tutorial/show?id=781 2.CSDN博客:http://blog.csdn.n ...

  10. Roguelike元素对游戏设计的影响

    Roguelike game自1980年以来,就占据着游戏市场中很大的份额,而现如今的很多游戏中,也加入了Roguelike元素来起到更好的效果.我们知道Roguelike game中有着一些看似任性 ...