在 java 应用程序中使用 getPropertie() return null 对读取属性进行压力测试
Stress test reading properties with getPropertie() return null in java application
我有一个包含 class 的 jar,除其他外,它读取属性并在构造函数中使用 getProperty 提取一些属性。
当我测试 jar 并使用 jmeter 通过提高并行线程对其进行压力 时,仅在某些情况下它 returns 某些属性为空。当我不强调它时,不会发生这种情况。
我使用 jdk-14 而不是 windows 10。
这是我的源代码,由于版权原因做了一些修改。
在此先感谢您的帮助!!
public class Connector {
private static properties;
private static int port = 0;
private static String host = null;
private static int timeOutRead = 0;
private static int timeOutConnect = 0;
private static final Logger log = Logger.getLogger(Connector.class);
public Connector() {
try {
Logg logg = new Logg();
logg.initLoggerProperties();
log.info("Constructor of Connector class");
properties = readProperties("configurations/conector.properties");
port = Integer.parseInt(properties.getProperty("port"));
host = properties.getProperty("host");
timeOutRead = Integer.parseInt(properties.getProperty("timeOutRead"));
timeOutConnect = Integer.parseInt(properties.getProperty("timeOutConnect"));
properties.clear();
log.info(metodo + "port[" + port + "].");
log.info(metodo + "host[" + host + "].");
log.info(metodo + "timeOutRead[" + timeOutRead+ "].");
log.info(metodo + "timeOutConnect["+ timeOutConnect + "].");
} catch (Exception ex) {
log.error(metodo
+ "[ConectorCIO]::[ConectorCIO]::Se ha producido una exception del tipo:"
+ ex.getMessage(), ex);
}
}
private Properties readProperties(String pathAndName)
throws FileNotFoundException, IOException {
InputStream is = getClass().getClassLoader().getResourceAsStream(pathAndName);
Properties properties = new Properties();
properties.load(is);
is.close();
return properties;
}
//others functions
}
您需要使您的字段非静态。那会解决你的问题。
问题出在以下两行:
properties = readProperties("configurations/conector.properties");
properties.clear();
当第一个线程正在填充属性时,其他线程可能会在它被读取之前清除它。
当您从不同的线程访问相同的字段而没有将它们标记为易失性时,这里也可能出现其他工件(这只是估计的描述,更多可以搜索为 Java 内存模型(JMM))。
此外,您可以考虑将方法的所有代码放在 synchronized
块中。但请注意,没有线程能够并行执行代码,其他线程会等待。
P.S。看起来 Singleton 就是你需要的。
我有一个包含 class 的 jar,除其他外,它读取属性并在构造函数中使用 getProperty 提取一些属性。
当我测试 jar 并使用 jmeter 通过提高并行线程对其进行压力 时,仅在某些情况下它 returns 某些属性为空。当我不强调它时,不会发生这种情况。
我使用 jdk-14 而不是 windows 10。
这是我的源代码,由于版权原因做了一些修改。
在此先感谢您的帮助!!
public class Connector {
private static properties;
private static int port = 0;
private static String host = null;
private static int timeOutRead = 0;
private static int timeOutConnect = 0;
private static final Logger log = Logger.getLogger(Connector.class);
public Connector() {
try {
Logg logg = new Logg();
logg.initLoggerProperties();
log.info("Constructor of Connector class");
properties = readProperties("configurations/conector.properties");
port = Integer.parseInt(properties.getProperty("port"));
host = properties.getProperty("host");
timeOutRead = Integer.parseInt(properties.getProperty("timeOutRead"));
timeOutConnect = Integer.parseInt(properties.getProperty("timeOutConnect"));
properties.clear();
log.info(metodo + "port[" + port + "].");
log.info(metodo + "host[" + host + "].");
log.info(metodo + "timeOutRead[" + timeOutRead+ "].");
log.info(metodo + "timeOutConnect["+ timeOutConnect + "].");
} catch (Exception ex) {
log.error(metodo
+ "[ConectorCIO]::[ConectorCIO]::Se ha producido una exception del tipo:"
+ ex.getMessage(), ex);
}
}
private Properties readProperties(String pathAndName)
throws FileNotFoundException, IOException {
InputStream is = getClass().getClassLoader().getResourceAsStream(pathAndName);
Properties properties = new Properties();
properties.load(is);
is.close();
return properties;
}
//others functions
}
您需要使您的字段非静态。那会解决你的问题。
问题出在以下两行:
properties = readProperties("configurations/conector.properties");
properties.clear();
当第一个线程正在填充属性时,其他线程可能会在它被读取之前清除它。
当您从不同的线程访问相同的字段而没有将它们标记为易失性时,这里也可能出现其他工件(这只是估计的描述,更多可以搜索为 Java 内存模型(JMM))。
此外,您可以考虑将方法的所有代码放在 synchronized
块中。但请注意,没有线程能够并行执行代码,其他线程会等待。
P.S。看起来 Singleton 就是你需要的。