2017-04-20 82 views
1

在我test.conf文件我有以下的配置AKKA .conf文件配置的.properties文件

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

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

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

我试图把这个configuation在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绑定的方式。”test.properties文件中的java.io.Serializable“是不正确的。请提示正确方式把它放在.properties文件中。

回答

0

我明白你想要一个属性文件,虽然我不认为你可以用这种方式声明一个键,也记得你有一个强大的配置工具在你的手中。

我建议把所有的默认应用程序配置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

+0

我想维护只有一个配置文件我的test.conf或test.properties,而不是两者。在test.properties的情况下,我需要知道如何把序列化绑定属性。如果这是不可能的。属性文件我必须去test.conf文件 –

+0

恐怕你在这种情况下没有选择。坚持使用hocon格式。 – Leo

+0

重写默认的Akka配置('akka'命名空间)不能使用'reference.conf'来完成,因为如果这些设置被看到,它将取决于类路径排序。 – johanandren

-1

类型安全配置库允许加载属性的对象,并结合CONFIGS,所以你可以这样做:

// 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确实无法实现。

+0

这不是一个选项。他想覆盖'akka.actor.serialization-bindings。“java.io.Serializable”'。属性键不能有引号afaik。 – Leo

+1

当然他们可以:'properties.put(“akka.actor.serialization-bindings。\”java.io.Serializable \“”,“someval”)'工作正常。然而,Typesafe Config库在解析属性时并未特别处理引号,因此它会将整个类名称中的点解释为子名称空间,因此对于给定的用例确实不起作用。 – johanandren

+0

你是对的,但我更喜欢干净的方法,并且完全接受HOCON。我的2c。 – Leo

相关问题