RabbiitMQを用いて受信メッセージを簡単に送信する.

8673 ワード

参考:http://blog.csdn.net/lmj623565791/article/details/37607165
            http://blog.csdn.net/anzhsoft/article/details/19563091
            http://www.rabbitmq.com/tutorials/tutorial-one-java.html
https://www.cnblogs.com/LiangSW/p/6218886.html
https://www.cnblogs.com/piaolingzxh/p/5448927.html
例えば、メールを投函したいなら、郵便局と郵便配達人のようにメールを送ってもいいです.そして郵便局からメールを受け取って、受信者にメールを渡します.この過程で、RabbitMQはメールボックスと郵便局と郵便配達人のようになります.RabbitMQはメッセージキューです.プログラムで送信されたメッセージを受信して、対応するメッセージキューに入れます.他のプログラムによっては、メッセージ・キューからデータを取得して、プログラム間の通信を完了することができます.以下では、いくつかの概念を紹介します.
1、生産者
プログラムでメッセージを送る側を生産者と呼びます.

2、メッセージキュー
生産者が送るメッセージを格納するために使用されます.

3、消費者
メッセージ・キューからメッセージを取得する方を消費者と呼びます.


4、Connection
ConnectionはTCP接続で、消費者と生産者はTCPを通じてラビットMQ serverに接続されています.
5.Chanel
チャンネルがConcection上に確立されていますが、頻繁にTCP接続をオフにすると性能に影響がありますので、Chanelを使ってメッセージを送信したり、受信したりします.
(1)メッセージ/受信メッセージを送信するキューは、chanelのqueue Declare()方法によって指定できます.
queue:キューの名前
durable:恒久化するかどうか、キューとリピータはdurable属性があり、デフォルトはfalseです.この時、ラビットmqが再起動すると、キューとリピータは全部消えます.tureに設定して、ここで免れることができます.
exclusive:排外かどうか、trueの場合は今回の接続のみ(同じ接続)にアクセスできるという意味です.
aut Delete:自動的に削除するかどうか、つまり消費者がいない時にリピータを削除するかどうか
 /**
     * Declare an exchange.
     * @see com.rabbitmq.client.AMQP.Exchange.Declare
     * @see com.rabbitmq.client.AMQP.Exchange.DeclareOk
     * @param exchange the name of the exchange
     * @param type the exchange type
     * @param durable true if we are declaring a durable exchange (the exchange will survive a server restart)
     * @param autoDelete true if the server should delete the exchange when it is no longer in use
     * @param arguments other properties (construction arguments) for the exchange
     * @return a declaration-confirm method to indicate the exchange was successfully declared
     * @throws java.io.IOException if an error is encountered
     */
    Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,
                                       Map arguments) throws IOException
(2)chanelのBaic Publish()方法により、メッセージをキューに送ることができます.
exchange:リピータは、空に入ることができます.「」はデフォルトのリピータです.
ルートキーは、ルートキーのリピータによって、どの消費者キューにメッセージを送信するかを決定します.
メッセージのバイト形式
他のパラメータを参照してください.https://www.cnblogs.com/piaolingzxh/p/5448927.html
    public void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException {
        this.delegate.basicPublish(exchange, routingKey, props, body);
    }

    public void basicPublish(String exchange, String routingKey, boolean mandatory, BasicProperties props, byte[] body) throws IOException {
        this.delegate.basicPublish(exchange, routingKey, mandatory, props, body);
    }

    public void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) throws IOException {
        this.delegate.basicPublish(exchange, routingKey, mandatory, immediate, props, body);
    }
6.Exchange
リピータ、生産者が送信するメッセージは、一般的に消費者のキューに直接渡されるのではなく、リピータを中継として使用し、生産者はまず、メッセージをリピータに送信し、リピータは、ルーティング規則に従って、どのキューにメッセージを送信するかを決定する.リピータタイプはdirect、topic、fanout、headersがあります.
以下は簡単な例であり、Senderはメッセージキューにメッセージを送信し、Receiverはメッセージキューからメッセージを取得し、リピータは空のリピータ(デフォルトリピータ、directタイプ)を使用して、キュー名を転送する必要があり、リピータはキュー名をルートキーとして送信し、対応するキューにメッセージを送信する.
1.送信者クラスを作成する
package com.rabbit.test1;

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

/**
 * RabbitMQ    
 * Sender
 */
public class Sender {
    //      
    private final static String QUEUE_NAME = "queue-test";

    public static void main(String[] argv) throws java.io.IOException {

        //1.    ConnectionFactory    connectionFactory
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //2.  connectionFactory  RabbitMQ  IP   
        connectionFactory.setHost("localhost");
        //      connectionFactory.setPort(5762); //    
        //      connectionFactory.setUsername("admin");//   
        //      connectionFactory.setPassword("admin");//  
        //3.  connectionFactory      connection
        Connection connection = connectionFactory.newConnection();
        //4.  connection      channel
        Channel channel = connection.createChannel();
        //5.  channel      
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        //       
        String message = "hello world!";
        //6.  channel        ,         ,       (      ,   direct)
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println(" " + QUEUE_NAME + "        :" + message);
        //7.    
        channel.close();
        //8.    
        connection.close();
    }
}
2.受取人
package com.rabbit.test1;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;

/**
 * RabbitMQ    
 * Receiver
 *
 */
public class Receiver {
    //      
    private final static String QUEUE_NAME = "queue-test";

    public static void main(String[] argv) throws java.io.IOException, java.lang.InterruptedException {
        //1.    ConnectionFactory    connectionFactory
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //2.  connectionFactory  RabbitMQ  IP   
        connectionFactory.setHost("localhost");
        //3.  connectionFactory      connection
        Connection connection = connectionFactory.newConnection();
        //4.  connection      channel
        Channel channel = connection.createChannel();
        //5.  channel    
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        //          
        //6.         consumer,   channel  
        QueueingConsumer consumer = new QueueingConsumer(channel);
        //7. channel     
        channel.basicConsume(QUEUE_NAME, true, consumer);
        while (true) {
            // consumer         ,nextDelivery       ,        ,   
            Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("    " + QUEUE_NAME + "    :" + message);
        }

    }
}
3.Senderを起動し、メッセージキューに情報を追加する
使用RabbitMQ简单发送接收消息_第1张图片
RabbiitMQの管理インターフェースにアクセスすると、自動的にQue-testのキューが作成され、メッセージが表示されます.
使用RabbitMQ简单发送接收消息_第2张图片
Recieverを起動して、受信者がメッセージキューからメッセージを取得し、コンソールに印刷するのが見えます.
使用RabbitMQ简单发送接收消息_第3张图片