当前位置: 首页 > 知识库问答 >
问题:

关闭Spring Boot应用程序上的ehcache

罗乐意
2023-03-14

我有一个spring boot应用程序。我在spring boot应用程序中使用ehcahce实现了缓存。缓存工作正常,但触发关闭脚本时tomcat没有关闭。我跳过了构建中的默认容器,并使用jstack进行了测试,可能发现ehcache阻止了应用程序关闭。我需要在Spring Boot关闭时实现ehcache的关闭。我知道我需要为ehcahce实现一个关机侦听器。我已尝试在应用程序中设置属性。属性。

net.sf.ehcache.enableShutdownHook=true

但是没有成功。这应该是理想情况下尝试的最后一个选项。我需要尝试在web.xml中添加一个侦听器

    <listener> 
    <listener-class> 
       net.sf.ehcache.constructs.web.ShutdownListener</listener-class> 
   </listener>

但由于spring boot没有web。xml如何实现这个侦听器?我可以在网络配置中完成吗?任何人实现了这一点,请帮助。

我研究了一些旧帖子,当Spring boot应用程序部署了ehcache时,Tomcat没有关闭,但看起来没有任何正确的响应。

添加配置。(根据下面的评论)这是我的主类,我已经配置了@Enable缓存

@SpringBootApplication
@EnableAsync
@EnableCaching
public class Application extends SpringBootServletInitializer implements AsyncConfigurer 

{

    <?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <diskStore path="java.io.tmpdir" />
    <defaultCache maxElementsInMemory="10" eternal="false"
        timeToIdleSeconds="1200" timeToLiveSeconds="600" overflowToDisk="true" />
    <cache name="cache1" maxElementsInMemory="60000" eternal="false"
        overflowToDisk="false" timeToIdleSeconds="0" timeToLiveSeconds="43200"  memoryStoreEvictionPolicy="LFU"/>
    <cache name="cache2" maxElementsInMemory="500" eternal="false"
        overflowToDisk="false" timeToIdleSeconds="0" timeToLiveSeconds="43200"  memoryStoreEvictionPolicy="LFU"/>
</ehcache>
public class ApplicationStartupService implements
        ApplicationListener<ApplicationReadyEvent> {


@Override
public void onApplicationEvent(final ApplicationReadyEvent event) {
    //load cache
}

用缓存注释的方法。

@Cacheable(value = CACHE_1, key = "#root.target.KEY")
    public Map<String, String> cache1() {

}

在pom.xml我已经配置了缓存启动。

<packaging>war</packaging>
<name>myapp</name>
<description>my test application</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.7.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <jcl.slf4j.version>1.7.12</jcl.slf4j.version>
    <logback.version>1.1.3</logback.version>
    <rootDir>${project.basedir}</rootDir>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

根据评论,我已经尝试添加bean,但没有任何帮助。

@Bean
    public CacheManager cacheManager() {
        net.sf.ehcache.CacheManager cacheManager = new net.sf.ehcache.CacheManager();
        return new EhCacheCacheManager(cacheManager);
    }

共有1个答案

叶鸿煊
2023-03-14

创建一个spring上下文侦听器怎么样。捕获上下文并关闭ehcache。

public class SpringEhcacheShutdownListenerBean implements ApplicationListener {

@Override
public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof ContextClosedEvent) {
        // now you can do ehcache shutdown
        // ...
    }
}

}

不要忘记将该类注册为SpringBean。

 类似资料:
  • 启动 1. 轻触主画面上您想启动的应用程序图标。 显示LiveArea™。 2. 轻触[开始]。 中断/继续 按下PS键即可返回LiveArea™。若要继续,请轻触[继续]。 关闭 1. 按下PS键。 返回LiveArea™。 2. 请由画面右上角将LiveArea™撕下。

  • 我正在使用appium dot net驱动程序,我想关闭/打开wifi。请建议c#中使用appium或adb命令的方法,该命令可以发送到设备以关闭wifi

  • 在Swing中,您可以简单地使用在窗口关闭时关闭整个应用程序。 然而,在JavaFX中,我找不到一个等价物。我有多个窗口打开,我想关闭整个应用程序,如果一个窗口关闭。在JavaFX中实现这一点的方法是什么?

  • 我试图重新创建Connect四,我成功了。但我想通过频繁地切换颜色,给玩家一个获胜的四张光盘在哪里的指示。我对线程和编程中的时间概念是新的。 我也成功地给了用户这个指示,但是在关闭应用程序之后,控制台仍然会给出输出,也是在使用SetonCloserEquest时。 代码如下:

  • 问题内容: 我需要在Java Web应用程序停止或tomcat停止时保存一些数据。如何才能做到这一点?编辑:如果我使用jvm shutdown钩有什么缺点? 问题答案: 使用在您的web.xml 中实现ServletContextListener的类: