2017-06-01 126 views
1

我是新兵马俑。我想创建一个群集服务器缓存,但发现配置文件存在一些问题。使用XML创建缓存时InvalidServerSideConfigurationException

这里是我的TC-配置-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集群-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; 
    } 
} 

我有一个前ception。这里是堆栈跟踪:

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文件中的问题,但我不确定。有人可以帮忙吗?

感谢

回答

0

什么异常告诉你的是,你的缓存管理器和高速缓存的集群位的配置之间,集群知道和客户问什么不同。

最可能的解释是,您用一个不同的配置运行一次您的客户端代码,意识到有问题或只是想改变某些东西。然后尝试在不破坏集群上的cahche管理器或重新启动服务器的情况下运行客户端。

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

+0

超级。现在没事了。我重新启动服务器,所有工作。 – kenRoz

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>,在使用<String, String>你java代码:

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之间的不匹配;确保它们匹配! (复制/粘贴你的示例!)

+0

谢谢@Anthony – kenRoz