RabbitMQ简单入门,实现一次消息的发送及消费。
1、什么是mq:
MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。本文主要介绍RabbitMq。
关于消息队列的详细介绍有写的比较好的几篇文章请参阅,可自行百度,本次主要是从代码来实现一次消息得发送及消费:
《Java帝国之消息队列》
《一个故事告诉你什么是消息队列》
《到底什么时候该使用MQ》
2、
安装rabbitmq
先安装 otp_win64_22.1.exe
链接:https://pan.baidu.com/s/1qsodmJAYks8NwP8Gdp_7yw
提取码:1234
再安装 rabbitmq-server-3.7.18.exe
链接:https://pan.baidu.com/s/1LHX5CL9FkifQYB-BNVPZHg
提取码:1234
安装步骤可自行百度。
安装完成后可以到服务看,rabbit是否启动。启动了,打开浏览器
安装完成后到Program Files\RabbitMQ Server\rabbitmq_server-3.7.18\sbin目录下执行cmd
-----创建账户及密码
rabbitmqctl.bat add_user <username> <password>
-----设置管理员角色
rabbitmqctl.bat set_user_tags <username> administrator
-----顺便打开读写等权限,没有权限,消息队列信息无法发送
rabbitmqctl set_permissions -p / <username> ".*" ".*" ".*"
生产者代码:
package com.mq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import org.springframework.beans.factory.annotation.Value;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class RabbitProducer {
private static String EXCHANGE_NAME="exchange_demo";
private static String ROUTING_KEY="routingkey_demo";
private static String QUEUE_NAME="queue_demo" ;
private static String IP_ADDRESS="localhost";
private static int PORT=5672;
public static void main(String arg[]) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(IP_ADDRESS);
factory.setPort(PORT);
factory.setUsername("epoint");
factory.setPassword("epoint");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME,"direct",true,false,null);
channel.queueDeclare(QUEUE_NAME,true,false,false,null);
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,ROUTING_KEY);
String message="Hello World";
channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());
channel.close();
connection.close();
}
}
执行main方法之后,可以到rabbitmq的后台管理中去看。队列里会多一个消息
消费者代码:
package com.mq;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class RabbitConsumer {
private static String QUEUE_NAME = "queue_demo";
private static String IP_ADDRESS="127.0.0.1";
private static int PORT=5672;
public static void main(String arg[]) throws IOException, TimeoutException {
Address[] addresses = new Address[]{
new Address(IP_ADDRESS, PORT)
};
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(IP_ADDRESS);
factory.setPort(PORT);
factory.setUsername("epoint");
factory.setPassword("epoint");
Connection connection = factory.newConnection(addresses);
Channel channel = connection.createChannel();
channel.basicQos(64);
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("接收消息" + new String(body));
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
channel.basicConsume(QUEUE_NAME, consumer);
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
channel.close();
connection.close();
}
}
执行之后:会输出:接收消息Hello World
执行main方法之后,可以到rabbitmq的后台管理中去看。队列里消息没有了