概述
(内容均来自RabbitMQ官网:https://www.rabbitmq.com/tutorials/tutorial-one-java.html)
下载、安装RabbitMQ服务器:https://www.rabbitmq.com/#getstarted。RabbitMQ是基于erlang语言编写的,所以在安装RabbitMQ服务器的时候需要先安装erlang的依赖。具体RabbitMQ服务器和erlang的依赖版本在官网上都有说明:https://www.rabbitmq.com/news.html#2021-07-05T14:00:00+00:00
RabbitMQ遵循了AMQP协议(Advanced Message Queuing Protocol),我们只需要导入对应的AMQP的客户端就能连接、操作RabbitMQ的服务器。(下面为maven依赖)
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>
HelloWorld
(一下所有的操作都是基于已经有RabbitMQ服务器在运行的基础之上跑的)
为了方便,我们创建一个简单的RabbitMQ客户端的连接工厂
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 RabbitMQUtils {
private static ConnectionFactory connectionFactory;
static {
connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.137.1");//RabbitMQ所在服务器的ip
connectionFactory.setPort(5672);//端口号
connectionFactory.setVirtualHost("/ems");//虚拟主机名(自己可以在后台创建,也可以使用默认的:/)
connectionFactory.setUsername("tianluhua");//用户(可以在后台创建,可也一在后台创建。系统默认账号:guest,密码:guest)
connectionFactory.setPassword("123456");//密码
}
public static Connection getConnection() {
try {
return connectionFactory.newConnection();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
return null;
}
public static void closeChannelAndConnection(Connection connection, Channel channel) {
try {
if (channel != null) channel.close();
if (connection != null) connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
HelloWorld模式非常简单,一个生产者,一个队列,一个消费者(需要注意的是,这里没有提到交换机,并不是说没有使用到交换机,而是使用系统默认的交换机)
图例
接下来我们要做两件时间就能完成连接到RabbitMQ服务器,然后发送、接受消息
1.发送消息
import com.booyue.tlh.utils.RabbitMQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.io.IOException;
public class Producer{
//队列名称
public static final String QUEUE_NAME = "hello";
//需要发送的消息
private static final String MESSAGE = "Hello RabbitMQ";
public static void main(String[] args) throws IOException, InterruptedException {
//从工具类获取连接
Connection connection = RabbitMQUtils.getConnection();
//获取通道
Channel channel = connection.createChannel();
//声明一个名字为hello的队列。这一步执行完之后,在RabbitMQ服务器上就会创建一个对应的Queue
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//往名字为“hello”的队列中发送一条为:"Hello RabbitMQ" 的信息(第一个参数为交换机的名称,这里没写就是用系统默认的交换机)
channel.basicPublish("", QUEUE_NAME, null, MESSAGE.getBytes());
}
}
2.接受消息
import com.booyue.tlh.utils.RabbitMQUtils;
import com.rabbitmq.client.*;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Slf4j
public class Consumer {
public static void main(String[] args) throws IOException {
//获取连接
Connection connection = RabbitMQUtils.getConnection();
//获取通道
Channel channel = connection.createChannel();
//这里也可以声明一个和生产者里面声明的一样的队列,不然如果先启动消费这的话系统会报错,说系统没有对应的queue。多出声明也没关系,第一次声明之后系统就不会在创建对应的queue了
channel.queueDeclare(Producer.QUEUE_NAME, false, false, false, null);
/**
* 接收消息
* 参数1:队列名
* 参数2:是否自动确认
* 参数3:消息回调接口
*/
channel.basicConsume(Producer.QUEUE_NAME, true, new DefaultConsumer(channel) {
@SneakyThrows
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
String message = new String(body, "utf-8");
try {
//模拟完成业务逻辑的耗时
Thread.sleep(1000);
} finally {
log.info("收到的信息:{}", message);
}
}
});
}
}
启动Producer和Consumer,Consumer就能获取到Producer发过来的信息了。
01:31:14.949 [pool-1-thread-4] INFO com.booyue.tlh.hellowrold.Consumer - 收到的信息:Hello RabbitMQ
其他
这里我觉得有一点需要一定要注意,就是我们在HelloWorld的例子中没有看到交换机(Exchange)的影子,但是我们心里一定要清楚,系统一定是有使用交换机的。为我们后面更好的理解RabbitMQ的整个流程做一定的铺垫。
(下图是从我本地的RabbitMQ的服务器截图下来的,可以看到是使用了系统默认的交换机绑定了我们创建的这个队列)
最后
以上就是陶醉小白菜为你收集整理的RabbitMQ学习记录 - HelloWorld的全部内容,希望文章能够帮你解决RabbitMQ学习记录 - HelloWorld所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复