系统拆分解耦利器之消息队列---RabbitMQ-Helloworld

[一曲广陵不如晨钟暮鼓]

本文开始,我们将介绍RabbitMQ的基本使用方法。在官方文档中,教程分为6个章节,因此,我们也准备使用6个篇幅来介绍其基本使用方法。好了,马上开始正文部分吧!

准备工作:

操作系统:window 7 x64 

其他软件:eclipse mars,jdk7,maven 3

--------------------------------------------------------------------------------------------------------------------------------------------------------

1.介绍

RabbitMQ是一个消息代理。其核心思想是:接受并转发消息。你可以将其理解为一个邮局:当你将消息放入到邮箱后,你非常的确定快递员最终将会将这封信送给收件人。用这个模型来作为比喻,RabbitMQ就是一个邮箱,一个邮局,一个快递员的功能的集合。

RabbitMQ与这个集合最大区别是:RabbitMQ不会去处理真正的新建,而是接受,存储,转发二进制的数据----在RabbitMQ的定义中,称之为message。

下面我们来介绍一些在RabbitMQ中常见的术语:

A.Producing:这个概念非常简单,就是发送消息。一个专门用来发送消息的程序,在此称之为producer(生产者)。我们使用下面的图形表示:


B.Queue:这个概念类似邮箱。其依存在RabbitMQ内部。尽管消息是通过RabbitMQ在我们的应用中进行传输,但实际上,message只能被存储在queue中。queue不受任何限制,其可以存储我们想存储的任何消息(本质是一个无限的缓存)。很多producer(生产者)可以通过同一个队列发送消息,很多consumer(消费者)可以通过同一个队列接受消息。一个队列可以通过下面的图形表示:


C.Consumeing:这个概念类似于接受。consumer是一个等待接受消息的程序。我们使用下面的图形表示:


注:在练习环境,生产环境等条件下,producer,consumer,broker不用部署在同一台机器上。实际应用中,也确实如此。

2.Java入门示例。

在本节,我们使用Java来编写两个主程序。一个是producer:简单的发送消息。一个是consumer:接受并打印消息。按照上面的图形表述,我们将模型设置为如下:


1>创建rabbitmq01工程,结构如下:


2.修改pom文件,具体内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.csdn.ingo</groupId>
	<artifactId>rabbitmq01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>rabbitmq-1</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.rabbitmq</groupId>
			<artifactId>amqp-client</artifactId>
			<version>3.4.2</version>
		</dependency>
	</dependencies>
</project>
3.创建Sender文件,具体内容如下:
package com.csdn.ingo.rabbitmq_1;

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

public class Sender {
	// 队列名称
	private final static String QUEUE_NAME = "hello";

	public static void main(String[] argv) throws java.io.IOException {
		/**
		 * 创建连接连接到MabbitMQ
		 */
		ConnectionFactory factory = new ConnectionFactory();
		// 设置MabbitMQ所在主机ip或者主机名
		 factory.setHost("localhost");
		// 创建一个连接
		Connection connection = factory.newConnection();
		// 创建一个频道
		Channel channel = connection.createChannel();
		// 指定一个队列
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		// 发送的消息
		String message = "hello world!";
		// 往队列中发出一条消息
		channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
		System.out.println(" [x] Sent '" + message + "'");
		// 关闭频道和连接
		channel.close();
		connection.close();
	}
}
4.创建Receiver文件,具体内容如下:

package com.csdn.ingo.rabbitmq_1;

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

public class Receiver {
	//队列名称  
    private final static String QUEUE_NAME = "hello";  
  
    public static void main(String[] argv) throws java.io.IOException,  
            java.lang.InterruptedException  {  
        //打开连接和创建频道,与发送端一样  
        ConnectionFactory factory = new ConnectionFactory();  
        factory.setHost("localhost");  
        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");  
          
        //创建队列消费者  
        QueueingConsumer consumer = new QueueingConsumer(channel);  
        //指定消费队列  
        channel.basicConsume(QUEUE_NAME, true, consumer);  
        while (true)  
        {  
            //nextDelivery是一个阻塞方法(内部实现其实是阻塞队列的take方法)  
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();  
            String message = new String(delivery.getBody());  
            System.out.println(" [x] Received '" + message + "'");  
        }  
    }  
}

5.测试办法:先运行Receiver,再运行Sender。示例如下:

注:需要首先启动rabbitmq-server,window条件下是开机启动的,如提示server未启动,可以在安装目录下输入“rabbitmq-server start”启动



--------------------------------------------------------------------------------------------------------------------------------------------------------

至此,系统拆分解耦利器之消息队列---RabbitMQ-Helloworld 结束


参考资料:

官方文档:http://www.rabbitmq.com/tutorials/tutorial-one-java.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值