• NetCore.CAP mqttws31.js RabbitMq 订阅发布消息


    最近项目有些可能需要消息队列,所以先了解下RabbitMq,安装完成之后进入管理管理界面,如果您安装rabbitmq:3.10.6版本打不开管理界面请参考:windows安装RabbitMq 15672访问找不到_csdn_aspnet的博客-CSDN博客

    使用guest帐号登录,新建虚拟主机和用户,新建完成后创建测试项目,项目中使用开源的CAP,nuget引用包如下:

    引入后在Startup-》ConfigureServices中配置CAP,代码如下: 

    1. //配置CAP
    2. services.AddCap(x =>
    3. {
    4. x.UseMySql(BaseDBConfig.ConnectionString);
    5. //使用RabbitMQ
    6. x.UseRabbitMQ(rb =>
    7. {
    8. //rabbitmq服务器地址
    9. rb.HostName = "192.168.0.149";
    10. rb.Port = 5672;
    11. rb.UserName = "admin";
    12. rb.Password = "admin";
    13. rb.VirtualHost = "msgmq";//虚拟主机
    14. rb.ExchangeName = "amq.topic";//交换机,必须指定,不然前端页面收不到消息
    15. });
    16. x.UseDashboard();//CAP面板,默认http://localhost:5000/cap
    17. x.FailedRetryCount = 5;
    18. });

    这里我使用的是mysql数据库,你可以改成你需要的数据库,请参考CAP示例。

    编写控制器测试方法:

    1. ///
    2. /// Publish
    3. ///
    4. ///
    5. ///
    6. [HttpGet]
    7. public string Get(string message)
    8. {
    9. _publisher.Publish("hf", message);//hf为RauteKey
    10. return "发送成功";
    11. }
    12. ///
    13. /// "hf"为发送消息时的RauteKey,也可以模糊匹配
    14. ///
    15. ///
    16. [NonAction]
    17. [CapSubscribe("hf")]
    18. public void HandleMessage(string message)
    19. {
    20. Console.WriteLine(DateTime.Now.ToString() + "收到消息:" + message);
    21. }

    上面代码中的"hf"无需在rabbitmq中创建,CAP会自动创建,运行代码测试成功,开始编写html、js代码:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="mqttws31.js">script>
    7. <script type="text/javascript">
    8. var mqtt;
    9. //var host = '192.168.0.31';
    10. //var port = 9001;
    11. var host = '192.168.0.149';
    12. var port = 15675;
    13. // onConnect 事件
    14. function onConnect() {
    15. console.log('connected.');
    16. var raw_message = 'Hello World!';
    17. message = new Paho.MQTT.Message(raw_message);
    18. message.destinationName = 'hf';
    19. console.log('sending message: ' + raw_message);
    20. mqtt.send(message);
    21. // 订阅 download topic
    22. var subOptions = {
    23. qos: 1,
    24. onSuccess: onSubscribe
    25. };
    26. //此处'hf'为发送消息时的Routing key
    27. //一直以为是交换机(Exchanges)中的名称,其实是推送消息时的Routing key
    28. mqtt.subscribe('hf', subOptions);
    29. }
    30. // 订阅主题成功事件
    31. function onSubscribe(context) {
    32. console.log('subscribe success');
    33. console.log(context);
    34. }
    35. // 链接失败事件
    36. function onFailure(message) {
    37. console.log('connect failed.');
    38. }
    39. // onMessageArrived 事件
    40. function onMessageArrived(message) {
    41. console.log('new message arrived...');
    42. console.log(eval(message.payloadString));//使用eval直接转换为中文输出;
    43. }
    44. // 创建 MQTT websocket 链接
    45. function MQTTconnect() {
    46. console.log('connecting to ' + host + ':' + port);
    47. mqtt = new Paho.MQTT.Client(host, port, "/ws", 'clientid-1');
    48. var options = {
    49. timeout: 3,
    50. onSuccess: onConnect,
    51. onFailure: onFailure,
    52. userName: 'msgmq:admin',//msgmq一定与CAP属性VirtualHost对应
    53. password: 'admin',
    54. mqttVersion: 4
    55. };
    56. mqtt.onMessageArrived = onMessageArrived;
    57. mqtt.connect(options);
    58. }
    59. script>
    60. head>
    61. <body>
    62. <button onclick="MQTTconnect();">链接button>
    63. body>
    64. html>

    上面代码中 mqtt.subscribe('hf', subOptions);这一句搞了两天才明白怎么回事,我还自己创建交换机、队列,指定之后CAP发送消息,前端页面均收不到,后来经过多次测试,发现封装的js貌似只能使用默认的amq.topic交换机,前端连接后如下图:

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

  • 相关阅读:
    基于机智云物联网平台与4G DTU远程车库门
    Net 高级调试之四:Windbg 动态调试
    力扣hot100 两数之和 哈希表
    关于Unity里边的一些基础,随机数,委托,角度转换,以及正反余选
    Kotlin & Compose Multiplatform 跨平台开发实践之加入 iOS 支持
    爬取任意百度贴吧评论(可直接Copy)
    1542. 找出最长的超赞子字符串 哈希+状态压缩
    linux线程创建等待及退出总结
    chrome工具调试
    数据结构:树
  • 原文地址:https://blog.csdn.net/hefeng_aspnet/article/details/126141530