除了手动更改主机上的系统时钟之外,是否有一种方法可以通过代码或使用JVM参数来覆盖通过System.currentTimeMillis
呈现的当前时间?
下面是一些背景知识:
我们有一个系统,它运行许多会计作业,这些作业的大部分逻辑都围绕当前日期(例如,每月1号,每年1号等)
不幸的是,许多遗留代码都会调用new Date()
或Calendar.getInstance()
等函数,这两个函数最终都会向下调用System.currentTimeMillis
。
为了测试的目的,现在,我们被困在手动更新系统时钟来操纵代码认为测试正在运行的时间和日期。
所以我的问题是:
有没有办法覆盖System.currentTimeMillis
返回的内容?例如,告诉JVM在从该方法返回之前自动添加或减去一些偏移量?
提前感谢!
发布于 2017-11-03 17:41:46
如果您运行的是Linux,那么可以使用libfaketime的主分支,或者在测试提交4ce2835时使用。
只需将环境变量设置为您想用来模拟java应用程序的时间,然后使用ld-preloading运行它:
# bash
export FAKETIME="1985-10-26 01:21:00"
export DONT_FAKE_MONOTONIC=1
LD_PRELOAD=/usr/local/lib/faketime/libfaketimeMT.so.1 java -jar myapp.jar
第二个环境变量对于java应用程序非常重要,否则java应用程序将会冻结。在编写本文时,它需要libfaketime的主分支。
如果您想更改systemd管理服务的时间,只需将以下内容添加到您的单元文件覆盖中,例如,对于elasticsearch,这将是/etc/systemd/system/elasticsearch.service.d/override.conf
[Service]
Environment="FAKETIME=2017-10-31 23:00:00"
Environment="DONT_FAKE_MONOTONIC=1"
Environment="LD_PRELOAD=/usr/local/lib/faketime/libfaketimeMT.so.1"
不要忘记使用` `systemctl daemon-reload重新加载systemd
https://stackoverflow.com/questions/2001671
复制相似问题