RabbitMQSender

来源:互联网 发布:淘宝店运营工作职责 编辑:程序博客网 时间:2024/06/04 23:36
namespace RabbitMQSender
{
    public class RabbitQHelper
    {
        private static IConnection conn;


        private static RabbitQHelper rabbit;
        public  int persistMode = 1;


        private RabbitQHelper()
        {


        }


        /// <summary>
        /// 获取Employee实例
        /// </summary>
        /// <returns></returns>
        public static RabbitQHelper GeConn()
        {
            if (rabbit == null)
            {
                rabbit = new RabbitQHelper();
                SetConnParam();
            }
            return rabbit;
        }


        /// <summary>
        /// 创建连接
        /// </summary>
        public static void SetConnParam()
        {
            Uri uri = new Uri("amqp://192.168.1.56:5672/");
            ConnectionFactory cf = new ConnectionFactory();
            cf.UserName = "zlp"; //某个vhost下的用户
            cf.Password = "123456";
            cf.VirtualHost = "/"; //vhost
            cf.RequestedHeartbeat = 0;
            cf.Endpoint = new AmqpTcpEndpoint(uri);
            //创建一个连接到具体总结点的连接
            conn = cf.CreateConnection();
        }


        /// <summary>
        /// 创建队列
        /// </summary>
        /// <param name="queueName"></param>
        /// <returns></returns>
        public bool CreateQueue(string queueName)
        {
            try
            {
                //创建并返回一个新连接到具体节点的通道
                using (IModel ch = conn.CreateModel())
                {
                    //声明一个路由
                    ch.ExchangeDeclare("fanoutE", "fanout");
                    //声明一个队列
                    ch.QueueDeclare(queueName, true, false, false, null);
                    //将一个队列和一个路由绑定起来。并制定路由关键字  
                    //ch.QueueBind("q", "fanoutE", routingKey);
                    ch.QueueBind(queueName, "fanoutE", "fanoutk"); //fanout模式publish的时候不需要routingKey,只要绑定了的Q都能接收
                }
            }
            catch (Exception ex)
            {
                return false;
            }


            return true;
        }


        public bool SendMessage(string exchangeName,string header, string content)
        {
            try
            {
                using (IModel ch = conn.CreateModel())
                {
                    ///构造消息实体对象并发布到消息队列上
                    IMapMessageBuilder b = new MapMessageBuilder(ch);
                    var target = b.Headers;
                    target["header"] = header;
                    var targerBody = b.Body;
                    targerBody["body"] = content;//这个才是具体的发送内容
                    if (persistMode == 1)
                    {
                        //设定传输模式
                        ((IBasicProperties)b.GetContentHeader()).DeliveryMode = 2;
                    }
                    //写入
                    ch.BasicPublish("fanoutE", "", (IBasicProperties)b.GetContentHeader(), b.GetContentBody());
                }
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }


        public string  ReceiveMessage(string queueName)
        {
            string s = "";
            using (IModel ch = conn.CreateModel())
            {
                ch.BasicQos(0, 2, false);
                var consumer = new QueueingBasicConsumer(ch);
                ch.BasicConsume(queueName, false, consumer);
                var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();


                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);
                int msgIndex = message.IndexOf('{');
                s = message.Substring(msgIndex, message.Length - msgIndex);
                ch.BasicAck(ea.DeliveryTag, false);                
            }
            return s;
        }


    }
}
0 0
原创粉丝点击