如何在独立环境下实例化Spring启动存储库?

时间:2017-04-17 14:54:25

标签: java spring spring-boot

所有

我在我的项目中使用spring boot。太棒了。 我的项目有一部分定期(使用计时器)在数据库上运行,而不是响应http请求。 它定期查询传感器(许多传感器)并收集温度读数,并将读数存储到数据库中。 在将其存储到数据库之前,将读出的数字与警告阈值进行比较,以测试是否应生成警告。

阈值编号也要从数据库中查询(复杂)。 我有一个ThresholdRepository为这个查询扩展了JPAResository,所以我想在这个场景中使用它。

我的问题是:我可以使用@Autowire让spring boot为我生成ThresholdRepository实例吗?如果没有,如何在此计时器线程中实例化ThresholdRepository?

我在http://www.yjs001.cn/java/spring/33161827667841434606.html

找到了一些代码

遗憾的是,代码已过时且RepositoryMetadata没有getDomainClass,我不知道应该使用哪种替代方案。 请有人帮助我。

任何建议都表示赞赏。

我提到的存储库如下:

public interface ThresholdInfoRepository extends JpaRepository<ThresholdInfo, Long> { ThresholdInfo findOneByGatewayIdAndNodeAddrAndChannel(Long gatewayId, Byte nodeAddr, Byte channel); List<ThresholdInfo> findByGatewayId(Long gatewayId); } 这很简短,但做了很多工作。

1 个答案:

答案 0 :(得分:2)

是的,你可以,

您必须将@EnableJpaRepositories作为存储库才能成为bean。

然后,为了能够自动装配它,你的TimerTask也必须是一个Spring Bean。你可以使用spring-tasks https://spring.io/guides/gs/scheduling-tasks/

@SpringBootApplication
@EnableScheduling
@EnableJpaRepositories
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class);
    }
}

@Component
public class UpdateTask {
    @Autowired 
    ThresholdInfoRepository thresholdInfoRepository;

    @Scheduled(fixedRate = ...)
    public void updateSensor() {
        thresholdInfoRepository.find(...)
        readoutRepository.save(...);
    }
}

Spring启动会启动一个计时器线程来执行你的预定方法。