RabbitMQ发送接收消息(队列式+主题式)(main方法实现)

队列式:一条消息只能被一个消费者消费(发布者、消费者)

主题式:一条消息可以被每一个消费者消费(发布者、订阅者)

 

1.队列式

一个消费者消费一个队列的消息

RabbitMQ发送接收消息(队列式+主题式)(main方法实现)_第1张图片

两个(或多个)消费者消费一个队列的消息(每条消息只能被消费一次)

RabbitMQ发送接收消息(队列式+主题式)(main方法实现)_第2张图片

1.1  消息发送


import java.io.IOException;
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;

/**
 *  生产者
 */
public class ComProducer {

    public static String QUEUE_NAME = "aque";
    public static String EXCHANGE_NAME = "aexc";
    public static String ROUTING_KEY = "aaa";
    
    public static void main(String[] args) throws IOException, TimeoutException {
        
        
        ConnectionFactory cf = new ConnectionFactory();
        cf.setHost("127.0.0.1");
        cf.setPort(5672);
        cf.setUsername("guest");
        cf.setPassword("guest");
        
        //建立连接
        Connection conn = cf.newConnection();
        //创建消息通道
        Channel channel = conn.createChannel();

        //消息内容
        String msg = " hello world! ";
        
        //创建 队列
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        //创建路由
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
        //绑定路由与队列
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
        
        //发送消息 
        for (byte i = 0; i < 10; i++) {
            String m = i+msg;
            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY , null, m.getBytes());
            
        }
        
        channel.close();
        conn.close();

    }

}

1.2  消息接收


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

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;

/**
 * 消费者
 */
public class ComConsumer {

    public static void main(String[] args) throws IOException, TimeoutException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
        
        
        ConnectionFactory cf = new ConnectionFactory();
        cf.setHost("127.0.0.1");
        cf.setPort(5672);
        cf.setUsername("guest");
        cf.setPassword("guest");
        
        //建立连接
        Connection conn = cf.newConnection();
        //创建消息通道
        Channel channel = conn.createChannel();
        
        
        //创建消费者,并接受消息
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                    throws IOException {
                String msg = new String(body, "UTF-8");
                System.out.println("接收消息:"+msg);
               
            }
        };
        channel.basicConsume(ComProducer.QUEUE_NAME, true, consumer);
        

    }
    
  
}

 

2.主题式

消息发送到转发器,然后转发到每个消费者的队列(一条消息被每一个订阅者消费)

RabbitMQ发送接收消息(队列式+主题式)(main方法实现)_第3张图片

 

2.1 发布消息

ROUTING_KEY = "topic_key.aaa"


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

import com.google.common.base.Strings;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 *  发布者
 */
public class ComPublisher {
    

    public static String EXCHANGE_NAME = "topic_exc";
    public static String ROUTING_KEY = "topic_key.aaa";
    
    public static void main(String[] args) throws IOException, TimeoutException {
    
        
        //创建连接连接到MabbitMQ
        ConnectionFactory factory = new ConnectionFactory();
        // 设置MabbitMQ所在主机ip或者主机名
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        // 创建一个连接
        Connection connection = factory.newConnection();
        // 创建消息通道
        Channel channel = connection.createChannel();
        // 指定转发——广播
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
        for(int i=0;i<10;i++){
            
            // 发送的消息
            String message =i+" Hello World!";
            //参数1:exchange name
            //参数2:routing key
            channel.basicPublish(EXCHANGE_NAME,  ROUTING_KEY, null, message.getBytes());
        }
        // 关闭频道和连接
        channel.close();
        connection.close();
    }


}

2.2 订阅者1

ROUTING_KEY = "topic_key.aaa";


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

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

/**
 *  订阅者
 */
public class ComSubscribe {
    
    public static void main(String[] args) throws IOException, InterruptedException, TimeoutException {
        

        String ROUTING_KEY = "topic_key.aaa";
        
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        // 打开连接和创建频道,与发送端一样
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
 

        // 声明一个随机队列
        String queueName = channel.queueDeclare().getQueue();
 
        channel.queueBind(queueName, ComPublisher.EXCHANGE_NAME, ROUTING_KEY);
        
        // 创建队列消费者
        Consumer consumer = new DefaultConsumer(channel) {
              @Override
              public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println( envelope.getRoutingKey() + " : " + message );

              }
            };
        channel.basicConsume(queueName, true, consumer);
            
            
    }
    
}

2.3 订阅者2

ROUTING_KEY = "topic_key.*";// 或 "topic_key.#"


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

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

/**
 * 
 * @author lyb 
* 2018年7月13日 下午6:29:45 */ public class ComSubscribe2 { public static void main(String[] argv) throws IOException, InterruptedException, TimeoutException { String ROUTING_KEY = "topic_key.*";// 或 "topic_key.#" ConnectionFactory factory = new ConnectionFactory(); factory.setHost("127.0.0.1"); // 打开连接和创建频道,与发送端一样 Connection connection = factory.newConnection(); final Channel channel = connection.createChannel(); // // 声明一个随机队列 // String queueName = channel.queueDeclare().getQueue(); // 声明队列 String QUEUE_NAME = "topic_queque"; channel.queueDeclare(QUEUE_NAME, true, false, false, null); channel.queueBind(QUEUE_NAME, ComPublisher.EXCHANGE_NAME, ROUTING_KEY); // 创建队列消费者 final Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println( envelope.getRoutingKey() + " : " + message ); } }; channel.basicConsume(QUEUE_NAME, true, consumer); } }

 

你可能感兴趣的:(RabbitMQ)