//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); }); }