【问题标题】:In OSGI Environment com.hazelcast.nio.serialization.HazelcastSerializationException在 OSGI 环境中 com.hazelcast.nio.serialization.HazelcastSerializationException
【发布时间】:2015-12-09 12:29:32
【问题描述】:

我正在使用 felix maven 插件和(N 包)运行一个 OSGI 插件项目,我已经将 hazelcast 集成到其中。在其下创建 hazelcast 实例的类“ConfigurationService”被标记为单例,我正在使用默认配置来创建 hazelcast 实例。

下面是代码sn-p。

private static ROIConfigurationServer configService;

private HazelcastInstance hazelcastInstance;


public static ROIConfigurationServer getConfigurationService()throws ConfigServerInitializationException{

if(configService==null){
            synchronized(ROIConfigurationServer.class){
                try{
                    logger.debug("initialized ROIConfigurationServer");
                    HazelcastInstance hazelcastInstance=Hazelcast.newHazelcastInstance();
                    List<String> imapkeys=new ArrayList<>();
                    IMap<String,String> configGroupKeys=hazelcastInstance.getMap(ConfigurationConstant.CONFIG_GROUP_KEYS);
                    configService=new ROIConfigurationServer(hazelcastInstance,configGroupKeys);
                }catch(Exception exp){
                    logger.error("ROIConfigurationServer initializatiob error", exp);
                    throw new ConfigServerInitializationException("Failed to initialize the ConfigServer",exp);
                }
            }
        }
        return configService;
    }//end of singleton method

单例类“ConfigurationService”具有 addConfiguration() 方法,它将 ConfigurationUnit(pojo 类)对象添加到 hazelcast map 对象中,以及 getConfiguration() 从 hazelcast Map 中获取 ConfigurationUnit 对象并部署为捆绑包“config-service”捆绑包。

另一个名为“feature-extender-v3”的包使用扩展器模式调用 addConfiguration() 并成功将配置数据添加到 hazelcast 但在调用 getConfiguration() 时出现以下错误

全栈跟踪:

ERROR: Bundle feature-extender-v3 [157] EventDispatcher: Error during dispatch. (com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: com.getusroi.config.server.ConfigurationUnit)
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: com.getusroi.config.server.ConfigurationUnit
    at com.hazelcast.nio.serialization.DefaultSerializers$ObjectSerializer.read(DefaultSerializers.java:201)
    at com.hazelcast.nio.serialization.StreamSerializerAdapter.read(StreamSerializerAdapter.java:41)
    at com.hazelcast.nio.serialization.SerializationServiceImpl.toObject(SerializationServiceImpl.java:276)
    at com.hazelcast.spi.impl.NodeEngineImpl.toObject(NodeEngineImpl.java:200)
    at com.hazelcast.map.impl.MapServiceContextImpl.toObject(MapServiceContextImpl.java:281)
    at com.hazelcast.map.impl.proxy.MapProxySupport.toObject(MapProxySupport.java:1114)
    at com.hazelcast.map.impl.proxy.MapProxyImpl.get(MapProxyImpl.java:82)
    at com.getusroi.config.server.ROIConfigurationServer.getConfiguration(ROIConfigurationServer.java:133)
    at com.getusroi.feature.config.impl.FeatureConfigurationService.getFeatureConfiguration(FeatureConfigurationService.java:41)
    at com.getusroi.feature.config.impl.FeatureConfigurationService.addFeatureConfiguration(FeatureConfigurationService.java:28)
    at com.getusroi.feature.resources.helper.FMIResources.getFeaturesImplementationResource(FMIResources.java:111)
    at com.getusroi.feature.resources.helper.FMIResources.getEventResources(FMIResources.java:37)
    at com.getusroi.feature.extender.FeatureMetaInfoExtender.addedBundle(FeatureMetaInfoExtender.java:89)
    at com.getusroi.feature.bundle.tracker.BundleTracker$1.bundleChanged(BundleTracker.java:65)
    at org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:870)
    at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:791)
    at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:515)
    at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4650)
    at org.apache.felix.framework.Felix$4.run(Felix.java:2123)
    at org.apache.felix.framework.Felix.runInContext(Felix.java:2147)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2121)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
    at org.apache.karaf.shell.osgi.InstallBundle.doExecute(InstallBundle.java:51)
    at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
    at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:35)
    at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
    at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
    at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
    at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
    at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
    at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
    at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
    at org.apache.karaf.shell.console.jline.Console.run(Console.java:189)
    at java.lang.Thread.run(Thread.java:745)
    at org.apache.karaf.shell.ssh.ShellFactoryImpl$ShellImpl$4.doRun(ShellFactoryImpl.java:158)
    at org.apache.karaf.shell.ssh.ShellFactoryImpl$ShellImpl$4$1.run(ShellFactoryImpl.java:149)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:47)
    at org.apache.karaf.shell.ssh.ShellFactoryImpl$ShellImpl$4.run(ShellFactoryImpl.java:147)
Caused by: java.lang.ClassNotFoundException: com.getusroi.config.server.ConfigurationUnit
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:125)
    at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:114)
    at com.hazelcast.nio.IOUtil$1.resolveClass(IOUtil.java:113)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at com.hazelcast.nio.serialization.DefaultSerializers$ObjectSerializer.read(DefaultSerializers.java:196)
    ... 39 more

我查看了另一个具有类似问题的堆栈跟踪“com.hazelcast.nio.serialization.HazelcastSerializationException”,但不明白。我应该如何使用默认配置而不是使用 hazelcast Config 来解决这个问题?

【问题讨论】:

  • 虽然它看起来像@Serkan Ozal 建议的类加载器问题,但我想知道为什么根据 osgi 类加载方案的父类加载器无法找到您的 com.getusroi.config.server.ConfigurationUnit。你能粘贴 feature-extender-v3 的清单来看看类加载可能是如何失败的吗?

标签: java serialization osgi hazelcast


【解决方案1】:

你能通过给一个指定的Config 来创建 Hazelcast 实例吗?

问候。

【讨论】:

  • Serkan Özal ...您能否详细解释一下。我必须使用默认配置。我没有在类路径中指定任何 hazelcast.xml 文件。
  • @DeepaliSingh 我的意思是,以编程方式创建具有指定配置的 Hazelcast 实例。您可以通过“Config config = new Config();”创建默认配置并且可以通过“config.setClassloader(myClassLoader);”配置你的类加载器然后您可以在创建 Hazelcast 实例时指定此配置,例如“HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(config);”
  • 我需要在 config.setClassLoader(myclassLoader) 代码中提供什么。你能提供一些例子吗?我需要帮助。
  • @DeepaliSingh 你应该设置一个知道com.getusroi.config.server.ConfigurationUnit类的类加载器
  • 如果我提供了这样的东西:Confi config=new CConfig();然后, config.setClassLoader(ConfigurationUnit.getclass().getClassLoader());那行得通吗?还是我应该使用 TCCL?正如我浏览了许多链接,它说 TCCL 不是 OSGI 的好选择。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多