我如何在可运行的 Spring Boot 中使用 @autowire

Posted

技术标签:

【中文标题】我如何在可运行的 Spring Boot 中使用 @autowire【英文标题】:How can i use @autowire in runnable spring boot 【发布时间】:2022-01-19 08:12:27 【问题描述】:

我有很少的 MongoTemplate 和 Repos,我需要在我的可运行类中使用 @Autowire 调用它们,该类正在由执行程序类使用多线程执行,现在的问题是当我运行应用程序时,我的 AutoWire for mongoTempelate 和 Repos 返回空指针异常。 执行者类:

@Component
public class MessageConsumer implements ConsumerSeekAware 
    @Autowired
    AlarmDataRepository alarmDataRepository;
    int assignableCores = ((Runtime.getRuntime().availableProcessors()));
    ExecutorService executor = Executors.newFixedThreadPool(
            assignableCores > 1 ? assignableCores : 1
    );
    int counter = 0;
    List<String> uniqueRecords = new ArrayList<String>();
    @KafkaListener(topics = "teltonikaTest", groupId = "xyz")
    public void processMessages(@Payload List<String> payload, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions, @Header(KafkaHeaders.OFFSET) List<Long> offsets) throws UnsupportedEncodingException, DecodeException 
        System.out.println("assignable resources are: " + assignableCores);
        log.info("Batch Size is: ", payload.size());
        if(counter==0)
            log.info("Teletonica Packets Received!");
        
        for (int i = 0; i < payload.size(); i++) 
            log.info("processing message='' with partition off-set=''", payload.get(i), partitions.get(i) + " _" + offsets.get(i));
        
        uniqueRecords = payload.stream().distinct().collect(Collectors.toList());
        Runnable worker = new TeltonikaWorkerThread(uniqueRecords);
        executor.execute(worker);
        counter++;
    


public class TeltonikaWorkerThread implements Runnable
    List<String> records;
    List<CurrentDevice> currentDevices = new ArrayList<>();
    @Autowired
    CurrentDeviceRepository currentDeviceRepository;
    @Autowired
    MongoTemplate mongoTemplate;

    public TeltonikaWorkerThread(List<String> records) 
        this.records = records;
    
    public void run() 
        try 
            processMessage();
         catch (UnsupportedEncodingException e) 
            e.printStackTrace();
          catch (DecodeException e) 
            e.printStackTrace();
        
    
    public void processMessage() throws UnsupportedEncodingException,DecodeException 
        for(Object record : records)
            if(record!="0")
                try
                    int IMEILength = record.toString().indexOf("FF");
                    String IMEI = record.toString().substring(0,IMEILength);
                
                catch (Exception e)
                    e.printStackTrace();
                
            
        
    

【问题讨论】:

你应该提供一个可重现的例子 请发布您的代码和您尝试过的内容 添加代码第一类是我从kafka接收数据包并使其唯一的地方,然后我将唯一记录传递给TeltonikaWorker线程,然后在我想调用的ProcessMessage中定义的IMEI字符串之后从那里开始我的 repo 执行查询并获取 IMEI 上的记录,但不幸的是我无法自动连接我的 repo 并为此抛出 nullPointerException 【参考方案1】:

如果我理解正确,您的问题是关于多个 bean,而 Spring 不知道应该注入哪一个。这里有几个选项。

例如,您可以根据 bean 名称使用@Qualifier 注释或@Primary 注释。

如果您的问题是其他问题,请在您的问题中添加示例。

【讨论】:

以上是关于我如何在可运行的 Spring Boot 中使用 @autowire的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse 本身中运行 Spring Boot Web 应用程序?

如何使用 Gradle + Spring boot 运行多个配置文件? [复制]

如何在 Spring Boot 测试中获取正在运行的服务器端口?

如何按特定顺序运行 Spring Batch Jobs(Spring Boot)?

如何使用 Spring boot 将 Groovy 类与 java 类一起运行

如何使用 spring boot 和 spock 运行测试容器