RabbitMQ RPC

RPCClient

package com.gch.rabbit.demo;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class TestRPCClient {

    private static final String RPC_QUEUE_NAME = "rpc_queue";

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

        ConnectionFactory factory = new ConnectionFactory();//創建工廠
        factory.setHost("localhost");//設置ip
        Connection connection = factory.newConnection();//創建連接
        Channel channel = connection.createChannel();//創建信道

        channel.queueDeclare(RPC_QUEUE_NAME,false, false, false, null);//聲明隊列
        String replyQueueName = channel.queueDeclare().getQueue();//聲明一個臨時的回調隊列

        QueueingConsumer consumer = new QueueingConsumer(channel);//爲這個信道創建一個消費者,用於監聽信道中的回調隊列,獲取結果

        channel.basicConsume(replyQueueName, true, consumer);//把臨時的回調隊列和消費者綁定

        String corrId = java.util.UUID.randomUUID().toString();//創建一個唯一id

        BasicProperties props = new BasicProperties
            .Builder()
            .correlationId(corrId)
            .replyTo(replyQueueName)
            .build(); //設置replyTo和correlationId屬性值

        String message = "發送的請求";
        //發送消息到rpc_queue隊列
        channel.basicPublish("", RPC_QUEUE_NAME, props, message.getBytes());//發送消息並聲名回調方法

        String result;//用於接收返回的結果
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            if (delivery.getProperties().getCorrelationId().equals(corrId)) {
                result = new String(delivery.getBody(),"UTF-8");
                break;
            }
        }
        System.out.println( "result:" + result);

    }

}

RPCServer

package com.gch.rabbit.demo;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class TestRPCServer {

    private static final String RPC_QUEUE_NAME = "rpc_queue";

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

        ConnectionFactory factory = new ConnectionFactory();//創建工廠
        factory.setHost("localhost");//設置ip
        Connection connection = factory.newConnection();//創建連接
        Channel channel = connection.createChannel();//創建信道

        channel.queueDeclare(RPC_QUEUE_NAME,false, false, false, null);//聲明隊列

        channel.basicQos(1);//限制:每次最多給一個消費者發送1條消息

        QueueingConsumer consumer = new QueueingConsumer(channel);//爲信道創建消費者
        channel.basicConsume(RPC_QUEUE_NAME, false, consumer);//把消費者和隊列綁定

        System.out.println("等待請求...");
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();

            //獲取請求中的correlationId屬性值,並將其設置到結果消息的correlationId屬性中
            BasicProperties props = delivery.getProperties();
            BasicProperties replyProps = new BasicProperties
                .Builder()
                .correlationId(props.getCorrelationId())
                .build();

            String callQueueName = props.getReplyTo();//獲取回調隊列名字
            String message = new String(delivery.getBody(),"UTF-8");//獲取接收到的請求內容
            System.out.println("接收到的請求:" + message);

            String response = "處理的結果";//設置返回結果

            channel.basicPublish("", callQueueName, replyProps,response.getBytes());//發送處理後的結果

            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);//後手動發送消息反饋
        }

    }

}


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