使用XML创建缓存时出现InvalidServerSideConfigurationException

时间:2017-06-01 13:44:40

标签: java xml ehcache terracotta

我是赤土陶器的新人。我想创建一个集群服务器缓存,但发现配置文件有些困难。

这是我的tc-config-terracotta.xml文件(我用它启动兵马俑服务器)

<?xml version="1.0" encoding="UTF-8"?>
<tc-config xmlns="http://www.terracotta.org/config"
    xmlns:ohr="http://www.terracotta.org/config/offheap-resource">

    <servers>
        <server host="localhost" name="clustered">
            <logs>/path/log/terracotta/server-logs</logs>
        </server>
    </servers>
    <plugins>
        <config>
            <ohr:offheap-resources>
                <ohr:resource name="primary-server-resource" unit="MB">128
                </ohr:resource>
                <ohr:resource name="secondary-server-resource" unit="MB">96
                </ohr:resource>
            </ohr:offheap-resources>
        </config>
    </plugins>
</tc-config>

我使用ehcache-clustered-3.3.1-kit启动服务器。

$myPrompt/some/dir/with/ehcache/clustered/server/bin>./start-tc-server.sh -f /path/to/conf/tc-config-terracotta.xml

服务器启动没问题

2017-06-01 11:29:14,052 INFO - New logging session started.
2017-06-01 11:29:14,066 INFO - Terracotta 5.2.2, as of 2017-03-29 at 15:26:20 PDT (Revision 397a456cfe4b8188dfe8b017a5c14346f79c2fcf from UNKNOWN)
2017-06-01 11:29:14,067 INFO - PID is 6114
2017-06-01 11:29:14,697 INFO - Successfully loaded base configuration from file at '/path/to/conf/tc-config-terracotta.xml'.
2017-06-01 11:29:14,757 INFO - Available Max Runtime Memory: 1822MB
2017-06-01 11:29:14,836 INFO - Log file: '/path/log/terracotta/server-logs/terracotta-server.log'.
2017-06-01 11:29:15,112 INFO - Becoming State[ ACTIVE-COORDINATOR ]
2017-06-01 11:29:15,129 INFO - Terracotta Server instance has started up as ACTIVE node on 0:0:0:0:0:0:0:0:9510 successfully, and is now ready for work.

这是ehcache-terracotta.xml配置文件

<ehcache:config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xmlns:terracotta='http://www.ehcache.org/v3/clustered' 
    xmlns:ehcache='http://www.ehcache.org/v3'
    xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.3.xsd
    http://www.ehcache.org/v3/clustered http://www.ehcache.org/schema/ehcache-clustered-ext-3.3.xsd">

    <ehcache:service>
        <terracotta:cluster>
            <terracotta:connection url="terracotta://localhost:9510/clustered" />
            <terracotta:server-side-config
                auto-create="true">
                <terracotta:default-resource from="primary-server-resource" />
            </terracotta:server-side-config>
        </terracotta:cluster>
    </ehcache:service>

    <ehcache:cache alias="myTest">
        <ehcache:key-type>java.lang.String</ehcache:key-type>
        <ehcache:value-type>java.lang.String</ehcache:value-type>
        <ehcache:resources>
            <terracotta:clustered-dedicated unit="MB">10
            </terracotta:clustered-dedicated>
        </ehcache:resources>
        <terracotta:clustered-store consistency="strong" />
    </ehcache:cache>
</ehcache:config>

我有一个班来测试conf:

import java.net.URL;

import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.Configuration;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.xml.XmlConfiguration;

public class TestTerracottaCacheManager
{

   private static TestTerracottaCacheManager cacheManager = null;

   private CacheManager cm;

   private Cache<Object, Object> cache;

   private static final String DEFAULT_CACHE_NAME = "myTest";

   private String cacheName;

   public static TestTerracottaCacheManager getInstance()
   {
      if (cacheManager == null)
      {
         cacheManager = new TestTerracottaCacheManager();
      }
      return cacheManager;
   }

   private TestTerracottaCacheManager()
   {
      // 1. Create a cache manager
      final URL url =
         TestTerracottaCacheManager.class.getResource("/ehcache-terracotta.xml");
      System.out.println(url);
      Configuration xmlConfig = new XmlConfiguration(url);
      cm = CacheManagerBuilder.newCacheManager(xmlConfig);
      cm.init();
      intializeCache();
   }

   private void intializeCache()
   {
      // 2. Get a cache called "cache1", declared in ehcache.xml
      cache = cm.getCache(cacheName == null ? DEFAULT_CACHE_NAME : cacheName,
            Object.class, Object.class);
      if (cache == null)
      {
         throw new NullPointerException();
      }
   }

   public void put(Object key, Object value)
   {
      cache.put(key, value);
   }

   public Object get(String key)
   {
      // 5. Print out the element
      Object ele = cache.get(key);
      return ele;
   }

   public boolean isKeyInCache(Object key)
   {
      return cache.containsKey(key);
   }

