RabbitMQ简单收发,HelloWorld

RabbitMQ简单收发,HelloWorld

    前言                                                                                                                                                                                               


    接触RabbitMQ有一周多的时间了,对RabbitMQ有了自己的一些粗浅的见解,想和大家分享下,本文先讲解简单的RabbitMQ收发操作,没有做任何的处理,参考了官网的资料进行编写,并加入个人的一些见解,不对之处请多多指教。

    一.定义                                                                                                                                                                                            


    RabbitMQ是消息队列,应用程序对应用程序的通信方法,官网中的定义是消息经纪人。也就是说消息中间件,两个应用程序信息传递不是直接去沟通,而是A程序先传给RabbitMQ,B程序再从RabbitMQ中获取,再进行处理。有时我会在想为什么不通过其他的协议形式直接传递,而需要通过这个中间件呢?通过它有什么样的优势.试想下有一种场景,有一堆数据要上传接受处理,如十万或上百万条数据,但你又不需要立刻马上处理他,若果你直接去接受这么大量数据,不说outOfMemory情况,当当处理这些信息那得多耗时,占用系统资源,而使用rabbitMQ就能异步处理这些数据,它可以消费一个后再从队列中取数据,大大节省了响应时间,从而提高系统吞吐量。

    二.角色定义                                                                                                                                                                                     


    在这简单的收发模型中有三个角色分别是生产者(producer)、消息队列(message queue)、消费者(consummer)
    
    a、生产者,主要是发送消息给消息队列

    b、消息队列,它存在于RabbitMQ中,所有的信息都会存放到消息队列中,遵循先进先出的存储方式,当接受到请求,将数据发送出去,如果接到已被消费的ACK(回执),这该消息将从队列中移除。

    c、消费者,从消息队列中获取数据,并返回ACK给RabbitMQ。

    这是简单的收发过程图。

    .预置条件                                                                                                                                                                                    


    使用rabbitMQ需要先安装其服务器
    1.下载Erlang    http://docs.basho.com/riak/1.3.0/tutorials/installation/Installing-Erlang/
    2.下载RabbitMQ  http://www.rabbitmq.com/releases/rabbitmq-server/v3.3.4/rabbitmq-server-3.3.4.exe
   3.下载依赖包 amqp-client-4.0.2.jar slf4j-api-1.7.21.jar slf4j-simple-1.7.22.jar

    .sending                                                                                                                                                                                     

import java.io.IOException;
import java.util.concurrent.TimeoutException;

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

/**
 * 发送消息端
 * @author sibat
 *
 */
public class Send {
	private final static String QUEUE_NAME = "hello";
	public static void main(String[] args) {
		ConnectionFactory factory = new ConnectionFactory();
		factory.setHost("127.0.0.1");
		factory.setPort(5672);
		Connection connection = null;
		Channel channel = null;
		try {
			connection = factory.newConnection();
			channel= connection.createChannel();
			channel.queueDeclare(QUEUE_NAME, false, false,false,null);
			String msg = "I am comming";
			channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
			System.out.println("producer send " + "'"+ msg + "'");
		} catch (IOException | TimeoutException e) {
			e.printStackTrace();
		}finally{
			if (channel != null) {
				try {
					channel.close();
				} catch (IOException | TimeoutException e) {
					e.printStackTrace();
				}
			}
			if (connection != null) {
				try {
					connection.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

    五.Receiving                                                                                                                                                                                     


有一个函数要注意的是channel.basicConsume(),第二个参数为true,意思是自动返回ACK,即queue在传递信息给consumer后就会立马收到ACK,queue不再对这个消息进行存储了。
channel.basicConsume(QUEUE_NAME, true, consumer);

import java.io.IOException;
import java.util.concurrent.TimeoutException;

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.Consumer;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.ShutdownSignalException;

public class Recv {
	private static final String QUEUE_NAME = "hello";
	public static void main(String[] args) throws IOException, TimeoutException, ShutdownSignalException, ConsumerCancelledException, InterruptedException {
		 ConnectionFactory factory = new ConnectionFactory();
		 //设置MabbitMQ所在主机ip或者主机名  
		    factory.setHost("127.0.0.1");
		    factory.setPort(5672);
		    Connection connection = factory.newConnection();
		    Channel channel = connection.createChannel();
		    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
		  //创建队列消费者
		    Consumer consumer = new DefaultConsumer(channel){
		    	@Override
		    	public void handleDelivery(String consumerTag,
		    			Envelope envelope, BasicProperties properties,
		    			byte[] body) throws IOException {
		    		String message = new String(body, "UTF-8");
		            System.out.println(" [x] Received '" + message + "'");
		    	}
		    };
		    channel.basicConsume(QUEUE_NAME, true, consumer);
	}
}

    五.输出结果                                                                                                                                                                                     


发送端:

producer send 'I am comming'


接收端:

 [*] Waiting for messages. To exit press CTRL+C
 [x] Received 'I am comming'











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值