在Quartz的Job中自动注入RabbitMq为null的解决方案。

业务场景是这样的,在Quartz定时任务框架中去执行定时业务,比如获取最新的信息,如果存在就通过RabbitMq发送其他服务器处理,那么在SpringBoot中我们自动想到使用@Autowired去自动注入:

   @Autowired
    private AmqpTemplate amqpTemplate;

但是提示为null,因为 Quartz 在执行任务时是在独立的线程中执行的,而这个线程是不受 Spring 管理的,因此在这个线程中无法自动注入 amqpTemplate。

那么我们可以通过其他方式来解决这一问提

第一步,我们定义一个自定义的模板类。

import jakarta.annotation.PostConstruct;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Component
public class MyRabbitTemplate {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public static RabbitTemplate staticRabbitTemplate;

    @PostConstruct
    public void init() {
        staticRabbitTemplate = rabbitTemplate;
    }
}

第二步,在Job类中使用

MyRabbitTemplate.staticRabbitTemplate.convertAndSend("队列名称", "消息内容");

备注:这是application.yml的配置

server:
  port: 12345
spring:
  quartz:
    scheduler-name: XiaoHongShuScheduler
    job-store-type: memory
    auto-startup: false
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: admin
    password: admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注