C\#RabbitMQ 로 메시지 구독 과 발 표를 실현 합 니 다.

Fanout 교환기 모델
부채 형 교환 기 는 방송 모드 를 사용 하여 연 결 된 교환기 에 따라 그 에 대응 하 는 모든 대기 열 로 이동 합 니 다.교환기 에 보 내 는 메 시 지 는 이 교환기 와 연 결 된 모든 대기 열 에 전 송 됩 니 다.서브 넷 방송 처럼 모든 서브 넷 안의 호스트 가 복사 메 시 지 를 받 았 다.팬 아웃 교환기 가 메 시 지 를 전달 하 는 것 이 가장 빠르다.

RabbitMQ 콘 솔 조작
두 대기 열 추가
같은 Virtual host 에 두 개의 대기 열 Q1,Q2 를 추가 합 니 다.아래 그림 과 같 습 니 다.

귀속 fanout 교환기
두 대기 열 을 시스템 의 기본 fanout 교환기 에 연결 합 니 다.다음 과 같 습 니 다.

예제 효과 도
생산 자 는 Fanout 타 입 교환기 로 정 보 를 발표 합 니 다.아래 그림 과 같 습 니 다.

 생산자 가 메 시 지 를 발표 할 때 Q1,Q2 두 대기 열 은 모두 받 을 수 있 습 니 다.아래 그림 과 같 습 니 다.

소비 자 를 시작 하면 두 소비 자 는 모두 관련 정 보 를 구독 할 것 이다.다음 그림 과 같다.

핵심 코드
소식 발표
연결 을 만 든 후 채널 성명 유형 을 Fanout 의 교환기 로 다음 과 같 습 니 다.

/// <summary>
    /// fanout     ,    
    /// </summary>
    public class RabbitMqFanoutSendHelper : RabbitMqHelper {
        /// <summary>
        ///     
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public bool SendMsg(string msg)
        {
            try
            {
                using (var conn = GetConnection("/Alan.hsiang"))
                {
                    using (var channel = conn.CreateModel())
                    {
                        channel.ExchangeDeclare(exchange: "amq.fanout", type: ExchangeType.Fanout,durable:true);

                        var body = Encoding.UTF8.GetBytes(msg);

                        channel.BasicPublish(exchange: "amq.fanout",
                                             routingKey: "",
                                             basicProperties: null,
                                             body: body);

                        //Console.WriteLine(" [x] Sent {0}", message);
                    };
                };
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
메시지 구독
연결 을 만 든 후 채널 성명 유형 은 Fanout 의 교환기 이 고 대기 열 을 연결 하여 구독 합 니 다.다음 과 같 습 니 다.

/// <summary>
    ///          
    /// </summary>
    public class RabbitMqFanoutReceiveHelper : RabbitMqHelper
    {
        public RabbitMqReceiveEventHandler OnReceiveEvent;

        private IConnection conn;

        private IModel channel;

        private EventingBasicConsumer consumer;

        public bool StartReceiveMsg(string queueName)
        {
            try
            {
                conn = GetConnection("/Alan.hsiang");

                channel = conn.CreateModel();
                channel.ExchangeDeclare(exchange: "amq.fanout", type: ExchangeType.Fanout,durable:true);
                //             
                //var queueName = channel.QueueDeclare().QueueName;
                channel.QueueBind(queue: queueName, exchange: "amq.fanout", routingKey: "");
                consumer = new EventingBasicConsumer(channel);
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body.ToArray();
                    var message = Encoding.UTF8.GetString(body);
                    //Console.WriteLine(" [x] Received {0}", message);
                    if (OnReceiveEvent != null)
                    {
                        OnReceiveEvent(queueName+"::"+message);
                    }
                };
                channel.BasicConsume(queue: queueName,
                                        autoAck: true,
                                        consumer: consumer);
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
저자:Alan.hsiang
출처:http://www.cnblogs.com/hsiang/
이상 은 C\#RabbitMQ 로 메시지 구독 과 발 표를 실현 하 는 상세 한 내용 입 니 다.C\#RabbitMQ 로 메시지 구독 과 발 표를 실현 하 는 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기