我正在java中设计一个Web服务,我需要在java中对请求进行AB测试。
基本上我正在寻找方法来轻松配置参数,这些参数将由请求处理程序动态加载,以根据配置值确定代码路径。
例如,假设我需要从外部Web服务或本地数据库获取一些数据。我希望有一种方法来配置参数(在此上下文中的条件),以便它确定是从外部Web服务还是从本地DB获取数据。如果我使用键值对配置系统,上面的示例可能会生成类似这样的内容。
locale=us
percentage=30
browser=firefox
这意味着我将从本地数据库中获取数据来获取来自其用户代理为firefox的美国用户的30%请求。我希望这个配置系统是动态的,这样服务器就不需要重新启动了。
抱歉非常高级别的描述,但任何见解/线索将不胜感激。 如果这是一个过去被打死的话题,请告诉我链接。
答案 0 :(得分:4)
我过去曾经用过这个。这是java中使用java.util.Properties实现所要求的最常用方法:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
/**
* Class that loads settings from config.properties
* @author Brant Unger
*
*/
public class Settings
{
public static boolean DEBUG = false;
/**
* Load settings from config.properties
*/
public static void load()
{
try
{
Properties appSettings = new Properties();
FileInputStream fis = new FileInputStream("config.properties"); //put config properties file to buffer
appSettings.load(fis); //load config.properties file
//This is where you add your config variables:
DEBUG = Boolean.parseBoolean((String)appSettings.get("DEBUG"));
fis.close();
if(DEBUG) System.out.println("Settings file successfuly loaded");
}
catch(IOException e)
{
System.out.println("Could not load settings file.");
System.out.println(e.getMessage());
}
}
}
然后在你的主要课程中你可以做到:
Settings.load(); //Load settings
然后你可以检查每个其他类中的变量值,如:
if (Settings.DEBUG) System.out.println("The debug value is true");
答案 1 :(得分:3)
我不确定它是否对您有所帮助,但我通常将配置数据放在一些可编辑的文件中:
vertices 3
n_poly 80
mutation_rate 0.0001f
photo_interval_sec 60
target_file monalisa.jpeg
randomize_start true
min_alpha 20
max_alpha 90
我使用这个类加载它:
import java.io.*;
import java.util.HashMap;
import java.util.Scanner;
public class Params
{
static int VERTICES = 0;
static int N_POLY = 0;
static float MUTATION_RATE = 0.0f;
static int PHOTO_INTERVAL_SEC = 0;
static String TARGET_FILE;
static boolean RANDOMIZE_START = false;
static int MIN_ALPHA = 0;
static int MAX_ALPHA = 0;
public Params()
{
Scanner scanner = new Scanner(this.getClass().getResourceAsStream("params.ini"));
HashMap<String, String> map = new HashMap<String, String>();
while (scanner.hasNext())
{
map.put(scanner.next(), scanner.next());
}
TARGET_FILE = map.get("target_file");
VERTICES = Integer.parseInt(map.get("vertices"));
N_POLY = Integer.parseInt(map.get("n_poly"));
MUTATION_RATE = Float.parseFloat(map.get("mutation_rate"));
PHOTO_INTERVAL_SEC = Integer.parseInt(map.get("photo_interval_sec"));
RANDOMIZE_START = Boolean.parseBoolean(map.get("randomize_start"));
MIN_ALPHA = Integer.parseInt(map.get("min_alpha"));
MAX_ALPHA = Integer.parseInt(map.get("max_alpha"));
}
}
然后加载并阅读:
// call this to load/reload the file
new Params();
// then just read
int vertices = Params.VERTICES;
希望它有所帮助!
答案 2 :(得分:0)
我刚刚发布了一个使用 .yml
文件的开源解决方案,这些文件可以加载到 POJO 中,从而创建一个比属性映射更好的解决方案。此外,该解决方案将系统属性和环境变量插入到占位符中:
url: ${database.url}
password: ${database.password}
concurrency: 12
这可以加载到 Map
或更好的 Java POJO。