【问题标题】:Spring Boot Cache + Apache ignite + Spring Boot Actuator - Application fail to start when running testsSpring Boot Cache + Apache ignite + Spring Boot Actuator - 运行测试时应用程序无法启动
【发布时间】:2019-04-02 18:26:10
【问题描述】:

我有一个项目,我使用 Spring Boot 2.0.0+、Spring Boot Cache、Apache Ignite、Spring Boot Actuator 和 TestNG。

自从我从 ignite 2.5 升级到 ignite 2.6+ 后,我在尝试运行应用程序测试时遇到了问题,因为每次应用程序在测试任务上启动时,ignite 都无法在 @ 上注册它的缓存指标987654322@。

应用程序失败并出现以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.metrics.cache.CacheMetricsRegistrarConfiguration': Invocation of init method failed; nested exception is java.lang.AssertionError

我已经创建了一个展示这个问题的应用程序,你可以通过这个链接访问它:

https://github.com/pmrochaubi/apache-ignite-spring-boot-actuator

谁能解释一下发生了什么以及如何解决这个问题?目前我被困在 2.5 版...

干杯

【问题讨论】:

    标签: java spring-boot testng ignite spring-boot-actuator


    【解决方案1】:

    这里很难说到底是谁的错,但正如你所见:

    Caused by: java.lang.AssertionError: null
        at org.apache.ignite.cache.spring.SpringCacheManager.getCacheNames(SpringCacheManager.java:371) ~[ignite-spring-2.7.0.jar:2.7.0]
        at org.springframework.boot.actuate.autoconfigure.metrics.cache.CacheMetricsRegistrarConfiguration.bindCacheManagerToRegistry(CacheMetricsRegistrarConfiguration.java:73) ~[spring-boot-actuator-autoconfigure-2.1.3.RELEASE.jar:2.1.3.RELEASE]
        at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[na:1.8.0_144]
        at org.springframework.boot.actuate.autoconfigure.metrics.cache.CacheMetricsRegistrarConfiguration.bindCachesToRegistry(CacheMetricsRegistrarConfiguration.java:69) ~[spring-boot-actuator-autoconfigure-2.1.3.RELEASE.jar:2.1.3.RELEASE]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_144]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144]
        at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:363) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:307) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        ... 73 common frames omitted
    

    SpringCacheManager.getCacheNames() 是从 postProcessBeforeInitialization() 调用的。但是很明显,您只能在缓存初始化之后获取缓存名称,例如,在 Ignite 启动并且在 SpringCacheManager 上调用 onApplicationEvent() 之后。

    这对于执行器的CacheMetricsRegistrarConfiguration 来说是一个有趣的问题,为什么他们觉得有必要在还没有启动任何东西的情况下在@PostConstruct 方法中调用这个方法。

    【讨论】:

    • 您有什么想法可以解决吗?我可以在测试中禁用缓存管理器,但我不喜欢这个解决方案。
    • 您可以在返回之前在SpringCacheManager 上致电onApplicationEvent()。
    • 你能提供一个我如何实现这个的例子吗?
    • cacheManager.onApplicationEvent(null); 在做return;之前
    • 但是方法onApplicationEvent不存在
    【解决方案2】:

    对我有用的一个解决方案是将其添加到主类中,由于此自动配置将被禁用,因此您必须根据需要进行自己的配置。

    @EnableAutoConfiguration(exclude = {CacheMetricsAutoConfiguration.class})
    

    【讨论】:

      猜你喜欢
      • 2020-07-27
      • 2019-05-02
      • 1970-01-01
      • 2014-10-28
      • 2015-05-10
      • 2020-08-04
      相关资源
      最近更新 更多