业务场景是这样的,在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