【问题标题】:AKKA .conf file configuration to .properties fileAKKA .conf 文件配置到 .properties 文件
【发布时间】:2017-09-16 22:41:24
【问题描述】:

在我的 test.conf 文件中,我有以下配置

akka {
  actor {
    provider = "akka.cluster.ClusterActorRefProvider"

    serializers {
       java = "akka.serialization.JavaSerializer"
    }

    serialization-bindings {
        "java.io.Serializable" = "kyro"
    }
  }
}

我正在尝试将此配置放入 test.properties 文件中

akka.actor.provider=akka.cluster.ClusterActorRefProvider
akka.actor.serializers.java=akka.serialization.JavaSerializer
akka.actor.serialization-bindings."java.io.Serializable" = kryo

当我使用 test.conf 文件创建和 AKKA ActorSystem 时,它工作正常,但是当我使用 test.propeties 文件创建 ActorSytem 时

System.setProperty("config.file", "test.properties");
Config config = ConfigFactory.load();
ActorSystem testactor = ActorSystem.create("testactor", config);

这里我得到 java ClassNotFoundExcpetion : "java

我看到我将 akka.actor.serialization-bindings."java.io.Serializable" 放入 test.properties 文件的方式不正确。请建议将其放入 .properties 文件的正确方法。

【问题讨论】:

    标签: java akka actor properties-file hocon


    【解决方案1】:

    Typesafe 配置库允许加载属性对象和组合配置,因此您可以这样做:

    // or load it from a file using whatever logic you want
    Properties properties = new Properties();
    properties.setProperty("some.setting", "a-value");
    
    Config propConfig = ConfigFactory.parseProperties(properties);
    Config actualConfig = propConfig.withFallback(ConfigFactory.load("test.conf"));
    ActorSystem.create("name", actualConfig);
    

    更新:正如 Leo 在评论中指出的那样,如果您想覆盖 akka.actor.serialization-bindings."java.io.‌​Serializable",就我所见,Properties 确实是不可能的,因为引号。

    【讨论】:

    • 这不是一个选项。他想覆盖akka.actor.serialization-bindings."java.io.Serializable"。属性键不能有引号。
    • 当然可以:properties.put("akka.actor.serialization-bindings.\"java.io.Serializable\"", "someval") 工作正常。但是存在一个问题,即 Typesafe Config 库在解析属性时没有特别处理引号,它将完整类名中的点解释为子命名空间,因此它确实不适用于给定的用例。
    • 你说得对,但我更喜欢干净的方法并完全接受 HOCON。我的 2c。
    【解决方案2】:

    我知道您需要一个属性文件,但我认为您不能以这种方式声明密钥,并且还记得您手中有一个强大的配置工具。

    我建议将所有默认应用程序配置放在 reference.conf 中并使用 application.conf 覆盖,因此您可以在类路径中删除特定的 application.conf 以在 test/resources 上进行测试。

    这可能是你的java/resources/reference.conf:

    akka {
     actor {
      provider = "akka.cluster.ClusterActorRefProvider"
    
       serializers {
        java = "akka.serialization.JavaSerializer"
       }
    
      serialization-bindings {
       "java.io.Serializable" = "kyro"
      }
     }
    }
    

    然后你把它放在test/resources/application.conf 或任何你需要测试的地方:

    akka {
      serialization-bindings {
       "java.io.Serializable" = "java"
      }
    } 
    

    当您调用ConfigFactory.load() 时,所有文件都将合并到一个配置中。

    我建议阅读有关如何配置和覆盖配置的更多信息:http://doc.akka.io/docs/akka/current/general/configuration.html#Configuring_multiple_ActorSystem

    【讨论】:

    • 我只想维护一个配置文件,我的 test.conf 或 test.properties 而不是两者。如果是 test.properties,我需要知道如何放置序列化绑定属性。如果这个在 .properties 文件中是不可能的,我必须使用 test.conf 文件
    • 恐怕你在这种情况下是没有选择的。坚持使用 hocon 格式。
    • 不能使用 reference.conf 覆盖默认的 Akka 配置(akka 命名空间),因为如果看到这些设置,它将取决于类路径排序。
    猜你喜欢
    • 2011-02-19
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2018-06-20
    • 2019-04-25
    • 2016-09-05
    相关资源
    最近更新 更多