乐趣区

关于ehcache:84springboot-EhCache-集群一rmi-手动发现

ehcache 集群配置:
server1(192.168.1.6):

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">

    <!-- 超过大小后长久化磁盘地位 -->
    <diskStore path="java.io.tmpdir"/>
    <cacheManagerPeerProviderFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
            properties="peerDiscovery=manual,
    rmiUrls=//192.168.1.5:40001/dcsCache"/>

    <cacheManagerPeerListenerFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
            properties="hostName=192.168.1.6,port=40001, socketTimeoutMillis=2000"/>


    <!-- default cache -->
    <defaultCache
            maxElementsInMemory="1000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"/>

    <!-- 自定义缓存配置 -->
    <cache name="dcsCache"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="120"
           timeToLiveSeconds="120"
           overflowToDisk="false"
           memoryStoreEvictionPolicy="LRU">
        <cacheEventListenerFactory
                class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
                properties="replicateAsynchronously=true,
    replicatePuts=true,
    replicateUpdates=true,
    replicateUpdatesViaCopy=true,
    replicateRemovals=true"/>
        <bootstrapCacheLoaderFactory  class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />

    </cache>

</ehcache>

server2(192.168.1.5):

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">

    <!-- 超过大小后长久化磁盘地位 -->
    <diskStore path="java.io.tmpdir"/>
    <cacheManagerPeerProviderFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
            properties="peerDiscovery=manual,
    rmiUrls=//192.168.1.6:40001/dcsCache"/>

    <cacheManagerPeerListenerFactory
            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
            properties="hostName=192.168.1.5,port=40001, socketTimeoutMillis=2000"/>


    <!-- default cache -->
    <defaultCache
            maxElementsInMemory="1000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"/>

    <!-- 自定义缓存配置 -->
    <cache name="dcsCache"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="120"
           timeToLiveSeconds="120"
           overflowToDisk="false"
           memoryStoreEvictionPolicy="LRU">
        <cacheEventListenerFactory
                class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
                properties="replicateAsynchronously=true,
    replicatePuts=true,
    replicateUpdates=true,
    replicateUpdatesViaCopy=true,
    replicateRemovals=true"/>
        <bootstrapCacheLoaderFactory  class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />

    </cache>

</ehcache>

application.yml

server:
  port: 8082
  servlet:
    context-path: /

spring:
  devtools:
    restart:
      enabled: false

  cache:
    jcache:
      config: ehcache.xml

测试管制类:

package com.example.demo1125;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/dcs/ec")
public class EhcacheDcsController {private static final Logger logger = LoggerFactory.getLogger(EhcacheDcsController.class);


    @RequestMapping(value = "save")
    @Cacheable(value="dcsCache",key="#value")
    @ResponseBody
    public Object save(String value) {logger.info("logger:/dcs/ec/save...."+value);
        System.out.println("/dcs/ec/save...."+value);
        return value;
    }

    @RequestMapping(value="del")
    @CacheEvict(value="dcsCache",key="#value",beforeInvocation=true)
    @ResponseBody
    public String del(String  value){logger.info("logger:delete cache key...."+value);
        System.out.println("delete cache key:"+value);
        return "delete cache key:"+value;
    }

}

Demo1125Application:

package com.example.demo1125;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableCaching
@EnableScheduling
@SpringBootApplication
public class Demo1125Application {public static void main(String[] args) {SpringApplication.run(Demo1125Application.class, args);
    }

}

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo1125</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1125</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <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-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.3</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

拜访:http://192.168.1.5:8082/dcs/e…
而后再拜访 http://192.168.1.6:8082/dcs/e…
会发现,192.168.1.5 的有输入日志
192.168.1.6 的没有输入日志

目前在 windows 测试通过。
在同一台电脑上,扭转端口也测试通过。

测试不通过的状况:
1)一个部署在 windows, 一个部署在 linux, windows 的缓存能够同步到 linux, linux 上的缓存无奈同步到 windows。

2)两个都别离部署在两台 linux 上,相互之间无奈同步。

以上 2 点,均在局域网,ping ip 是互通的。

退出移动版