最近项目有些可能需要消息队列,所以先了解下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)或您有更好的方案可留言给我,感谢。