rabbitMQ小试牛刀
RabbitMQ简介
RabbitMQ是一个消息代理,它接受和转发消息。它可以视为邮局:当您将要发布的邮件放在邮箱中时,您可以确定邮件先生或Mailperson女士最终会将邮件发送给您的收件人。在这个比喻中,RabbitMQ是邮箱,邮局和邮递员。
RabbitMQ和邮局之间的主要区别在于它不处理纸张,而是接受、存储和转发二进制blob数据——消息。
术语解释
- 生产者:发送消息的程序
- 队列:rabbitMq中的邮箱的名称
- 消费者:接收消息
生产者、消费者和代理不必驻留在同一主机上;实际上在大多数应用中他们没有。
通常使用rabbitmq是为了解耦,为了不要A程序直接调用B程序并且A程序不依赖于B的响应(调用B时,如果失败不会影响A的流程)。
点对点模式示例
架构图
[P] 生产者 -> [队列] RabbitMQ -> [C] 消费者
代码实现
首先在pom.xml
中引入依赖:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
RabbitMQ连接类
/**
* rabbitMq连接
*
* @author lawt
* @date 2018-07-30 9:31
*/
public class ConnectionRabbitUtil {
/**
* 获取rabbitMQ的连接
*/
public static Connection getConnection() throws Exception {
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("127.0.0.1");
//端口
factory.setPort(5672);
//用户名、密码(这里我们使用的是guest用户,在真正的开发使用过程中建议add user)
factory.setUsername("guest");
factory.setPassword("guest");
// 通过工程获取连接
return factory.newConnection();
}
}
生产消息
/**
* 生产消息
*
* @author lawt
* @date 2018-07-30 9:37
*/
public class Provider {
private static final String QUEUE_NAME = "my_queue";
public static void main(String[] args) throws Exception {
// 获取到连接以及mq通道
Connection connection = ConnectionRabbitUtil.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(" 消费生产消息= '" + message + "'");
//关闭通道和连接
channel.close();
connection.close();
}
}
消费消息
/**
* 消费消息
*
* @author lawt
* @date 2018-07-30 9:37
*/
public class Consumer {
private static final String QUEUE_NAME = "my_queue";
public static void main(String[] args) throws Exception {
Connection connection = ConnectionRabbitUtil.getConnection();
//创建通道
Channel channel = connection.createChannel();
//申明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
QueueingConsumer consumer=new QueueingConsumer(channel);
//监听队列QUEUE_NAME,autoAck=true
channel.basicConsume(QUEUE_NAME, true, consumer);
while (true){
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" 消费端接收到消息= '" + message + "'");
}
}
}
这样一个很简单的java+rabbitmq就用起来了。