为hazelcast创建自定义发现策略时遇到问题

时间:2019-08-06 18:23:17

标签: java hazelcast apache-karaf bnd

我正在尝试使用Cellar在Karaf内的OSGI实例中为Hazelcast实施我的自定义发现策略。

我在Cellar的启动级别上尝试过一些延迟启动。我使用hazelcast.xml使用了不同的配置。我试图将实现的捆绑打包成淡褐色,但没有运气。

<discovery-strategies>
        <discovery-strategy enabled="true"
            class="my.custom.discovery.strat.WebDiscoveryFactory">
          <properties>
            <property name="application.scope">my-group</property>
          </properties>
        </discovery-strategy>
      </discovery-strategies>
<property name="hazelcast.discovery.enabled">true</property>

我的自定义限制


public class WebDiscoveryFactory implements DiscoveryStrategyFactory {

    /**
     * Defines a name for the application scope. All instances registered using
     * the same application scope will automatically be discovered.
     * <p/>
     * <
     * pre>default: hazelcast-cluster</pre>
     */
    @Override
    public Class<? extends DiscoveryStrategy> getDiscoveryStrategyType() {
        return WebDiscoveryStrategy.class;
    }

    @Override
    public DiscoveryStrategy newDiscoveryStrategy(DiscoveryNode discoveryNode,
            ILogger logger, Map<String, Comparable> properties) {
        return new WebDiscoveryStrategy(discoveryNode, logger, properties);
    }

    @Override
    public Collection<PropertyDefinition> getConfigurationProperties() {
        Collection<PropertyDefinition> PROPERTY_DEFINITIONS
                = //
                Collections.unmodifiableCollection(Arrays.asList(APPLICATION_SCOPE, DISCOVERY_URL));
        return PROPERTY_DEFINITIONS;
    }

    private static final ValueValidator URL_VALIDATOR = value -> {
        String url = value.toString();
        try {
            new URL(url);
        } catch (Exception e) {
            throw new ValidationException(e);
        }
    };

}

它应该像正常情况一样开始,但是看来我的自定义实现没有足够快地在hazelcast的共享路径上跳转,并且停止了。注意:如果我从hazelcast.xml中删除我的自定义实现,它会很好地工作

14:01:58.114 INFO [features-3-thread-1] Registering commands for bundle org.apache.karaf.cellar.webconsole/4.1.3
14:01:58.115 INFO [features-3-thread-1]   org.apache.geronimo.specs.geronimo-jta_1.1_spec/1.1.1
14:01:58.118 INFO [features-3-thread-1] Deployment finished. Registering FeatureDeploymentListener
14:01:58.197 INFO [pool-9-thread-1] [LOCAL] [cellar] [3.9.1] Prefer IPv4 stack is true.
14:01:58.201 INFO [pool-9-thread-1] [LOCAL] [cellar] [3.9.1] Picked [172.17.0.1]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
14:01:58.215 INFO [pool-9-thread-1] [172.17.0.1]:5701 [cellar] [3.9.1] Hazelcast 3.9.1 (20171130 - feca534) starting at [172.17.0.1]:5701
14:01:58.215 INFO [pool-9-thread-1] [172.17.0.1]:5701 [cellar] [3.9.1] Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
14:01:58.216 INFO [pool-9-thread-1] [172.17.0.1]:5701 [cellar] [3.9.1] Configured Hazelcast Serialization version: 1
14:01:58.221 INFO [features-3-thread-1] Done.
14:01:58.445 INFO [pool-9-thread-1] [172.17.0.1]:5701 [cellar] [3.9.1] Backpressure is disabled
14:01:58.700 WARN [pool-9-thread-1] Error starting activator
com.hazelcast.config.InvalidConfigurationException: Invalid configuration
    at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.loadDiscoveryStrategies(DefaultDiscoveryService.java:151) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.<init>(DefaultDiscoveryService.java:60) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.spi.discovery.impl.DefaultDiscoveryServiceProvider.newDiscoveryService(DefaultDiscoveryServiceProvider.java:29) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.instance.Node.createDiscoveryService(Node.java:265) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.instance.Node.<init>(Node.java:216) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.instance.HazelcastInstanceImpl.createNode(HazelcastInstanceImpl.java:160) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.instance.HazelcastInstanceImpl.<init>(HazelcastInstanceImpl.java:128) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.instance.HazelcastInstanceFactory.constructHazelcastInstance(HazelcastInstanceFactory.java:195) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.instance.HazelcastInstanceFactory.newHazelcastInstance(HazelcastInstanceFactory.java:174) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.instance.HazelcastInstanceFactory.newHazelcastInstance(HazelcastInstanceFactory.java:124) ~[28:com.hazelcast:3.9.1]
    at com.hazelcast.core.Hazelcast.newHazelcastInstance(Hazelcast.java:58) ~[28:com.hazelcast:3.9.1]
    at org.apache.karaf.cellar.hazelcast.factory.HazelcastServiceFactory.buildInstance(HazelcastServiceFactory.java:77) ~[88:org.apache.karaf.cellar.hazelcast:4.1.3]
    at org.apache.karaf.cellar.hazelcast.factory.HazelcastServiceFactory.getInstance(HazelcastServiceFactory.java:62) ~[88:org.apache.karaf.cellar.hazelcast:4.1.3]
    at org.apache.karaf.cellar.hazelcast.internal.osgi.Activator.doStart(Activator.java:168) ~[88:org.apache.karaf.cellar.hazelcast:4.1.3]
    at org.apache.karaf.util.tracker.BaseActivator.run(BaseActivator.java:242) [88:org.apache.karaf.cellar.hazelcast:4.1.3]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:?]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:?]
    at java.lang.Thread.run(Thread.java:748) [?:?]
Caused by: com.hazelcast.config.properties.ValidationException: There is no discovery strategy factory to create 'DiscoveryStrategyConfig{properties={application.scope=my-group}, className='my.custom.discovery.strat.WebDiscoveryFactory', discoveryStrategyFactory=null}' Is it a typo in a strategy classname? Perhaps you forgot to include implementation on a classpath?
    at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.buildDiscoveryStrategy(DefaultDiscoveryService.java:188) ~[?:?]
    at com.hazelcast.spi.discovery.impl.DefaultDiscoveryService.loadDiscoveryStrategies(DefaultDiscoveryService.java:145) ~[?:?]
    ... 19 more

1 个答案:

答案 0 :(得分:0)

您很可能忘记了添加META-INF/services文件。请检查现有的发现插件以了解详细信息。

例如,您可以选中hazelcast/hazelcast-kubernetes,它是META-INF/services/com.hazelcast.spi.discovery.DiscoveryStrategyFactory

相关问题