//private readonly CoreDelegateServices services; //public MQSubsribeJob(CoreDelegateServices services) => this.services = services; public Task Run(JobInfo jobInfo, CancellationToken cancelToken) { //发送通知 //await this.services.Notifications.Send(this.GetType(), true, "MQ消息订阅Job已启动", // $"{jobInfo.Identifier} 启动"); try { var seconds = jobInfo.Parameters.Get("SecondsToRun", 10); Debug.Print($"MQSubsribeJob:{seconds}秒订阅一次数据....."); //判断连接状态 if (!RabbitMQManage.Status && Settings.IsAuthenticated) { Task.Run(() => { if (!string.IsNullOrEmpty(Settings.UserMobile)) { try { RabbitMQManage.Subscribe <MessageConsume>(new MesArgs() { sendEnum = SendEnum.Direct, exchangeName = "direct_mq", rabbitQueeName = $"message_{Settings.UserMobile}", routeName = $"message_{Settings.UserMobile}" }, cancelToken); RabbitMQManage.Subscribe <NoticeConsume>(new MesArgs() { sendEnum = SendEnum.Direct, exchangeName = "direct_mq", rabbitQueeName = $"notice_{Settings.UserMobile}", routeName = $"notice_{Settings.UserMobile}" }, cancelToken); } catch (Exception) { } } }, cancelToken); } } catch (Exception ex) { Crashes.TrackError(ex); } return(Task.FromResult(true)); //发送通知 //await this.services.Notifications.Send(this.GetType(), false, // "MQ消息订阅Job已完成", $"{jobInfo.Identifier} 完成"); }
public static void Subsribe() { Task.Run(() => { //概念 一个管道下面可以绑定多个队列。 //发送消息 是指将消息发送到管道中,然后由rabbitmq根据发送规则在将消息具体的转发到对应到管道下面的队列中 //消费消息 是指消费者(即服务)从管道下面的队列中获取消息 //同一个队列 可以有多个消费者(即不同的服务,都可以连接到同一个队列去获取消息) //但注意 当一个队列有多个消费者的时候,消息会被依次分发到不同的消费者中。比如第一条消息给第一个消费者,第二条消息给第二个消费者(框架内部有一个公平分发的机制) //推送模式时 需指定管道名称和路由值 //队列名称可自己指定 //注意 ,管道名称和路由名称一定要和发送方的管道名称和路由名称一致 //无论这个管道下面挂靠有多少个队列,只有路由名称和此处指定的路由名称完全一致的队列,才会收到这条消息。 var dirarg = new MesArgs() { sendEnum = SendEnum.推送模式, exchangeName = "message.directdemo", rabbitQueeName = "meesage.directmessagequene", routeName = "routekey" }; RabbitMQManage.Subscribe <DirectMessageConsume>(dirarg); //订阅模式时需指定管道名称,并且管道名称要和发送方管道名称一致 //队列名称可自己指定 //所有这个管道下面的队列,都将收到该条消息 var fanoutrg = new MesArgs() { sendEnum = SendEnum.订阅模式, exchangeName = "message.fanoutdemo", rabbitQueeName = "meesage.fanoutmessagequene" }; RabbitMQManage.Subscribe <FanoutMessageConsume>(fanoutrg); //路由模式时需指定管道名称,路由关键字并且管道名称,路由关键字要和发送方的一致 //队列名称可自己指定 //消息将被发送到管道下面的能匹配路由关键字的队列中 //也就是说 路由模式时,有多少队列能收到消息,取决于该队列的路由关键字是否匹配,只要匹配就能收到消息 //符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词 var topicrg = new MesArgs() { sendEnum = SendEnum.主题路由模式, exchangeName = "message.topicdemo", rabbitQueeName = "message.topicmessagequene", routeName = "#.log.#" }; RabbitMQManage.Subscribe <TopicMessageConsume>(topicrg); }); }
static void Main(string[] args) { try { //需要注意一点儿,如果发送的时候,在该管道下找不到相匹配的队列框架将默认丢弃该消息 Console.WriteLine("Start......"); //推送模式 //推送模式下,需指定管道名称和路由键值名称 //消息只会被发送到指定的队列中去 var direct = new PublishMessage() { SendMessage = new Test() { Var1 = "这是推送模式" }, ExchangeName = "message.directdemo", RouteName = "routekey", SendEnum = SendEnum.推送模式 }; //同步发送 ,返回true或fasle true 发送成功,消息已存储到Rabbitmq中,false表示发送失败 var b = RabbitMQManage.PublishMessage(direct); //异步发送,如果失败,失败的消息会被写入数据库,会有后台线程轮询数据库进行重新发送 //RabbitMQManage.PublishMessageAsync(directdto); //订阅模式 //订阅模式只需要指定管道名称 //消息会被发送到该管道下的所有队列中 var fanout = new PublishMessage() { SendMessage = new Test() { Var1 = "这是订阅模式" }, ExchangeName = "message.fanoutdemo", RouteName = "routekey1", SendEnum = SendEnum.订阅模式 }; //同步发送 var fb = RabbitMQManage.PublishMessage(fanout); //异步发送 // RabbitMQManage.PublishMessageAsync(fanoutdto); //主题路由模式 //路由模式下需指定 管道名称和路由值 //消息会被发送到该管道下,和路由值匹配的队列中去 var route = new PublishMessage() { SendMessage = new Test() { Var1 = "这是主题路由模式1", }, ExchangeName = "message.topicdemo", RouteName = "a.log", SendEnum = SendEnum.主题路由模式 }; var route2 = new PublishMessage() { SendMessage = new Test() { Var1 = "这是主题路由模式2", }, ExchangeName = "message.topicdemo", RouteName = "a.log.a.b", SendEnum = SendEnum.主题路由模式 }; //同步发送 var rb = RabbitMQManage.PublishMessage(route); var rb2 = RabbitMQManage.PublishMessage(route2); //异步发送 //RabbitMQManage.PublishMessageAsync(route); //RabbitMQManage.PublishMessageAsync(route2); Console.WriteLine("End......"); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine("Error......"); Console.WriteLine(ex.ToString()); } }
/// <summary> /// 发送消息 /// </summary> public static void SendMessage() { //需要注意一点儿,如果发送的时候,在该管道下找不到相匹配的队列框架将默认丢弃该消息 //推送模式 //推送模式下,需指定管道名称和路由键值名称 //消息只会被发送到指定的队列中去 var directdto = new PushMsg() { sendMsg = new TestDto() { Var1 = "这是推送模式" }, exchangeName = "message.directdemo", routeName = "routekey", sendEnum = SendEnum.推送模式 }; //同步发送 ,返回true或fasle true 发送成功,消息已存储到Rabbitmq中,false表示发送失败 var b = RabbitMQManage.PushMessage(directdto); //异步发送,如果失败,失败的消息会被写入数据库,会有后台线程轮询数据库进行重新发送 //RabbitMQManage.PushMessageAsync(directdto); //订阅模式 //订阅模式只需要指定管道名称 //消息会被发送到该管道下的所有队列中 var fanoutdto = new PushMsg() { sendMsg = new TestDto() { Var1 = "这是订阅模式" }, exchangeName = "message.fanoutdemo", sendEnum = SendEnum.订阅模式 }; //同步发送 var fb = RabbitMQManage.PushMessage(fanoutdto); //异步发送 // RabbitMQManage.PushMessageAsync(fanoutdto); //主题路由模式 //路由模式下需指定 管道名称和路由值 //消息会被发送到该管道下,和路由值匹配的队列中去 var routedto = new PushMsg() { sendMsg = new TestDto() { Var1 = "这是主题路由模式1", }, exchangeName = "message.topicdemo", routeName = "a.log", sendEnum = SendEnum.主题路由模式 }; var routedto2 = new PushMsg() { sendMsg = new TestDto() { Var1 = "这是主题路由模式2", }, exchangeName = "message.topicdemo", routeName = "a.log.a.b", sendEnum = SendEnum.主题路由模式 }; //同步发送 var rb = RabbitMQManage.PushMessage(routedto); var rb2 = RabbitMQManage.PushMessage(routedto2); //异步发送 //RabbitMQManage.PushMessageAsync(routedto); }