Springboot整合RabbitMQ

整合

生产者

默认如果在windows安装了rabbitmq是不用配置信息的,因为存在默认的配置

  • 整合流程:

    • 导包----------编写配置-----------写代码
      • 在springboot中存在很多template,MQ 就是其中的一种
  • 导包

    • 其实不需要导包,在创建springboot项目时,勾选MQ,就可以了
  • 编写配置

    • #rabbitMQ
      spring:
        rabbitmq:
          username: admin
          password: admin
          virtual-host: /
          host: 47.120.50.213
          port: 5672
      
  • 配置RabbitMqConfiguration

    • 交换机----队列----队列绑定交换机

      • 声明交换机

        • @Bean
          public FanoutExchange fanoutExchange() {
              //返回的是交换机的名字
              return new FanoutExchange("fanout_message_exchange");
          }
          
        • 什么类型的交换机,就返回什么类型

      • 声明队列

        • @Bean
          public Queue emailQueue() {
              //也是队列的名字
              return new Queue("email.fanout.queue",true);
          }
          
      • 队列绑定交换机

        • @Bean
          public Binding emailBinding() {
              return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
          }
          
        • 要是是路由模式,可以添加一个路由,

        • @Bean
          public Binding wxBinding1(){
              return BindingBuilder.bind(wxQueue()).to(directExchange()).with("");
          }
          
  • 发送消息

    • @Autowired
      RabbitTemplate rabbitTemplate;
      
      public void makeOrder(){
      
          String exchangeName = "fanout_message_exchange";
          String message = "hello world";
          String routingKey = "";
      
          rabbitTemplate.convertAndSend(exchangeName,routingKey,message);
          System.out.println("消息发送成功");
      
      }
      

消费者

  • 创建一个新的模块

  • 导包

  • 编写配置

  • 创建一个接受的service

    • @RabbitListener(queues = {"wx.fanout.queue"})
      @Service
      public class FanoutReceiver {
      
          private String messageContent;
      
          @RabbitHandler
          public void receive(String message) {
              messageContent = message;
          }
      
          public String getMessageContent(){
              return messageContent;
          }
      
      }
      
    • 还是一样,接收者是通过队列来进行接受的

    • @RabbitListener()

    • RabbitHandler得到的message就是消息

思考?

如何实现路由模式的配置

@Bean
public Binding tiktokQueueBinding() {
    return BindingBuilder.bind(tiktokQueue()).to(directExchange()).with("tikTokQueueDirect");
}

在后面加上With就行

问题:

如果把接收与发送服务为了测试,写在一个类中,那么其实都不用调用服务,当启动后,就会一直监听,然后消费服务,所以你看不到服务的消费

配置类写在消费者这边还是在生产者这边比较好?

回答:都是推荐的【生产者、消费者、两边】,但是配置在消费者更好一点,消费者一般是先启动的,交换机,让交换机时时监听

使用注解开发

这样可以不使用配置了

@RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "email.fanout.queue",durable = "true",autoDelete = "false"),
        exchange = @Exchange(value = "fanout_message_exchange",type = ExchangeTypes.FANOUT)
))

关于为什么可以这么写?

解释:

  • 进入@RabbitListener

    • 在这里插入图片描述
  • 进入QueueBinding

    • 在这里插入图片描述
  • 进入Queue

    • 在这里插入图片描述

以上就是可以这样配置的原因了

### Oracle 中 `DATEDIFF` 函数的使用 需要注意的是,在 Oracle 数据库中并没有内置名为 `DATEDIFF` 的函数[^3]。然而,可以通过其他方式来实现类似的日期差值计算功能。 #### 使用 `SYSDATE` 和算术运算符 在 Oracle 中可以直接通过简单的减法操作来获取两个日期之间的差异: ```sql SELECT (END_DATE - START_DATE) AS DAY_DIFFERENCE FROM DUAL; ``` 这段代码会返回两个日期之间相差的天数[^1]。 如果需要更精确的时间单位(如小时、分钟),则可以利用 `NUMTODSINTERVAL` 或者 `EXTRACT` 结合 `TIMESTAMP` 类型来进行处理: ```sql -- 计算时间戳间的总秒数并转换成日 SELECT EXTRACT(DAY FROM diff) + EXTRACT(HOUR FROM diff)/24 + EXTRACT(MINUTE FROM diff)/(24*60) + EXTRACT(SECOND FROM diff)/(24*60*60) as day_difference FROM ( SELECT NUMTODSINTERVAL(END_TIMESTAMP - START_TIMESTAMP, 'DAY') AS diff FROM your_table_name ); ``` 对于跨不同级别的间隔(比如年份或月份),推荐使用自定义逻辑或者第三方包中的过程/函数来完成特定需求下的日期比较。 为了模拟 MySQL 的 `DATEDIFF()` 行为——即只考虑整天而不关心具体时刻部分——可以在上述基础上进一步调整查询语句以确保结果符合预期。 #### 自定义 PL/SQL 函数模仿 `DATEDIFF` 当频繁需要用到此功能时,创建一个用户定义函数可能是更好的选择: ```plsql CREATE OR REPLACE FUNCTION get_date_diff( p_end_date IN DATE, p_start_date IN DATE ) RETURN NUMBER IS BEGIN RETURN TRUNC(p_end_date) - TRUNC(p_start_date); -- 只取整天天数之差 END; / ``` 这样就可以像调用常规 SQL 函数一样方便地使用这个新建立的方法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值