   public void closeCache()
   {
      // 7. shut down the cache manager
      cm.close();
   }

   public static void main(String[] args)
   {
      TestTerracottaCacheManager testCache = TestTerracottaCacheManager.getInstance();
      testCache.put("titi", "1");
      System.out.println(testCache.get("titi"));
      testCache.closeCache();
   }

   public String getCacheName()
   {
      return cacheName;
   }

   public void setCacheName(String cacheName)
   {
      this.cacheName = cacheName;
   }
}

我有一个例外。这是堆栈跟踪:

14:18:38.978 [main] ERROR org.ehcache.core.EhcacheManager - Initialize failed.
Exception in thread "main" org.ehcache.StateTransitionException: Unable to validate cluster tier manager for id clustered
    at org.ehcache.core.StatusTransitioner$Transition.failed(StatusTransitioner.java:235)
    at org.ehcache.core.EhcacheManager.init(EhcacheManager.java:587)
    at fr.test.cache.TestTerracottaCacheManager.<init>(TestTerracottaCacheManager.java:41)
    at fr.test.cache.TestTerracottaCacheManager.getInstance(TestTerracottaCacheManager.java:28)
    at fr.test.cache.TestTerracottaCacheManager.main(TestTerracottaCacheManager.java:81)
Caused by: org.ehcache.clustered.client.internal.ClusterTierManagerValidationException: Unable to validate cluster tier manager for id clusteredENS
    at org.ehcache.clustered.client.internal.ClusterTierManagerClientEntityFactory.retrieve(ClusterTierManagerClientEntityFactory.java:196)
    at org.ehcache.clustered.client.internal.service.DefaultClusteringService.autoCreateEntity(DefaultClusteringService.java:215)
    at org.ehcache.clustered.client.internal.service.DefaultClusteringService.start(DefaultClusteringService.java:148)
    at org.ehcache.core.internal.service.ServiceLocator.startAllServices(ServiceLocator.java:118)
    at org.ehcache.core.EhcacheManager.init(EhcacheManager.java:559)
    ... 3 more
Caused by: org.ehcache.clustered.common.internal.exceptions.InvalidServerSideConfigurationException: Default resource not aligned. Client: primary-server-resource Server: null
    at org.ehcache.clustered.common.internal.exceptions.InvalidServerSideConfigurationException.withClientStackTrace(InvalidServerSideConfigurationException.java:43)
    at org.ehcache.clustered.common.internal.exceptions.InvalidServerSideConfigurationException.withClientStackTrace(InvalidServerSideConfigurationException.java:22)
    at org.ehcache.clustered.common.internal.messages.ResponseCodec.decode(ResponseCodec.java:197)
    at org.ehcache.clustered.common.internal.messages.EhcacheCodec.decodeResponse(EhcacheCodec.java:110)
    at org.ehcache.clustered.common.internal.messages.EhcacheCodec.decodeResponse(EhcacheCodec.java:37)
    at com.tc.object.EntityClientEndpointImpl$InvocationBuilderImpl$1.getWithTimeout(EntityClientEndpointImpl.java:193)
    at com.tc.object.EntityClientEndpointImpl$InvocationBuilderImpl$1.getWithTimeout(EntityClientEndpointImpl.java:175)
    at org.ehcache.clustered.client.internal.SimpleClusterTierManagerClientEntity.waitFor(SimpleClusterTierManagerClientEntity.java:184)
    at org.ehcache.clustered.client.internal.SimpleClusterTierManagerClientEntity.invokeInternal(SimpleClusterTierManagerClientEntity.java:148)
    at org.ehcache.clustered.client.internal.SimpleClusterTierManagerClientEntity.validate(SimpleClusterTierManagerClientEntity.java:120)
    at org.ehcache.clustered.client.internal.ClusterTierManagerClientEntityFactory.retrieve(ClusterTierManagerClientEntityFactory.java:190)
    ... 7 more
