RabbitMQ實戰篇:Fanout - 扇形交換機

前兩篇我們已經初步學習了rabbitmq的使用,這一篇主要講Fanout的使用,如果對Fanout扇形交換機還不太明白的話,建議看一下我的第一篇《RabbitMQ實戰篇:開篇思維導圖》裏面有詳細介紹各個交換機類型。

那麼我們就直接上代碼了:

我們配置了2個Queue ,綁定到同一個exchange中

package com.lwl.rabbitmq.config;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.lwl.rabbitmq.constant.Constants;

/**
 * 發送消息 配置發送消息的隊列queue
 * @author lwl
 * @create 2018年8月10日 下午2:37:38
 * @version 1.0
 */
@Configuration
public class SendMessageConfig {

    @Bean
    public Queue fanoutQueue() {
    	return new Queue(Constants.FANOUT_QUEUE);
    }

    
    @Bean
    FanoutExchange exchange() {
        return new FanoutExchange(Constants.FANOUT_NAME);
    }
    
    /**
     * 使用扇型交換機,routekey 
     * @param queueMessage
     * @param exchange
     * @return
     * @author lwl
     * @create 2019年6月14日 上午10:51:21
     */
    @Bean
    Binding bindingExchangeMessage(Queue fanoutQueue, FanoutExchange  exchange) {
        return BindingBuilder.bind(fanoutQueue).to(exchange);
    }
    
    
    /**
     * 第二個隊列
     * @return
     * @author lwl
     * @create 2019年6月14日 下午2:11:31
     */
    @Bean
    public Queue fanoutTwoQueue() {
    	return new Queue(Constants.FANOUT_QUEUE_TWO);
    }
    
    @Bean
    Binding bindingExchangeMessageTwo(Queue fanoutTwoQueue, FanoutExchange  exchange) {
    	return BindingBuilder.bind(fanoutTwoQueue).to(exchange);
    }
}

看一下我們的生產者:

package com.lwl.rabbitmq.producer;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.lwl.rabbitmq.constant.Constants;

/**
 * 生成者
 * @author lwl
 * @create 2019年6月14日 上午10:56:41
 * @version 1.0
 */
@Component
public class Producer {

	@Autowired
    private AmqpTemplate template;

    /**
     * 使用扇型交換機
     * @param message
     * @author lwl
     * @create 2019年6月14日 上午10:54:54
     */
    public void send(Object message){
    	template.convertAndSend(Constants.FANOUT_NAME,null,message);
    }
    
	
}

再看一下我們的消費者,由於有2個隊列,使用有2個消費者

package com.lwl.rabbitmq.consumer;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.lwl.rabbitmq.constant.Constants;

/**
 * 消費者
 * @author lwl
 * @create 2019年6月14日 上午10:57:11
 * @version 1.0
 */
@Component
@RabbitListener(queues = Constants.FANOUT_QUEUE)
public class FanoutConsumer {

	@RabbitHandler
    public void process(String hello) {
		System.out.println();
		System.out.println("-----------------------客戶端  1  收到數據 -----------------------");
        System.out.println(Constants.FANOUT_QUEUE+ " --> Receiver1  : " + hello);
        System.out.println();
    }
	
}
package com.lwl.rabbitmq.consumer;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.lwl.rabbitmq.constant.Constants;

/**
 * 消費者
 * @author lwl
 * @create 2019年6月14日 上午10:57:11
 * @version 1.0
 */
@Component
@RabbitListener(queues = Constants.FANOUT_QUEUE_TWO)
public class FanoutConsumer4 {

	@RabbitHandler
    public void process(String hello) {
		System.out.println();
		System.out.println("-----------------------客戶端  4  收到數據 -----------------------");
        System.out.println(Constants.FANOUT_QUEUE_TWO+ " --> Receiver4  : " + hello);
        System.out.println();
    }
	
}

接下來就是我們的測試用例了:

	/**
	 * 發送消息(此時把FanoutConsumer,FanoutConsumer2 ,FanoutConsumer3, FanoutConsumer4  註釋掉)
	 * @author lwl
	 * @create 2019年6月14日 下午1:04:10
	 */
	@Test
	public void sendMessage() {
		String message = "我是Fanout 發送的消息22222";
		producer.send(message);
		System.out.println("--------------------------------發送完畢--------------------------------");
		System.out.println();
	}
	

我們看到fanout 2個隊列都收到消息,因爲這2個queue都綁定到exchange上。

	/**
	 * 接受消息(此時把FanoutConsumer,FanoutConsumer2 ,FanoutConsumer3, FanoutConsumer4  打開)
	 * @author lwl
	 * @create 2019年6月14日 下午1:04:10
	 */
	@Test
	public void getMessage() {
		System.out.println("-------------------------------接受數據--------------------------------");
	}

運行結果:

-----------------------客戶端  3  收到數據 -----------------------
fanout_queue_2 --> Receiver3  : 我是Fanout 發送的消息22222


-----------------------客戶端  2  收到數據 -----------------------
fanout_queue --> Receiver2  : 我是Fanout 發送的消息22222

我們看到,同一個queue 只能有一個人接收到,但是不同的queue可以相互不影響

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章