当客户端想要调用服务器的某个方法来完成某项功能时,就可以使用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);
- }
- }
- }
- }