1.docker安装和运行
1.1下载镜像
docker pull rabbitmq:3.7.7-management
1.2运行起来
docker run -d --name myrabbitmq -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit \
-e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.7.7-management
1.3浏览器访问管理页面
地址:
http://192.168.128.128:15672/
用户名和密码均为admin
1.4新增用户和配置Can access virtual hosts
注意不配置Can access virtual hosts=/会连接不上,抛异常
21:30:49.111 [AMQP Connection 192.168.128.128:5672] ERROR com.rabbitmq.client.impl.ForgivingExceptionHandler - An unexpected connection driver error occured
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288)
at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91)
at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:164)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:596)
at java.lang.Thread.run(Thread.java:748)
经过上面操作,demo用户的Can access virtual hosts增加/
2.Java demo
2.1maven依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.4.3</version>
</dependency>
2.2生产者代码
package com.cloud.rabbitmq;
import com.rabbitmq.client.*;
import java.util.Scanner;
public class MessageProducter {
public static final String HOST = "192.168.128.128";
public static final String username = "demo";
public static final String password = "demo";
public static void main(String[] args) throws Exception {
//创建连接工厂,并设置连接信息
ConnectionFactory f = new ConnectionFactory();
f.setHost(HOST);
f.setPort(5672);//可选,5672是默认端口
f.setUsername(username);
f.setPassword(password);
Connection c = f.newConnection();
//建立信道
Channel ch = c.createChannel();
ch.queueDeclare("task_queue", true,false,false,null);
while (true) {
//控制台输入的消息发送到rabbitmq
System.out.print("输入消息: ");
String msg = new Scanner(System.in).nextLine();
//如果输入的是"exit"则结束生产者进程
if ("exit".equals(msg)) {
break;
}
//参数:exchage,routingKey,props,body;
//MessageProperties.PERSISTENT_TEXT_PLAIN持久化的设置
ch.basicPublish("", "task_queue", MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
System.out.println("消息已发送: "+msg);
}
c.close();
}
}
2.2消费者
package com.cloud.rabbitmq;
import com.rabbitmq.client.*;
import java.io.IOException;
public class MessageComsumer {
public static final String HOST = "192.168.128.128";
public static final String username = "demo";
public static final String password = "demo";
public static void main(String[] args) throws Exception {
//连接工厂
ConnectionFactory f = new ConnectionFactory();
f.setHost(HOST);
f.setUsername(username);
f.setPassword(password);
//建立连接
Connection c = f.newConnection();
//建立信道
Channel ch = c.createChannel();
//声明队列,如果该队列已经创建过,则不会重复创建
ch.queueDeclare("task_queue",true,false,false,null);
System.out.println("等待接收数据");
//收到消息后用来处理消息的回调对象
DeliverCallback callback = new DeliverCallback() {
@Override
public void handle(String consumerTag, Delivery message) throws IOException {
String msg = new String(message.getBody(), "UTF-8");
System.out.println("收到: "+msg);
//遍历字符串中的字符,每个点使进程暂停一秒
for (int i = 0; i < msg.length(); i++) {
if (msg.charAt(i)=='.') {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
System.out.println("处理结束");
//参数1:消息标签,参数2:是否确认多条消息
ch.basicAck(message.getEnvelope().getDeliveryTag(),false);
}
};
//消费者取消时的回调对象
CancelCallback cancel = new CancelCallback() {
@Override
public void handle(String consumerTag) throws IOException {
}
};
//一次只能接受一条数据
ch.basicQos(1);
//第二个参数为消息回执,消息确认处理完成,为true为自动确认,只要消息发送到消费者即消息处理成功;为false为,手动发送确认回执,服务器才认为这个消息处理成功
ch.basicConsume("task_queue", false, callback, cancel);
}
}
运行结果: