PropKit使用use和不使用use读取配置文件参数似乎有BUG???

@JFinal

我的代码在主启动class里加载了两个配置文件,之后在controller里需要读配置文件信息。按文档里的说法,PropKit不使用use直接get就是读取第一个加载的配置文件里的内容,使用use就是读指定use的配文件内容。

我的代码调用

PropKit.get("default.port", "5000");

也就是读第一个加载的配置文件里的内容,测试没问题,但我用ab压力测试执行了一次500*100次,发现控制台有不少输入了报错信息,意思是在调动get之前,需要使用use加载文件。

之后,我强制这么写

PropKit.use(ConstantConfig.CONFIG_FILE).get("default.port", "5000");

其中ConstantConfig.CONFIG_FILE就是第一次加载的主配置文件名称

然后再用ab压测,后台就没报这种异常了。

不知道哪里出问题了,提请波总判断一下。

备注:我的环境:

Starting JFinal 4.7 -> http://0.0.0.0:8888

Info: jfinal-undertow 1.9, undertow 2.0.28.Final, jvm 1.8.0_202-ea

Starting Complete in 3.1 seconds. Welcome To The JFinal World (^_^)


评论区

JFinal

2020-04-07 11:24

大概率原因是:某个线程的 PropKit.get(...) 动作在 PropKit.use(...) 之前被调用了

这里的关键是:PropKit.get(...) 一定要在 PropKit.use(...) 被调用过至少一次以后才能使用

JFinal

2020-04-07 11:25

解决办法是要确保 PropKit.use(...) 被先调用过一次,这里要检查 ab 测试时并发调用的情况是不是导致了 PropKit.get(...) 先于 PropKit.use(...) 调用的情况

zzutligang

2020-04-07 13:10

我是在主类里的configPlugin的时候,用PropKit.use(ConstantConfig.CONFIG_FILE).appendIfExists(ConstantConfig.CONFIG_FILE_PRO);先加载的主配置文件。同时在后面还加载了另外一个配置文件。报错的地方是在controller里。按说,程序通过主类启动起来后,配置文件应该是已经正常加载到内存里了。我刚才试了一下,我提前PropKit.use()加载配置文件后返回的Prop放到一个全局静态变量里(一个全局静态类),然后直接通过这个返回的对象调用get是没问题的。我猜想是不是在多线程的情况下PropKit.get(...)没有拿到那个默认的主配置的Prop对象或则拿到的是个新建的Prop对象呢。反正现在我是在所有需要读配置的地方都强制加了use方法了。之前直接get的地方都改了。

JFinal

2020-04-07 16:38

@zzutligang 应该只是一个先后问题,只要 use 一次, 后面一直 get 就可以了

zzutligang

2020-04-07 17:27

@JFinal 但分明我在主类里已经use一次了,那次的use是第一次加载配置文件。另外我刚刚做了一个测试,程序启动起来后(eclipse里直接运行),随便操作在浏览器里点几次,都是正常的,然后开始用ab请求一个页面,eclipse控制台里面一样会出现若干那个“调用get之前需要用use加载文件”的异常抛出。

JFinal

2020-04-07 17:30

@zzutligang 这正是要排查的地方, 找到一个最早被调用的地方使用 use 方法,例如在 MyConfig 的 configConstant(Constants me) 中做这事:
public class MyConfig extends JFinalConfig {
public void configConstant(Constants me) {
PropKit.use(...);
...
}

...
}

JFinal

2020-04-07 17:30

configConstant 是被很早调用的

zzutligang

2020-04-07 21:36

@JFinal 那我把加载配置文件的操作放到configConstant试试。

JFinal

2020-04-07 21:38

@zzutligang 记得回来反馈下结果

zzutligang

2020-04-08 09:45

@JFinal 不行,效果一样!!!

JFinal

2020-04-08 11:01

@zzutligang 提供更多的你的测试细节,才能找到原因

当前你给的信息量肯定是不够的

热门反馈

扫码入社