概念:
-
P:生产者,也就是要发送消息的程序
-
C:消费者:消息的接收者,会一直等待消息到来
-
queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从 其中取出消息
生产者 producer:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 发送消息
*/
public class Producer_HelloWorld {
public static void main(String[] args) throws IOException, TimeoutException {
/**
* 1、创建连接工厂
* 2、设置参数
* 3、创建连接 Connection
* 4、创建Channel
* 5、创建队列
* 6、发送消息
* 7、释放资源
*/
// 1、创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2、设置参数
// ip 默认值 localhost, 192.168.16.62 :启动MQ服务器的ip
factory.setHost("192.168.16.62");
factory.setPort(5672); // 端口 默认值 5672
factory.setVirtualHost("/"); //虚拟机 默认值 /
factory.setUsername("guest"); // 用户名 默认值 guest
factory.setPassword("guest"); // 密码 默认值 guest
// 3、创建连接 Connection
Connection connection = factory.newConnection();
// 4、创建Channel
Channel channel = connection.createChannel();
// 5、创建队列
/**
queueDeclare(
String queue, //队列名称
boolean durable, //是否持久化, 当mq重启后,还在
//是否独占,只能有一个消费者监听此队列;当Connection关闭时,是否删除队列
boolean exclusive,
boolean autoDelete, // 是否自动删除。当没有Consumer时自动删除
Map<String, Object> arguments //参数信息,删除的信息
)
*/
//如果没有名称为 hello_world 的队列,则会创建
channel.queueDeclare("hello_world", true, false, false, null);
// 6、发送消息
/**
* basicPublish(
String exchange, // 交换机名称。简单模式下使用默认交换机:""
String routingKey, // 路由名称
BasicProperties props, // 配置信息
byte[] body // 发送消息数据
)
*/
String body = "hello world";
channel.basicPublish("","hello_world",null,body.getBytes());
// 7、释放资源
channel.close();
connection.close();
}
}
消费者 consumer:
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 接收消息
*/
public class Consumer_HelloWorld {
public static void main(String[] args) throws IOException, TimeoutException {
/**
* 1、创建连接工厂
* 2、设置参数
* 3、创建连接 Connection
* 4、创建Channel
* 5、创建队列
* 6、接收消息
*/
// 1、创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2、设置参数
// ip 默认值 localhost, 192.168.16.62 :启动MQ服务器的ip
factory.setHost("192.168.16.62");
factory.setPort(5672); // 端口 默认值 5672
factory.setVirtualHost("/"); //虚拟机 默认值 /
factory.setUsername("guest"); // 用户名 默认值 guest
factory.setPassword("guest"); // 密码 默认值 guest
// 3、创建连接 Connection
Connection connection = factory.newConnection();
// 4、创建Channel
Channel channel = connection.createChannel();
// 5、创建队列
/**
queueDeclare(
String queue, //队列名称
boolean durable, //是否持久化, 当mq重启后,还在
boolean exclusive,
//是否独占,只能有一个消费者监听此队列;当Connection关闭时,是否删除队列
boolean autoDelete, // 是否自动删除。当没有Consumer时自动删除
Map<String, Object> arguments //参数信息,删除的信息
)
*/
//如果没有名称为 hello_world 的队列,则会创建
channel.queueDeclare("hello_world", true, false, false, null);
//6、接收消息
/*
basicConsume(
String queue, // 队列名称
boolean autoAck, // 是否自动确认
Consumer callback // 回调对象
)
*/
Consumer consumer = new DefaultConsumer(channel){
/*
回调方法,当收到消息后,会自动执行该方法
handleDelivery(
String consumerTag, // 标识
Envelope envelope, // 获取一些信息,交换机,路由key
AMQP.BasicProperties properties, //配置信息
byte[] body) // 数据
*/
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
System.out.println("consumerTag : "+consumerTag);
System.out.println("envelope : "+envelope);
System.out.println("properties : "+properties);
System.out.println("body : "+ new String(body));
}
};
channel.basicConsume("hello_world",true,consumer);
}
}
结果: