RabbitMQ發送接收消息(隊列式+主題式)(main方法實現)

隊列式:一條消息只能被一個消費者消費(發佈者、消費者)

主題式:一條消息可以被每一個消費者消費(發佈者、訂閱者)

 

1.隊列式

一個消費者消費一個隊列的消息

兩個(或多個)消費者消費一個隊列的消息(每條消息只能被消費一次)

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.主題式

消息發送到轉發器,然後轉發到每個消費者的隊列(一條消息被每一個訂閱者消費)

 

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 <br>
 * 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);
    }
    

}

 

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