文章目录
1. RocketMQ工作模式
安装之前,我们先来说说RocketMQ工作模式。
在RocketMQ中,处理业务的服务器称为broker,生产者与消费者不是直接与broker联系的,而是通过命名服务器进行通信。broker启动后会通知命名服务器自己已经上线,这样命名服务器中就保存有所有的broker信息。当生产者与消费者需要连接broker时,通过命名服务器找到对应的处理业务的broker,因此命名服务器在整套结构中起到一个信息中心的作用。并且broker启动前必须保障命名服务器先启动。
2. 安装rocketMQ
安装
windows版安装包下载地址:https://rocketmq.apache.org
RocketMQ安装后需要配置环境变量,具体如下:
- ROCKETMQ_HOME
- PATH
- NAMESRV_ADDR (建议): 127.0.0.1:9876
前面两步就不讲了。
启动服务器
mqnamesrv # 启动命名服务器
mqbroker # 启动broker
运行bin目录下的mqnamesrv命令即可启动命名服务器,默认对外服务端口9876。
运行bin目录下的mqbroker命令即可启动broker服务器,如果环境变量中没有设置NAMESRV_ADDR则需要在运行mqbroker指令前通过set指令设置NAMESRV_ADDR的值,并且每次开启均需要设置此项。
3. springboot整合rocketMQ
3.1 导入springboot整合RocketMQ的starter
此坐标版本springboot不提供维护,因此需要自己加入版本信息。
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
3.2 添加核心配置
设置默认的生产者消费者所属组group。
rocketmq:
name-server: localhost:9876
producer:
group: rocketmq_group
3.3 使用RocketMQTemplate操作RocketMQ
使用asyncSend方法发送异步消息。
@Service
public class MsgServiceRocketmqImpl implements MsgService {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Override
public void sendMsg(String id) {
System.out.println("已将待处理消息加入队列,id :"+id);
SendCallback callback = new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("消息发送成功");
}
@Override
public void onException(Throwable throwable) {
System.out.println("消息发送失败");
}
};
// 使用asyncSend方法发送异步消息。
rocketMQTemplate.asyncSend("order_id",id,callback);
}
}
注意,使用asyncSend方法发送异步消息需要传递三个参数,队列名称,传递的参数,回调函数。回调函数会根据成功与否返回相对应的消息提示。
3.4 设置消息监听器
- 使用消息监听器在服务器启动后,监听指定位置,当消息出现后,立即消费消息
- RocketMQ的监听器必须按照标准格式开发,实现RocketMQListener接口,泛型为消息类型。
- 使用注解@RocketMQMessageListener定义当前类监听RabbitMQ中指定组、指定名称的消息队列。
@Component
@RocketMQMessageListener(topic = "order_id",consumerGroup = "rocketmq_group")
class MessageListener implements RocketMQListener<String> {
@Override
public void onMessage(String id) {
System.out.println("已完成短信发送业务(rocketmq),id:"+id);
}
}
这里监听器的注解是@RocketMQMessageListener,这个注解区别于rabbitMQ,rabbitMQ的监听器注解加在方法上,这里是加在类上。其次,这里的监听器要实现RocketMQListener类,并且指定一个泛型,该泛型就是我们传递参数的类型。
接下来我们运行程序看结果。
3.5 总结
- springboot整合RocketMQ使用RocketMQTemplate对象作为客户端操作消息队列
- 操作RocketMQ需要配置RocketMQ服务器地址,默认端口9876
- 开发时通常使用监听器来处理消息队列中的消息,设置监听器使用注解@RocketMQMessageListener
4. 安装kafka
安装
windows版安装包下载地址:https://kafka.apache.org/downloads
启动服务器
kafka服务器的功能相当于RocketMQ中的broker,kafka运行还需要一个类似于命名服务器的服务。在kafka安装目录中自带一个类似于命名服务器的工具,叫做zookeeper,它的作用是注册中心。
zookeeper-server-start.bat ..\..\config\zookeeper.properties # 启动zookeeper
kafka-server-start.bat ..\..\config\server.properties # 启动kafka
运行bin目录下的windows目录下的zookeeper-server-start命令即可启动注册中心,默认对外服务端口2181。
运行bin目录下的windows目录下的kafka-server-start命令即可启动kafka服务器,默认对外服务端口9092。
5. springboot整合kafka
5.1 导入springboot整合Kafka的starter
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
5.2 添加核心配置
配置Kafka的服务器地址
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: order
5.3 使用KafkaTemplate操作Kafka
使用send方法发送消息,需要传入topic名称。
@Service
public class MsgSerivceKafkaImpl implements MsgService {
@Resource
private KafkaTemplate<String,String > kafkaTemplate;
@Override
public void sendMsg(String id) {
System.out.println("已将待处理消息加入队列,id :"+id);
kafkaTemplate.send("kafka_id", id);
}
}
5.4 设置消息监听器
- 使用消息监听器在服务器启动后,监听指定位置,当消息出现后,立即消费消息
- 使用注解@KafkaListener定义当前方法监听Kafka中指定topic的消息.
- 接收到的消息封装在对象ConsumerRecord中,获取数据从ConsumerRecord对象中获取即可。
@Component
public class MsgListener {
@KafkaListener(topics = "kafka_id")
public void onMessage(ConsumerRecord<String,String> record){
System.out.println("已完成短信发送业务(kafka),id:"+record.value());
}
}
5.5 总结
-
springboot整合Kafka使用KafkaTemplate对象作为客户端操作消息队列
-
操作Kafka需要配置Kafka服务器地址,默认端口9092
-
开发时通常使用监听器来处理消息队列中的消息,设置监听器使用注解@KafkaListener。接收消息保存在形参ConsumerRecord对象中