2016-02-17 17 views
2

Hazelcast無法創建ObjectName中使用文件時| HTTP(S)協議使用hazelcast 3.6於此異常運行後

java.lang.IllegalArgumentException異常:無法在 com.hazelcast創建一個ObjectName .jmx.HazelcastMBean.setObjectName在 com.hazelcast.jmx.ConnectionManagerMBean(HazelcastMBean.java:116) 。(ConnectionManagerMBean.java:39) 在 com.hazelcast.jmx.InstanceMBean.createMBeans(InstanceMBean.java:74) at com.hazelcast.jmx.InstanceMBean。(InstanceMBean.java:67)at com.hazelcast.jmx.ManagementService。(ManagementService.java:67) 在 com.hazelcast.instance.HazelcastInstanceImpl。(HazelcastInstanceImpl.java:136) 在 com.hazelcast.instance.HazelcastInstanceFactory.constructHazelcastInstance(HazelcastInstanceFactory.java :160) 在 com.hazelcast.instance.HazelcastInstanceFactory.getOrCreateHazelcastInstance(HazelcastInstanceFactory.java:98) 在 com.hazelcast.cache.impl.HazelcastServerCachingProvider.getOrCreateInstance(HazelcastServerCachingProvider.java:98) 在 com.hazelcast。 cache.impl.HazelcastServerCachingProvider.createHazelcastCacheManager(HazelcastServerCachingProvider.java:64) at com.hazelcast.cache.impl.HazelcastServerCachingProvider.createHazelcastCacheManager在 com.hazelcast.cache.HazelcastCachingProvider在 com.hazelcast.cache.impl.AbstractHazelcastCachingProvider.getCacheManager(AbstractHazelcastCachingProvider.java:94)(HazelcastServerCachingProvider.java:42) .getCacheManager(HazelcastCachingProvider.java:131)

我把看代碼,這是造成錯誤的這一部分,對文件:HazelcastServerCachingProvider.java(開始於行:78):

String location = properties.getProperty(HazelcastCachingProvider.HAZELCAST_CONFIG_LOCATION); 
// If config location is specified, get instance through it. 
if (location != null) { 
    URI uri = new URI(location); 
    String scheme = uri.getScheme(); 
    if (scheme == null) { 
      // It is a place holder 
      uri = new URI(System.getProperty(uri.getRawSchemeSpecificPart())); 
    } 
    ClassLoader theClassLoader = classLoader == null ? getDefaultClassLoader() : classLoader; 
    final URL configURL; 
    if ("classpath".equals(scheme)) { 
      configURL = theClassLoader.getResource(uri.getRawSchemeSpecificPart()); 
    } else if ("file".equals(scheme) || "http".equals(scheme) || "https".equals(scheme)) { 
      configURL = uri.toURL(); 
    } else { 
      throw new URISyntaxException(location, "Unsupported protocol in configuration location URL"); 
    } 
    try { 
      Config config = new XmlConfigBuilder(configURL).build(); 
      config.setClassLoader(theClassLoader); 

      **HERE BAD INSTANCENAME IS GENERATED** 
      config.setInstanceName(configURL.toString()); 
      return HazelcastInstanceFactory.getOrCreateHazelcastInstance(config); 
    } catch (Exception e) { 
      throw ExceptionUtil.rethrow(e); 
    } 
} 

在傳遞的hazelcast_config_location中使用文件或http(s)協議時,我們將無法創建mbean,因爲hazelCastInstanceName不應包含字符':',這不幸是configURI名稱的一部分。

這是一個錯誤還是我忽略了一些東西?

感謝您的答覆

+1

嗨,這個問題在這裏跟蹤:[#7548](https://github.com/hazelcast/hazelcast/issues/7548) – questioner

+2

嗨,似乎它是由未引用的名稱屬性引起的'ConnectionManagerMBean'中的名稱。我們會盡快解決它。感謝您報告問題。 –

回答

2

的javax ObjectName類不支持的字符:並拋出一個MalformedObjectNameException。 Hazelcast處理這個異常,並輸出IllegalArgumentException,消息來自它。

https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/java/com/hazelcast/internal/jmx/HazelcastMBean.java#L121

https://docs.oracle.com/javase/7/docs/api/javax/management/ObjectName.html

編輯:quote功能應該在您的案件已經處理了它然而,在赫茲顯然是一個錯誤。見:https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/java/com/hazelcast/internal/jmx/ConnectionManagerMBean.java#L38

+0

嗨,穆拉特,我應該也可以通過用於初始化CacheManager的屬性來傳遞InstanceName,就像在''hazelcast.location.name'**'的屬性沒有給出時那樣。 – questioner

+1

嘿@questioner,這兩個問題都在3.6.1中修復。到目前爲止,您可以在實例名稱中使用':'而不引起JMX異常。另外,如果您在config('')中設置了實例名稱,或者在設置配置位置的屬性文件中添加了'HazelcastCachingProvider.HAZELCAST_INSTANCE_NAME'屬性,它將被用來代替uri。 –