RabbitMQ 消费者操作类

本文档介绍了一个名为RabbitMqWorker的类,该类用于处理RabbitMQ的消费者操作。类中包含了连接配置、启动、停止以及消息消费的方法。在DoWork事件中,使用Parallel.Invoke并行处理多个消息队列,每个队列通过MessageConsumer方法进行消费,该方法声明信道、队列,并设置死信交换机。消费消息时,如果处理成功则确认状态,否则拒绝状态。
摘要由CSDN通过智能技术生成

    /// <summary>
    /// 
    /// </summary>
    public class RabbitMqWorker
    {
        //
        readonly string rabbitMQ_HostConfig = System.Configuration.ConfigurationManager.AppSettings["RabbitMQ_Host22"];
        //
        BackgroundWorker bg = new BackgroundWorker();
        //
        IConnection rabbitMqConnection = null;

        /// <summary>
        /// 
        /// </summary>
        public RabbitMqWorker()
        {
            string[] arrRabbitConfig = rabbitMQ_HostConfig.Split(',');
            rabbitMqConnection = RabbitMQHelper.Instance(arrRabbitConfig[0], int.Parse(arrRabbitConfig[1]), arrRabbitConfig[2], arrRabbitConfig[3], arrRabbitConfig[4]).Connection();
        }

        /// <summary>
        /// 
        /// </summary>
        public void Start()
        {
            Program.loggor.Info("Start RabbitMqWorker");
            bg.DoWork += new DoWorkEventHandler(bg_DoWork);
            bg.WorkerSupportsCancellation = true;
            bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
            bg.RunWorkerAsync();
        }

        /// <summary>
        /// 
        /// </summary>
        public void Stop()
        {
            if (rabbitMqConnection != null)
            {
                rabbitMqConnection.Close();
            }
            if (bg != null && bg.IsBusy)
            {
                bg.CancelAsync();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void bg_DoWork(object sender, DoWorkEventArgs e)
        {

            try
            {
                System.Threading.Thread.Sleep(1000);

                System.Threading.Tasks.Parallel.Invoke(
                    () => { MessageConsumer("queue.sp.mipo.message"); },
                    () => { MessageConsumer("queue.sp.mipo.message"); },
                    () => { MessageConsumer("queue.sp.mipo.message"); },
                    () => { MessageConsumer("queue.sp.mipo.message"); },
                    () => { MessageConsumer("queue.sp.mipo.message"); });


                /* 
                               System.Threading.Tasks.Parallel.Invoke(
                                   () => { MessageConsumer("queue.sp.mipo.message"); }); 
               */
            }
            catch (Exception ex)
            {
                EMailHelper.ToMail(ex);

                Program.loggor.Error("RabbitMqWorker", ex);
            }
        }

        /// <summary>
        /// 消息消费者
        /// </summary>
        /// <param name="queueName"></param>
        void MessageConsumer(string queueName)
        {
            //1.声明信道
            using (IModel channel = rabbitMqConnection.CreateModel())
            {
                //2.声明队列
                Dictionary<string, object> args = new Dictionary<string, object>();
                args.Add("x-dead-letter-exchange", "exchange.dlx");
                args.Add("x-dead-letter-routing-key", "rk.sp.mipo");
                channel.QueueDeclare(queueName, true, false, false, args);
                //3.绑定队列交换机, 指定路由Key值
                //channel.QueueBind(queueName,);
                //3.1同一时刻服务器只发一条消息给消费者, 公平分发
                channel.BasicQos(0, 1, false);
                //4.定义消费者
                var consumer = new QueueingBasicConsumer(channel);
                //5.监听队列,手动返回完成状态
                channel.BasicConsume(queueName, false, consumer);
                //6.循环取消息
                while (true)
                {
                    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    //
                    System.Threading.Thread.Sleep(10);

                    //I.Todo...消费消息进行逻辑处理
                    if (RabbitConsumeBll.Instance().Bus(message))
                    {
                        //6.1成功后反馈确认状态
                        channel.BasicAck(ea.DeliveryTag, false);
                    }
                    else
                    {
                        //6.2失败后反馈拒绝状态
                        channel.BasicReject(ea.DeliveryTag, false);
                    }
                }
            }

        }

        /// <summary>
        /// 后台线程执行完成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Program.loggor.Error("RabbitMqWorker", e.Error);
            }
        }

    }

在Spring Boot中编写RabbitMQ消费者很简单,你可以按照以下步骤进行操作: 1. 首先,确保你的Spring Boot项目已经添加了RabbitMQ的依赖。你可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 创建一个消息处理,用于处理接收到的消息。这个需要实现`org.springframework.amqp.rabbit.annotation.RabbitListener`注解,该注解用于指定消费者监听的队列名称。示例如下: ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class MessageConsumer { @RabbitListener(queues = "your_queue_name") public void receiveMessage(String message) { // 处理接收到的消息 System.out.println("Received message: " + message); } } ``` 在上面的示例中,我们创建了一个名为`MessageConsumer`的,并使用`@RabbitListener`注解指定了消费者监听的队列名称为`your_queue_name`。`receiveMessage`方法用于处理接收到的消息,在这里你可以自定义你的业务逻辑。 3. 在应用程序启动上添加`@EnableRabbit`注解,开启RabbitMQ的支持。例如: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.amqp.rabbit.annotation.EnableRabbit; @SpringBootApplication @EnableRabbit public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 通过添加`@EnableRabbit`注解,Spring Boot会自动扫描并创建RabbitMQ的相关实例。 现在,你已经完成了RabbitMQ消费者的编写。当消息被发送到指定的队列时,消费者将会自动接收并处理这些消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值