RabbitMQ的学习(二):简单的java demo实现RabbitMQ的发送与接收

通过第一章已经很轻松地实现了RabbitMQ的安装和启动,第二章开始最简单的java demo学习,一层一层深入了解RabbitMQ的牛逼之处,期间肯定也会碰到很多问题,这些问题,将会收集起来,最后面去解决同时也会写相关的文章。

一、项目相关jar包导入:

新建一个maven工程,pom.xml中引入:

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.5.1</version>
</dependency>

二、写一个发布者:

步骤:

客户端:

  1. 创建一个连接工厂,用于生成与RabbitMQ进行连接
  2. 根据这个连接工厂设置RabbitMQ所在的主机,账号密码和端口号等(默认情况下就不需要账号密码和端口了)
  3. 由连接工厂生成与RabbitMQ的连接
  4. 创建一条通道,然后由这个通道声明一个队列
  5. 给这个队列添加信息
  6. 添加完毕后,关闭通道。

以下是客户端的相关代码:

package rabbitmqDemo.demo1.client;

import java.io.IOException;

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

public class Producer_demo1 {

	public final static String QUEUENAME="mq.test_demo1";//队列名称
	public final  static String   HOST="localhost";   //主机名
	public final static  String USERNAME="guest";   
	public final static  String PASSWORD="guest";   
	public final static  String EXCHANGE_NAME="";   //交换机名(以后会学,不用太在意这个)
	public static void main(String[] args) {
		ConnectionFactory factory=new ConnectionFactory();//创建一个连接工厂,用于生成与RabbitMQ进行连接
		factory.setHost(HOST);//根据这个连接工厂设置RabbitMQ所在的主机,账号密码和端口号等(默认情况下就不需要账号密码和端口了)
		factory.setUsername(USERNAME);
		factory.setPassword(PASSWORD);
		try {
			Connection connection = factory.newConnection();// 3. 由连接工厂生成与RabbitMQ的连接
			Channel newChannel = connection.createChannel();//4. 创建一条通道
			newChannel.queueDeclare(QUEUENAME,false,false,true,null);//由这个通道声明一个队列
			String sendMessage="你好,我是生产者!";//要发送的消息
			newChannel.basicPublish(EXCHANGE_NAME, QUEUENAME, null, sendMessage.getBytes());
			System.out.println("消息已发送,去消费端控制台看看");
			newChannel.close();//关闭通道
	        connection.close();//关闭连接
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

三、写一个消费者

步骤:

  1. 与上面的生产者一样,一直到创建好通道为止;
  2. 通道创建好后,关联相关的队列
  3. 根据关联的队列,创建消费者对象,实现handleDelivery()方法,一直监听以至有消息时打印出消息。

相关代码:

package rabbitmqDemo.demo1.consumer;

import java.io.IOException;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class Consumer_demo1 {

	
	public final static String QUEUENAME="mq.test_demo1";//队列名称
	public final  static String   HOST="localhost";   //主机名
	public final static  String USERNAME="guest";   
	public final static  String PASSWORD="guest";   
	public final static  String EXCHANGE_NAME="";   
	
	
	public static void main(String[] args) {
		ConnectionFactory factory=new ConnectionFactory();//创建一个连接工厂,用于生成与RabbitMQ进行连接
		factory.setHost(HOST);//根据这个连接工厂设置RabbitMQ所在的主机,账号密码和端口号等(默认情况下就不需要账号密码和端口了)
		factory.setUsername(USERNAME);
		factory.setPassword(PASSWORD);
		Connection connection;
		try {
			connection = factory.newConnection();
			Channel newChannel = connection.createChannel();//4. 创建一条通道,通道创建好后,关联相关的队列 
			newChannel.queueDeclare(QUEUENAME, false, false, true, null);
			Consumer consumer =new DefaultConsumer(newChannel){
				//重写handleDelivery方法
				@Override
				public void handleDelivery(String consumerTag, Envelope envelope,
						AMQP.BasicProperties properties, byte[] body)
								throws IOException {
					String message = new String(body, "UTF-8");
					System.out.println("消费端收到消息:  '" + message + "'");
				}
			};
			//自动回复队列应答 -- RabbitMQ中的消息确认机制
			newChannel.basicConsume(QUEUENAME, true, consumer);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

运行后得到信息:
生产者:
在这里插入图片描述
消费者:
在这里插入图片描述

四、至此,一个简单的java demo就写完了。但光写了不行,从这个小栗子中我们还是会有很多疑问,比如:

对于生产者端:

  • RabbitMQ中的通道,到底是什么意思,它和队列又有着什么关系?
  • 生产者发送信息的时候,为什么使用通道这个类的方法去发送,而不是使用队列这个类去发送?
  • 什么是交换机?RabbitMQ的交换机有几种?不同的交换机如何使用?

消费者端:

  • Consumer的handleDelivery方法有什么作用?
  • 这个方法:new Channel.basicConsume(QUEUENAME, true, consumer);为什么运行这个方法的时候,服务器会一直监听?是不是隐藏着实现while(true)之类的代码?
  • AMQP是什么,这个类有什么作用?

带着这些问题,我们以后会慢慢去学,去弄懂!

猜你喜欢

转载自blog.csdn.net/shenhaiyushitiaoyu/article/details/84259541