Exchange fanout方式 一个生产者多个消费者

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ko0491/article/details/90700576

生产者

package com.ghgcn.mq.test01;

import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

public class Producer1 {

	private static String userName = "root";
	private static String password = "root123";
	private static String host = "localhost";
	private static String exchange = "fanout_exchange_test";
	private static String queue = "fanout_queue_test";
	private static int port = 5672;

	public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {

		ConnectionFactory factory = new ConnectionFactory();

		factory.setUsername(userName);
		factory.setPassword(password);
		factory.setHost(host);
		factory.setPort(port);

		// 1.建立连接
		Connection conn = factory.newConnection();
		// 2.建立信道

		Channel channel = conn.createChannel();

		// 3.使用交换器

		channel.exchangeDeclare(exchange, BuiltinExchangeType.FANOUT);
		
		
		//channel.queueDeclare(queue, true, false, false, null);

		byte[] body = "hello fanout ".getBytes();

		channel.basicPublish(exchange, "", MessageProperties.PERSISTENT_TEXT_PLAIN, body);
		System.out.println("发送完成");
		TimeUnit.SECONDS.sleep(10);
		channel.close();
		conn.close();
	}

}

消费者一

package com.ghgcn.mq.test01;

import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;

public class Consumer1 {

	private static String userName = "root";
	private static String password = "root123";
	private static String host = "localhost";
	private static String queue = "fanout_queue_test";
	private static String exchange = "fanout_exchange_test";
	private static int port = 5672;
	public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {

		ConnectionFactory factory = new ConnectionFactory();

		factory.setUsername(userName);
		factory.setPassword(password);
		factory.setHost(host);
		factory.setPort(port);

		// 1.建立连接
		Connection conn = factory.newConnection();
		// 2.建立信道
		Channel channel = conn.createChannel();
		
		
		channel.basicQos(5);
		
		 channel.exchangeDeclare(exchange, BuiltinExchangeType.FANOUT);
		 //获取系统的队列
		 //String queue2 = channel.queueDeclare().getQueue();
		 channel.queueDeclare(queue, true, false, false, null);
		 channel.queueBind(queue, exchange, "");
		 
		 
		channel.basicConsume(queue, new DefaultConsumer(channel) {

			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {
				
				
				
				System.out.println("接收消息1: "+new String(body));
				
				System.out.println("consumerTag  "+consumerTag);
				System.out.println("envelope  "+envelope);
				System.out.println("properties  "+properties);
				
				channel.basicAck(envelope.getDeliveryTag(), false);
				
			}

			@Override
			public void handleConsumeOk(String consumerTag) {
				System.out.println("handleConsumeOk  "+consumerTag);
			}

			@Override
			public void handleCancelOk(String consumerTag) {
				System.out.println("handleCancelOk  "+consumerTag);
			}

			@Override
			public void handleCancel(String consumerTag) throws IOException {
				System.out.println("handleCancel  "+consumerTag);
			}

			@Override
			public void handleShutdownSignal(String consumerTag, ShutdownSignalException sig) {
				System.out.println("handleShutdownSignal  "+consumerTag);
			}

			@Override
			public void handleRecoverOk(String consumerTag) {
				System.out.println("handleRecoverOk  "+consumerTag);

			}
			
			
		});
		
			TimeUnit.SECONDS.sleep(10);
			channel.close();
			conn.close();
	}

}

消费者二

package com.ghgcn.mq.test01;

import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;

public class Consumer2 {

	private static String userName = "root";
	private static String password = "root123";
	private static String host = "localhost";
	private static String queue = "fanout_queue_test2";
	private static String exchange = "fanout_exchange_test";
	private static int port = 5672;
	public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {

		ConnectionFactory factory = new ConnectionFactory();

		factory.setUsername(userName);
		factory.setPassword(password);
		factory.setHost(host);
		factory.setPort(port);

		// 1.建立连接
		Connection conn = factory.newConnection();
		// 2.建立信道
		Channel channel = conn.createChannel();
		
		
		channel.basicQos(5);
		
		 channel.exchangeDeclare(exchange, BuiltinExchangeType.FANOUT);
		//获取系统的队列
		 //String queue2 = channel.queueDeclare().getQueue();
		 channel.queueDeclare(queue, true, false, false, null);
		 channel.queueBind(queue, exchange, "");		 
		 
		channel.basicConsume(queue, new DefaultConsumer(channel) {

			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {
				
				
				
				System.out.println("接收消息2: "+new String(body));
				
				System.out.println("consumerTag  "+consumerTag);
				System.out.println("envelope  "+envelope);
				System.out.println("properties  "+properties);
				
				channel.basicAck(envelope.getDeliveryTag(), false);
				
			}

			@Override
			public void handleConsumeOk(String consumerTag) {
				System.out.println("handleConsumeOk  "+consumerTag);
			}

			@Override
			public void handleCancelOk(String consumerTag) {
				System.out.println("handleCancelOk  "+consumerTag);
			}

			@Override
			public void handleCancel(String consumerTag) throws IOException {
				System.out.println("handleCancel  "+consumerTag);
			}

			@Override
			public void handleShutdownSignal(String consumerTag, ShutdownSignalException sig) {
				System.out.println("handleShutdownSignal  "+consumerTag);
			}

			@Override
			public void handleRecoverOk(String consumerTag) {
				System.out.println("handleRecoverOk  "+consumerTag);

			}
			
			
		});
		
			TimeUnit.SECONDS.sleep(10);
			channel.close();
			conn.close();
	}

}

消费者一与消费者二的队列一定要不一样,(如果一样)不然只有一个消费者能收到消息,另一个收不到消息的

先启动2个消费都,再启动生产都
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ko0491/article/details/90700576
今日推荐