简单队列
1.1模型
p:消息生产者
红色:消息队列
c:消费者
3个对象;生产者,队列,消费者。生产者会生产消息,消息通过消息队列,消费者从消息队列获取消息。
1.2获取mq连接
导入maven包
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
获取连接工具类
public class ConnectionUtil {
/**
* 取mq连接
*
* @return
* @throws IOException
* @throws TimeoutException
*/
public static Connection getConnection() throws IOException , TimeoutException {
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("ip");
//端口
factory.setPort(port);
//设置账号信息,用户名、密码、vhost
factory.setVirtualHost("/vhost_name");
factory.setUsername("admin");
factory.setPassword("password");
// 通过工程获取连接
return factory.newConnection();
}
}
1.3生产者发生数据
public class Send {
private final static String QUEUE_NAME = "test_simple_queue";
public static void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionUtil.getConnection();
// 从连接中创建通道
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();
}
}
验证是否发生成功:到mq的管理页面的Queues中查看
点击名字后里面的getmessage,可以看到消息即为发生成功
1.4消费者消费消息
public class Recv {
private final static String QUEUE_NAME = "test_simple_queue";
public static void main(String[] argv) throws Exception {
// 获取到连接
Connection connection = ConnectionUtil.getConnection();
// 从连接中创建通道
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//定义一个消费者
DefaultConsumer consumer = new DefaultConsumer(channel){
//获取到达的消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
super.handleDelivery(consumerTag, envelope, properties, body);
String msg = new String(body,"utf-8");
System.out.println("rec:"+msg);
}
};
//监听队列
channel.basicConsume(QUEUE_NAME,true,consumer);
}
}
简单队列的不足:
- 耦合性高,生产者–消费者要一一对应(不支持多个消费者消费队列中的消息)
- 队列名变更,的同步变更
接下来介绍工作队列:多个消费者消费一个队列:工作队列 https://blog.csdn.net/wsdfym/article/details/101646664