rabbitMQ学习笔记(七) RPC 远程过程调用

当客户端想要调用服务器的某个方法来完成某项功能时,就可以使用rabbitMQ支持的PRC服务。

其实RPC服务与普通的收发消息的区别不大, RPC的过程其实就是  

客户端向服务端定义好的Queue发送消息,其中携带的消息就应该是服务端将要调用的方法的参数 ,并使用Propertis告诉服务端将结果返回到指定的Queue。

示例:


package com.zf.rabbitmq07;

import java.io.IOException;

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.ConsumerCancelledException;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.ShutdownSignalException;

public class RPCServer {
	
	public static final String RPC_QUEUE_NAME = "rpc_queue";
	
	public static String sayHello(String name){
		return "hello " + name ;
	}
	
	public static void main(String[] args) throws IOException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
		
		ConnectionFactory connFac = new ConnectionFactory() ;
		connFac.setHost("localhost");
		
		Connection conn = connFac.newConnection() ;
		
		Channel channel = conn.createChannel() ;
		
		channel.queueDeclare(RPC_QUEUE_NAME, false, false, false, null) ;
		
		QueueingConsumer consumer = new QueueingConsumer(channel);
		
		channel.basicConsume(RPC_QUEUE_NAME, false , consumer) ;
		
		while(true){
			System.out.println("服务端等待接收消息..");  
			Delivery deliver = consumer.nextDelivery() ;
			System.out.println("服务端成功收到消息..");
			BasicProperties props =  deliver.getProperties() ;
			
			String message = new String(deliver.getBody() , "UTF-8") ;
			
			String responseMessage = sayHello(message) ;
			
			BasicProperties responseProps = new BasicProperties.Builder()
			.correlationId(props.getCorrelationId())  
			.build() ;
			
			//将结果返回到客户端Queue
			channel.basicPublish("", props.getReplyTo() , responseProps , responseMessage.getBytes("UTF-8") ) ;
		 	
			//向客户端确认消息
			channel.basicAck(deliver.getEnvelope().getDeliveryTag(), false);
			System.out.println("服务端返回消息完成..");
		}
		
	}

}

package com.zf.rabbitmq07;

import java.io.IOException;
import java.util.UUID;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import com.rabbitmq.client.ShutdownSignalException;

public class RPCClient {

	public static final String RPC_QUEUE_NAME = "rpc_queue";

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

		ConnectionFactory connFac = new ConnectionFactory() ;
		connFac.setHost("localhost");
		Connection conn = connFac.newConnection() ;
		Channel channel = conn.createChannel() ;

		//响应QueueName ,服务端将会把要返回的信息发送到该Queue
		String responseQueue = channel.queueDeclare().getQueue() ;

		String correlationId = UUID.randomUUID().toString() ;

		BasicProperties props = new BasicProperties.Builder()
		.replyTo(responseQueue)
		.correlationId(correlationId)
		.build();

		String message = "is_zhoufeng";
		channel.basicPublish( "" , RPC_QUEUE_NAME , props ,  message.getBytes("UTF-8"));

		QueueingConsumer consumer = new QueueingConsumer(channel)	;

		channel.basicConsume( responseQueue , consumer) ;

		while(true){
			
			Delivery delivery = consumer.nextDelivery() ;
			
			if(delivery.getProperties().getCorrelationId().equals(correlationId)){
				String result = new String(delivery.getBody()) ;  
				System.out.println(result);
			}
			
		}
	}

}



你可能感兴趣的:(rabbitMQ学习笔记(七) RPC 远程过程调用)