最近项目有些可能需要消息队列,所以先了解下RabbitMq,安装完成之后进入管理管理界面,如果您安装rabbitmq:3.10.6版本打不开管理界面请参考:windows安装RabbitMq 15672访问找不到_csdn_aspnet的博客-CSDN博客
使用guest帐号登录,新建虚拟主机和用户,新建完成后创建测试项目,项目中使用开源的CAP,nuget引用包如下:

引入后在Startup-》ConfigureServices中配置CAP,代码如下:
- //配置CAP
- services.AddCap(x =>
- {
- x.UseMySql(BaseDBConfig.ConnectionString);
-
- //使用RabbitMQ
- x.UseRabbitMQ(rb =>
- {
- //rabbitmq服务器地址
- rb.HostName = "192.168.0.149";
- rb.Port = 5672;
-
- rb.UserName = "admin";
- rb.Password = "admin";
-
- rb.VirtualHost = "msgmq";//虚拟主机
-
- rb.ExchangeName = "amq.topic";//交换机,必须指定,不然前端页面收不到消息
- });
-
- x.UseDashboard();//CAP面板,默认http://localhost:5000/cap
- x.FailedRetryCount = 5;
-
- });
这里我使用的是mysql数据库,你可以改成你需要的数据库,请参考CAP示例。
编写控制器测试方法:
- ///
- /// Publish
- ///
- ///
- ///
- [HttpGet]
- public string Get(string message)
- {
- _publisher.Publish("hf", message);//hf为RauteKey
-
- return "发送成功";
- }
-
- ///
- /// "hf"为发送消息时的RauteKey,也可以模糊匹配
- ///
- ///
- [NonAction]
- [CapSubscribe("hf")]
- public void HandleMessage(string message)
- {
- Console.WriteLine(DateTime.Now.ToString() + "收到消息:" + message);
- }
上面代码中的"hf"无需在rabbitmq中创建,CAP会自动创建,运行代码测试成功,开始编写html、js代码:
- html>
- <html>
- <head>
- <meta charset="utf-8" />
- <title>title>
- <script src="mqttws31.js">script>
- <script type="text/javascript">
- var mqtt;
- //var host = '192.168.0.31';
- //var port = 9001;
- var host = '192.168.0.149';
- var port = 15675;
-
- // onConnect 事件
- function onConnect() {
- console.log('connected.');
- var raw_message = 'Hello World!';
- message = new Paho.MQTT.Message(raw_message);
- message.destinationName = 'hf';
- console.log('sending message: ' + raw_message);
- mqtt.send(message);
-
- // 订阅 download topic
- var subOptions = {
- qos: 1,
- onSuccess: onSubscribe
- };
-
- //此处'hf'为发送消息时的Routing key
- //一直以为是交换机(Exchanges)中的名称,其实是推送消息时的Routing key
- mqtt.subscribe('hf', subOptions);
- }
-
- // 订阅主题成功事件
- function onSubscribe(context) {
- console.log('subscribe success');
- console.log(context);
- }
-
- // 链接失败事件
- function onFailure(message) {
- console.log('connect failed.');
- }
-
- // onMessageArrived 事件
- function onMessageArrived(message) {
- console.log('new message arrived...');
- console.log(eval(message.payloadString));//使用eval直接转换为中文输出;
-
- }
-
-
- // 创建 MQTT websocket 链接
- function MQTTconnect() {
- console.log('connecting to ' + host + ':' + port);
- mqtt = new Paho.MQTT.Client(host, port, "/ws", 'clientid-1');
- var options = {
- timeout: 3,
- onSuccess: onConnect,
- onFailure: onFailure,
-
- userName: 'msgmq:admin',//msgmq一定与CAP属性VirtualHost对应
- password: 'admin',
- mqttVersion: 4
- };
- mqtt.onMessageArrived = onMessageArrived;
- mqtt.connect(options);
- }
-
- script>
- head>
- <body>
- <button onclick="MQTTconnect();">链接button>
- body>
- html>
上面代码中 mqtt.subscribe('hf', subOptions);这一句搞了两天才明白怎么回事,我还自己创建交换机、队列,指定之后CAP发送消息,前端页面均收不到,后来经过多次测试,发现封装的js貌似只能使用默认的amq.topic交换机,前端连接后如下图:

折腾了好久,可能对rabbitmq不那么熟悉吧,再就是CAP貌似不能设置ClientId、CleanSession属性,因为有时前端不在线,需要上线后收到消息,目前我使用的的是自定义客户端,基于MQTTnet编写的代码,如果您知道怎么设置(包含CAP和前端js设置topic)或您有更好的方案可留言给我,感谢。