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

4 篇文章 0 订阅
3 篇文章 0 订阅

最近项目有些可能需要消息队列,所以先了解下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示例。

编写控制器测试方法:

/// <summary>
        /// Publish
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        [HttpGet]
        public string Get(string message)
        {
            _publisher.Publish("hf", message);//hf为RauteKey

            return "发送成功";
        }

        /// <summary>
        /// "hf"为发送消息时的RauteKey,也可以模糊匹配
        /// </summary>
        /// <param name="message"></param>
        [NonAction]
        [CapSubscribe("hf")]
        public void HandleMessage(string message)
        {
            Console.WriteLine(DateTime.Now.ToString() + "收到消息:" + message);
        }

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

<!DOCTYPE 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)或您有更好的方案可留言给我,感谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值