Caused by: org.ehcache.clustered.common.internal.exceptions.InvalidServerSideConfigurationException: Default resource not aligned. Client: primary-server-resource Server: null
    at org.ehcache.clustered.server.EhcacheStateServiceImpl.checkConfigurationCompatibility(EhcacheStateServiceImpl.java:207)
    at org.ehcache.clustered.server.EhcacheStateServiceImpl.validate(EhcacheStateServiceImpl.java:194)
    at org.ehcache.clustered.server.ClusterTierManagerActiveEntity.validate(ClusterTierManagerActiveEntity.java:253)
    at org.ehcache.clustered.server.ClusterTierManagerActiveEntity.invokeLifeCycleOperation(ClusterTierManagerActiveEntity.java:203)
    at org.ehcache.clustered.server.ClusterTierManagerActiveEntity.invoke(ClusterTierManagerActiveEntity.java:147)
    at org.ehcache.clustered.server.ClusterTierManagerActiveEntity.invoke(ClusterTierManagerActiveEntity.java:57)
    at com.tc.objectserver.entity.ManagedEntityImpl.performAction(ManagedEntityImpl.java:741)
    at com.tc.objectserver.entity.ManagedEntityImpl.invoke(ManagedEntityImpl.java:488)
    at com.tc.objectserver.entity.ManagedEntityImpl.lambda$processInvokeRequest$2(ManagedEntityImpl.java:319)
    at com.tc.objectserver.entity.ManagedEntityImpl$SchedulingRunnable.run(ManagedEntityImpl.java:1048)
    at com.tc.objectserver.entity.RequestProcessor$EntityRequest.invoke(RequestProcessor.java:170)
    at com.tc.objectserver.entity.RequestProcessor$EntityRequest.run(RequestProcessor.java:161)
    at com.tc.objectserver.entity.RequestProcessorHandler.handleEvent(RequestProcessorHandler.java:27)
    at com.tc.objectserver.entity.RequestProcessorHandler.handleEvent(RequestProcessorHandler.java:23)
    at com.tc.async.impl.StageQueueImpl$HandledContext.runWithHandler(StageQueueImpl.java:502)
    at com.tc.async.impl.StageImpl$WorkerThread.run(StageImpl.java:192)

我认为这是XML文件中的一个问题,但我不确定。有人可以帮忙吗?

由于

3 个答案:

答案 0 :(得分:0)

异常告诉您的是,缓存管理器和缓存的群集位的配置在群集知道的内容和客户端询问的内容之间有所不同。

最可能的解释是,您使用不同的配置运行了一次客户端代码,意识到存在问题或只是想要更改某些内容。然后尝试运行客户端而不破坏群集上的cahche管理器或重新启动服务器。

您只需重新启动服务器即可丢失所有群集状态,因为您需要不同的设置。

答案 1 :(得分:0)

我试图在我的IDE中重现您的问题,复制/粘贴您的3个文件。 我在intializeCache()中发现了一个错误:

cache = cm.getCache(cacheName == null ? DEFAULT_CACHE_NAME : cacheName,
    Object.class, Object.class);

触发了一个:

Exception in thread "main" java.lang.IllegalArgumentException: Cache 'myTest' type is <java.lang.String, java.lang.String>, but you retrieved it with <java.lang.Object, java.lang.Object>
at org.ehcache.core.EhcacheManager.getCache(EhcacheManager.java:162)
at MyXmlClient.intializeCache(MyXmlClient.java:48)

因此,请确保您的xml配置与您的Java代码匹配:您在XML中使用<String, String>,在您的Java代码中使用<String, String>

cache = cm.getCache(cacheName == null ? DEFAULT_CACHE_NAME : cacheName,
    String.class, String.class);

其他一切工作正常!

INFO   --- [8148202b7ba8914] customer.logger.tsa                      : Connection successfully established to server at 127.0.0.1:9510
INFO   --- [           main] org.ehcache.core.EhcacheManager          : Cache 'myTest' created in EhcacheManager.
1
INFO   --- [           main] org.ehcache.core.EhcacheManager          : Cache 'myTest' removed from EhcacheManager.
INFO   --- [           main] o.e.c.c.i.s.DefaultClusteringService     : Closing connection to cluster terracotta://localhost:9510

您提供的错误来自客户端中的兵马俑服务器offheap资源使用与兵马俑服务器offheap配置之间的不匹配;确保它们匹配! (复制/粘贴他们的例子!)

答案 2 :(得分:0)

@AnthonyDahanne我正在使用ehcache-clustered-3.8.1-kit启动服务器。我有ehcache.xml,我的春季启动应用程序会自动选择ehache.xml,因此我没有明确编写cacheManager。

<ehcache:config
  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xmlns:terracotta='http://www.ehcache.org/v3/clustered'
  xmlns:ehcache='http://www.ehcache.org/v3'
  xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.8.xsd
    http://www.ehcache.org/v3/clustered http://www.ehcache.org/schema/ehcache-clustered-ext-3.8.xsd">

  <ehcache:service>
    <terracotta:cluster>
      <terracotta:connection url="terracotta://localhost:9410/clustered"/>
      <terracotta:server-side-config auto-create="true">
          <!--<terracotta:default-resource from="default-resource"/>-->
          <terracotta:shared-pool name="shared-pool-expense" unit="MB">100</terracotta:shared-pool>
      </terracotta:server-side-config>
    </terracotta:cluster>
 </ehcache:service>


  <ehcache:cache alias="areaOfCircleCache">
    <ehcache:key-type>java.lang.String</ehcache:key-type>
    <ehcache:value-type>com.db.entity.LogMessage</ehcache:value-type>
    <ehcache:resources>
      <!--      <ehcache:heap unit="entries">100</ehcache:heap>
       <ehcache:offheap unit="MB">10</ehcache:offheap>-->
      <terracotta:clustered-dedicated unit="MB">10</terracotta:clustered-dedicated>
    </ehcache:resources>
  </ehcache:cache>
</ehcache:config>