目录
消息
ActiveMQ:
下载与使用(如果嫌下载麻烦的,我的资源里面也有,可以自行下载,全套的mq)
Springboot整合
RabbitMQ
下载与安装
Springboot整合RabbitMQ
RoctetMQ
下载和安装
Springboot整合RocketMQ
Kafka
下载与安装
Springboot整合kafka
下面我们将围绕四种异步传递技术开始介绍:
MQTT:消息队列遥测传输,专为小设备设计,是互联网生态系统主要成分之一。
Kafka:一种高吞吐量的分布式发布订阅消息系统,提供实时信息功能。
我们下面主要使用这四种开始讲解
ActiveMQ
RabbitMQ
RocketMQ
Kafka
模拟订单短信通知的案例,以下是代码及部分讲解
结构
OrderServiceImpl
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private MessageService messageService;
@Override
public void order(String id) {
System.out.println("订单处理开始");
//短信消息处理
messageService.sendMessage(id);
System.out.println("订单处理结束");
}
}
MessageServiceImpl
@Service
public class MessageServiceImpl implements MessageService {
private ArrayList mgList=new ArrayList();
@Override
public void sendMessage(String id) {
System.out.println("待发送消息的订单已纳入队列,id:"+id);
mgList.add(id);
}
@Override
public String doMessage() {
String id = mgList.remove(0);
System.out.println("已完成短信发送业务,id:"+id);
return id;
}
}
MessageController
@RestController
@RequestMapping("/msgs")
public class MessageController {
@Autowired
private MessageService messageService;
@GetMapping
public String doMessage(){
String id = messageService.doMessage();
return id;
}
}
OrderController
@RequestMapping("/orders")
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("{id}")
public void order(@PathVariable String id){
orderService.order(id);
}
}
下载好后我们可以直接在bin下的win64下的
这个文件直接双击运行
然后在中间倒数第二行我们可以看到可视化地址,在网址中输入这个,我们第一次登录都会有提示登录账号密码(都是admin)。
然后我们就可以看到下面这个
1.导入坐标
org.springframework.boot
spring-boot-starter-activemq
2.配置信息
spring:
activemq:
broker-url: tcp://localhost:61616
jms:
pub-sub-domain: true 发布订阅模式开启,默认是点对点模式
template:
default-destination: *** 队列名称
3.示例代码
@Service
public class MessageServiceActiveMQImpl implements MessageService {
@Autowired
private JmsMessagingTemplate messagingTemplate;
@Override//发送信息
public void sendMessage(String id) {
System.out.println("待发送消息的订单已纳入队列,id:"+id);
//第一个参数是队列名字
messagingTemplate.convertAndSend("order.queue.id",id);
}
@Override//接收信息
public String doMessage() {
//第一个参数是队列名字
String id =messagingTemplate.receiveAndConvert("order.queue.id",String.class);
System.out.println("已完成短信发送业务,id:"+id);
return id;
}
}
上面是第二个方法是手动接收信息,下面这个是自动接受信息
@Component//将该类定义成bean被springboot管控
public class MessageListener {
//实现了自动接收信息
@JmsListener(destination = "order.queue.id")
@SendTo("order.order.queue.id")//上面接收完后再发送当前方法的返回值到新队列
public void receive(String id){
System.out.println("已完成短信发送业务,id:"+id);
}
}
可以在下面的queue和topic中分别查看点对点模式和发布订阅模式下的队列
然后用管理员模式运行cmd,切换到sbin目录下,找到下面这个运行(电脑名称是中文的好像会出现问题)
我们这里需要用到的是下面的一个插件,我们启动后可以通过web访问。
访问地址为localhost:15672,账号密码为guest
1.导入依赖
org.springframework.boot
spring-boot-starter-amqp
2.配置
spring:
rabbitmq:
host: localhost
port: 5672
3.示例代码(直连模式)
业务类
@Service
public class MessageServiceRabbitMQImpl implements MessageService {
@Autowired
private AmqpTemplate amqpTemplate;
@Override
public void sendMessage(String id) {
System.out.println("待发送消息的订单已纳入队列,id:"+id);
amqpTemplate.convertAndSend("directExchange","direct",id);
}
@Override
public String doMessage() {
return null;
}
}
配置类
@Configuration
public class RabbitConfigDirect {
@Bean
public Queue directQueue(){
return new Queue("direct_queue");
}
@Bean
public Queue directQueue2(){
return new Queue("direct_queue2");
}
@Bean
public DirectExchange directExchange(){
return new DirectExchange("directExchange");
}
@Bean
public Binding binding(){
return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct");
}
@Bean
public Binding binding2(){
return BindingBuilder.bind(directQueue2()).to(directExchange()).with("direct2");
}
}
监听类
@Component
public class MessageListener {
@RabbitListener(queues = "direct_queue")
public void receive(String id){
System.out.println("已完成短信发送业务,id:"+id);
}
}
注意上面的参数。
4.示例代码(topic模式)
配置类
@Configuration
public class RabbitConfigDirect {
@Bean//操作队列
public Queue topicQueue(){
return new Queue("topic_queue");
}
@Bean
public Queue topicQueue2(){
return new Queue("topic_queue2");
}
@Bean//交换机
public TopicExchange topicExchange(){
return new TopicExchange("topicExchange");
}
@Bean//绑定
public Binding binding(){
return BindingBuilder.bind(topicQueue()).to(topicExchange()).with("topic.order.id");
}
@Bean
public Binding binding2(){
return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("topic2");
}
}
监听类
@Component
public class MessageListener {
@RabbitListener(queues = "topic_queue")
public void receive(String id) {
System.out.println("已完成短信发送业务,id:" + id);
}
@RabbitListener(queues = "topic_queue2")
public void receive2(String id) {
System.out.println("已完成短信发送业务,id:" + id);
}
}
业务类
@Service
public class MessageServiceRabbitMQImpl implements MessageService {
@Autowired
private AmqpTemplate amqpTemplate;
@Override
public void sendMessage(String id) {
System.out.println("待发送消息的订单已纳入队列,id:"+id);
amqpTemplate.convertAndSend("topicExchange","topic.order.id",id);
}
//由于有监听类了,这个方法就没有必要写了
@Override
public String doMessage() {
return null;
}
}
需要注意的是这里的routingkey可以使用占位符
启动时候在bin下,启动下面这两个cmd文件。(启动闪退的,注意环境变量配置jdk的路径不能有空格。要么换个路径放,要么改路径名字。另外,如果你的jdk是安装在program files路径,可以在环境变量配置路径写PROAGA~1,这是特殊表达式。)
验证是否启动成功(在cmdbin目录下输入以下命令)
1.导入依赖
org.apache.rocketmq
rocketmq-spring-boot-starter
2.2.2
2.配置
rocketmq:
name-server: localhost:9876
producer:
group: group_rocketmq
3.示例代码
业务类
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Override
public void sendMessage(String id) {
System.out.println("待发送消息的订单已纳入队列,id:"+id);
//同步
// rocketMQTemplate.convertAndSend("order_id",id);
//异步
SendCallback callback=new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送成功");
}
@Override
public void onException(Throwable throwable) {
System.out.println("发送失败");
}
};
rocketMQTemplate.asyncSend("order_id",id,callback);
}
@Override
public String doMessage() {
return null;
}
}
监听类
@Component
@RocketMQMessageListener(topic = "order_id",consumerGroup = "group_rocketmq")
public class MessageListener implements RocketMQListener {
@Override
public void onMessage(String id) {
System.out.println("已完成短信发送业务,id:" + id);
}
}
启动(在bin目录下输入以下命令)
若出现(此时不应有 \Java\jdk1.8.0_73\lib\dt.jar。 )错误,这个是因为jdk路径有空格,我们只需要将我们的jdk复制到没有空格的路径下,并修改环境变量JAVA_HOME即可。
操作topic
1.导入坐标
org.springframework.kafka
spring-kafka
2.配置
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: order
3.示例代码
业务层
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private KafkaTemplate kafkaTemplate;
@Override
public void sendMessage(String id) {
System.out.println("待发送消息的订单已纳入队列,id:"+id);
kafkaTemplate.send("topic1",id);
}
@Override
public String doMessage() {
return null;
}
}
监听器
@Component
public class MessageListener {
@KafkaListener(topics = "topic1")
public void receive(ConsumerRecord record){
System.out.println("已完成短信发送业务,id:" + record.value());
}
}