0

今天我正在尝试使用 spring 来初始化一些 Geode 组件。我创建的xml如下:

  <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:gfe="http://www.springframework.org/schema/gemfire"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd">

    <beans>
        <gfe:client-cache id="my-cache" pool-name="my-pool"/>

        <gfe:pool id="my-pool" subscription-enabled="true">
            <gfe:locator host="max" port="10334"/>
        </gfe:pool>
    </beans>
</beans>

我只是想获取 Geode 的客户端缓存。当我运行下面的代码时:

public class GeodeLauncher {
    public static void main(String[] args){
        ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:geodeConfig.xml");
        ac.getBean("my-cache");
    }

}

异常抛出:

Caused by: java.lang.ClassNotFoundException: com.gemstone.gemfire.distributed.DistributedSystem
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 31 more

我在 pom.xml 中添加了依赖项

 <dependency>
            <groupId>org.apache.geode</groupId>
            <artifactId>geode-core</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-gemfire -->

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-geode</artifactId>
            <version>1.0.0.APACHE-GEODE-INCUBATING-M2</version>
        </dependency>

我注意到包 org.apache.geode.distributed 下有一个名为 DistributedSystem 的同名类。 在此处输入图像描述 应该使用这个类吗?为什么需要 com.gemstone.gemfire.distributed.DistributedSystem ?我是不是把xml配置错了?

4

1 回答 1

1

是的,您在这里遇到了一些版本问题。

首先,Spring Data Geode 1.0.0.INCUBATING-RELEASE可用的(参见发布公告),所以你应该更新你的应用程序依赖...

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-geode</artifactId>
  <version>1.0.0.INCUBATING-RELEASE</version>
</dependency>

其次,目前还没有正式基于最新版本 Apache Geode(即 1.1.0)的Spring Data Geode版本。从技术上讲,SD Geode 1.0.0.INCUBATING-RELEASE基于Apache Geode 1.0.0-incubating(Geode 1.1.0 之前的 GA 版本)。我正在计划一个Spring Data Geode 1.1.0.RELEASE,它将基于 Apache Geode 1.1.0。

但是,虽然我没有正式支持它,但我认为可以更新 SDG 1.0.0.INCUBATING-RELEASE 以使用 Apache Geode 1.1.0,并且 SDG 也可以与 Apache Geode 1.1.0 一起运行。

为此,只需在应用程序 POM 中声明以下依赖项(至少在 SDG 1.1.0.RELEASE 发布之前 ;-)...

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-geode</artifactId>
  <version>1.0.0.INCUBATING-RELEASE</version>
  <exclusions>
    <exclusion>
      <groupId>org.apache.geode</groupId>
      <artifact>geode-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.apache.geode</groupId>
      <artifact>geode-cq</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.apache.geode</groupId>
      <artifact>geode-wan</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.apache.geode</groupId>
  <artifactId>geode-core</artifactId>
  <version>1.1.0</version>
</dependency>
<dependency>
  <groupId>org.apache.geode</groupId>
  <artifactId>geode-cq</artifactId>
  <version>1.1.0</version>
</dependency>
<dependency>
  <groupId>org.apache.geode</groupId>
  <artifactId>geode-wan</artifactId>
  <version>1.1.0</version>
</dependency>

在 Apache Geode 1.0.0-incubating(即 Milestone 版本)之前,Geode 类的包命名空间仍然植根于其中com.gemstone.gemfire(因为 Apache Geode 源自 Pivotal GemFire)。

但是,从 Apache Geode 1.0.0-incubating 及更高版本(即 1.1.0)开始,包命名空间更改为org.apache.geode. 因此,您需要一个兼容的Spring Data Geode版本,目前是1.0.0.INCUBATING-RELEASE.

另请注意,您的Spring XML 配置文件中的附加嵌套<beans>标记是不必要的;您的 XML 配置可以是...

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:gfe="http://www.springframework.org/schema/gemfire"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd">

    <gfe:client-cache id="my-cache" pool-name="my-pool"/>

    <gfe:pool id="my-pool" subscription-enabled="true">
        <gfe:locator host="max" port="10334"/>
    </gfe:pool>
</beans>

此外, Spring中有一个普遍的趋势是远离 XML。

Spring Data Geode 1.0.0.APACHE-GEODE-INCUBATING-M3 开始,目前在 1.0.0.INCUBATING-RELEASE 中,您可以使用新的 Annotation 模型(主要受Spring Boot启发)在 Java 中进行等效的Spring XML 配置,像这样...

import ...;

@SpringBootApplication
@ClientCacheApplication(locators = { @ClientCacheApplication.Locator(host="max") }
class GeodeLauncher {

  @Autowired
  private ClientCache geodeClientCache;

  public static void main(String[] args) {
    SpringApplication.run(GeodeLauncher.class, args);
  }
}

最后一点,如果您处于真正的前沿,您始终可以使用Spring Data Geode 1.1.0.BUILD-SNAPSHOT的构建快照,Spring 的 libs-snapshotMaven 存储库中获得。您只需将适当的存储库声明添加到您的应用程序 POM 文件中...

<repository>
    <id>spring-libs-snapshot</id>
    <url>https://repo.spring.io/libs-snapshot</url>
</repository>

Spring Data Geode 1.1.0.BUILD-SNAPSHOT基于Apache Geode 1.1.0

然后,你的依赖声明就变成了......

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-geode</artifactId>
  <version>1.1.0.BUILD-SNAPSHOT</version>
</dependency>

没有对 Apache Geode 1.1.0 工件的所有排除业务和显式依赖。另一个好处是 SDG 1.1.0 包括对 Geode 的 Lucene 集成的支持。

无论如何,希望这会有所帮助。您总是可以在我的 SDG 参考实现 (RI) GitHub 项目中看到更多不同配置样式的示例...

https://github.com/jxblum/contacts-application/tree/apache-geode/configuration-example/src/main/java/example/app

有很多示例将Spring XML 配置(然后在这里)与Geodecache.xml进行比较,然后将Spring XML 与Spring JavaConfig进行比较,以使用新的Annotation 配置模型(当然,客户端使用 Annotations)等等。

干杯,约翰

于 2017-04-20T02:26:41.320 回答