Springboot学习笔记(消息及activemq,rabbitmq,rocketmq和kafka)

目录

消息

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<String> mgList=new ArrayList<String>();

    @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);
    }
}

ActiveMQ:

下载与使用(如果嫌下载麻烦的,我的资源里面也有,可以自行下载,全套的mq)

下载好后我们可以直接在bin下的win64下的

 这个文件直接双击运行

 然后在中间倒数第二行我们可以看到可视化地址,在网址中输入这个,我们第一次登录都会有提示登录账号密码(都是admin)。

然后我们就可以看到下面这个

 

 Springboot整合

1.导入坐标

<!--        activemq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>

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中分别查看点对点模式和发布订阅模式下的队列

 RabbitMQ

下载与安装

 配置到安装目录下

 

 然后用管理员模式运行cmd,切换到sbin目录下,找到下面这个运行(电脑名称是中文的好像会出现问题)

 

 

 我们这里需要用到的是下面的一个插件,我们启动后可以通过web访问。

 访问地址为localhost:15672,账号密码为guest

 Springboot整合RabbitMQ

1.导入依赖

<!--        rabbitmq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

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可以使用占位符

 RoctetMQ

下载和安装

 

 启动时候在bin下,启动下面这两个cmd文件。(启动闪退的,注意环境变量配置jdk的路径不能有空格。要么换个路径放,要么改路径名字。另外,如果你的jdk是安装在program files路径,可以在环境变量配置路径写PROAGA~1,这是特殊表达式。)

 验证是否启动成功(在cmdbin目录下输入以下命令)

 Springboot整合RocketMQ

1.导入依赖

<!--        rocketMQ-->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

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<String> {

    @Override
    public void onMessage(String id) {
        System.out.println("已完成短信发送业务,id:" + id);
    }
}

Kafka

下载与安装

 

 启动(在bin目录下输入以下命令)

若出现(此时不应有 \Java\jdk1.8.0_73\lib\dt.jar。 )错误,这个是因为jdk路径有空格,我们只需要将我们的jdk复制到没有空格的路径下,并修改环境变量JAVA_HOME即可。

操作topic

 测试功能

 Springboot整合kafka

 1.导入坐标

<!--        kafka-->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

2.配置

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: order

3.示例代码

业务层
@Service
public class MessageServiceImpl implements MessageService {
    @Autowired
    private KafkaTemplate<String,String> 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<String,String> record){
        System.out.println("已完成短信发送业务,id:" + record.value());

    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

低调$(生活)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值