使用 AWS 加入策略时 Vertx Hazelcast 集群错误 "There is no discovery strategy factory to create ..."

Vertx Hazelcast Cluster Error "There is no discovery strategy factory to create ..." when using AWS Join Strategy

我正在尝试在 aws 中设置一个简单的顶点集群。(您可以找到所有代码 here

在 pom 文件中,我已经添加了我需要的所有依赖项,包括 vertx-hazelcast 和 aws 的 hazelcast 插件。

至于主 Class 它非常简单,所有 hazelcast 设置都在主 class 中准备。

public class Main {
    public static void main(String[] args) {
        Logger log = Logger.getLogger(Main.class.getSimpleName());
        Config hazelcastConfig = new Config();


        hazelcastConfig.getNetworkConfig().getInterfaces().
                 setEnabled(true).addInterface("10.0.*.*");
        JoinConfig joinConfig = hazelcastConfig.getNetworkConfig().getJoin();
        joinConfig.getMulticastConfig().setEnabled(false);
        joinConfig.getAwsConfig()
                .setEnabled(true)
                .setProperty("region", "ap-southeast-1")
                .setProperty("tag-key", "aws:cloudformation:stack-name")
                .setProperty("tag-value", "EC2ContainerService-test-cluster");
        hazelcastConfig.getNetworkConfig().setJoin(joinConfig);


        ClusterManager mgr = new HazelcastClusterManager(hazelcastConfig);
        String hostAddress = getAddress();

        VertxOptions options = new VertxOptions()
                .setClusterManager(mgr)
                .setHAEnabled(true);

        EventBusOptions ebOptions = new EventBusOptions()
                .setClustered(true)
                .setHost(hostAddress);

        options.setEventBusOptions(ebOptions);

        Vertx.clusteredVertx(options, handler->{
            if(handler.succeeded()){
                DeploymentOptions containerOption = new DeploymentOptions().setHa(false); 
                handler.result().deployVerticle(Verticle.class,containerOption,deployHandler->{
                    if(handler.succeeded()){
                        log.info("Verticle Deployed");
                    }else{
                        log.severe("Verticle Deployment Failed");
                    }
                });
            } else{
                log.severe(handler.cause().getMessage());
            }
        });

    }
}

每当我 运行 fat jar 时,我总是 运行 进入这个错误。

Caused by: com.hazelcast.config.properties.ValidationException: There is no discovery strategy factory to create 'D
iscoveryStrategyConfig{properties={tag-value=EC2ContainerService-test-cluster, region=ap-southeast-1, tag-key=aws:c
loudformation:stack-name}, className='com.hazelcast.aws.AwsDiscoveryStrategy', discoveryStrategyFactory=null}' Is i
t a typo in a strategy classname? Perhaps you forgot to include implementation on a classpath?

我的代码中是否缺少任何内容?

错误消息通常表示您的类路径中没有 hazelcast-aws.jar 插件。

我看到你的 Maven 依赖项中有它,但请确保:

  1. 您使用与您的 hazelcast 版本兼容的 hazelcast-aws 版本(您可以找到兼容性信息 here)。
  2. 您的 JAR 确实包含 com.hazelcast.aws 包中的 类。
  3. 您的 JAR 包含文件 resources/META-INF/services/com.hazelcast.spi.discovery.DiscoveryStrategyFactory
  4. 您的 resources/META-INF/services/com.hazelcast.spi.discovery.DiscoveryStrategyFactory 确实包含条目 com.hazelcast.aws.AwsDiscoveryStrategyFactory

如果以上任何一项都不正确,那么您需要重新审视您的胖 JAR 是如何构建的。使这一切都到位的解决方案之一是依赖于 hazelcast-all(而不是 hazelcast)。这将使您摆脱所有这些问题。