Exemple #1
0
        //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} 完成");
        }
Exemple #2
0
        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);
            });
        }
Exemple #3
0
        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());
            }
        }
Exemple #4
0
        /// <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);
        }