Spring 批处理 Gemfire 9.6 连接错误 - 原因:java.io.IOException:无法写入部署目录

Spring batch Gemfire 9.6 connection error - Caused by: java.io.IOException: Unable to write to deploy directory

我正在使用 Spring 批处理通过

将数据加载到 gemfire
@Bean
    public GemfireTemplate gemFireTemplate(ClientRegionFactory<Object, 
     Object> factory) {
        GemfireTemplate template = new GemfireTemplate();
        template.setRegion("regionName");
        return template;
    }

POM:

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


   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-gemfire</artifactId>
        <version>1.5.16.RELEASE</version>
    </dependency>
   <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-geode</artifactId>
        <version>2.0.3.RELEASE</version>
      </dependency>
   <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-core</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-common</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-cq</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-wan</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-json</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-lucene</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
   <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.2.6.RELEASE</version>
      </dependency>
       <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.3.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>4.2.12.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>4.2.12.RELEASE</version>
    </dependency>
      <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
        <version>4.0.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.0.3.RELEASE</version>
      </dependency>

日志:

[info 2019/09/11 22:29:22.836 CDT <main> tid=0x1] GemFireCache[id = 892555958; isClosing = true; isShutDownAll = false; created = Wed Sep 11 22:29:20 CDT 2019; server = false; copyOnRead = false; lockLease = 120; lockTimeout = 60]: Now closing.

[error 2019/09/11 22:29:22.913 CDT <main> tid=0x1] java.lang.RuntimeException: java.io.IOException: Unable to write to deploy directory: /data/khan/vaquar/dataloader

java.lang.RuntimeException: java.io.IOException: Unable to write to deploy directory: /data/khan/vaquar/dataloader
        at org.apache.geode.internal.JarDeployer.loadPreviouslyDeployedJarsFromDisk(JarDeployer.java:410)
        at org.apache.geode.internal.cache.GemFireCacheImpl.initialize(GemFireCacheImpl.java:1191)
        at org.apache.geode.internal.cache.GemFireCacheImpl.basicCreate(GemFireCacheImpl.java:758)
        at org.apache.geode.internal.cache.GemFireCacheImpl.createClient(GemFireCacheImpl.java:731)
        at org.apache.geode.cache.client.ClientCacheFactory.basicCreate(ClientCacheFactory.java:262)
        at org.apache.geode.cache.client.ClientCacheFactory.create(ClientCacheFactory.java:212)
        at com.syf.gemfire.jdbc.dataloader.config.FullBatchConf.clientCache(FullBatchConf.java:205)
        at com.syf.gemfire.jdbc.dataloader.config.FullBatchConf$$EnhancerBySpringCGLIB$9d49c1.CGLIB$clientCache(<generated>)
        at com.syf.gemfire.jdbc.dataloader.config.FullBatchConf$$EnhancerBySpringCGLIB$9d49c1$$Fast

    Caused by: java.io.IOException: Unable to write to deploy directory: /data/khan/vaquar/dataloader
        at org.apache.geode.internal.JarDeployer.verifyWritableDeployDirectory(JarDeployer.java:333)
        at org.apache.geode.internal.JarDeployer.loadPreviouslyDeployedJarsFromDisk(JarDeployer.java:389)   

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.geode.cache.client.ClientCache]: Factory method 'clientCache' threw exception; nested exception is java.lang.RuntimeException: java.io.IOException: Unable to write to deploy directory:/data/khan/vaquar/dataloader

分析:

启动与 gemfire 集群的 geode 连接时,Pivotal jars 需要写入权限。

关键代码:

关键文档: - https://gemfire.docs.pivotal.io/98/geode/configuring/cluster_config/deploying_application_jars.html

Pivotal 文档说如果我们可以删除 "gefire.properties" 中的 "deploy-working-dir" 将解决问题,否则使用 "-Dgemfire.deploy-working-dir=/temp/

问题: 在 Spring 批处理中我们没有配置任何 gemfire 属性,如何在 GemfireTemplate 代码中修复它?

这个问题显然与你附在问题上的 Geode Ticket 描述的问题相同,GEODE-5000. This particular ticket is fixed in Geode 1.6.0 and, according to the Pivotal GemFire User Guide, specifically the Release Notes, GemFire 9.5 基于 Geode 1.6.0,所以你应该使用那个版本而不是 9.3.0 解决问题。

附带说明一下,您不应该随意混合和匹配 spring-data-gemfiregemfire 版本,因为可能会出现几个问题,请遵循 Spring Data for Pivotal GemFire Version Compatibility Matrix 以避免出现问题。

希望这对您有所帮助。干杯。