我有一个应用程序,我有一个功能,通过application.properties中的设置启用或禁用,如
app.thingEnabled=true
当然,这可能是真的,也可能是假的。我有我的控制器:
@Value("${app.thingEnabled:true}")
private boolean thingEnabled;
当然,我们检查这是真是假,然后做或不做。
现在,我想让它有一个反馈机制...就像,Thing功能写入数据库。如果DB代码捕获超时异常,请将thingEnabled设置为false 5分钟,然后再试一次。那种事。
春天有可能吗?我已经考虑过创建一个单独的组件,例如,一个" ThingConfiguration"可以在其上设置属性然后将属性连接到该属性并让控制器调用它。然后它可以有一个可以动态更新的getter和setter,但似乎可能有更好的方法。
我也不完全确定这些类在什么时候实例化,以及它们是否在多个请求服务线程中是通用的。
其次,有没有办法启动一个休眠5分钟的线程然后做一些工作而不必深入挖掘低级线程api?我看到那里有一个@Scheduled的东西,但看起来它意味着反复运行一些工作,而不是代码本身启动的东西。
答案 0 :(得分:0)
您可能想要分离的一件事是您的激活运行查询的资格。 thingEnabled
确定您的流程是否已激活。某些 else 应该确定它是否符合条件。
归根结底,这取决于你如何编写查询,但Spring没有任何本机可以在X分钟内休眠,然后重新启动查询。但是,如果您拆分逻辑以确定资格,那么编写一些内容以检查时间增量是否符合您的标准变得有些简单。 (我将此作为练习留给读者)。
答案 1 :(得分:0)
回答标题:
在SpringBoot中以编程方式设置属性的值
Spring仅在应用程序开始时查找@Value
注释,在第一次实例化后它不会自行更新。例如:
@Value("${app.thingEnabled:true}")
private boolean thingEnabled;
这会将thingEnabled
设置为您在application.properties
中设置的值,如果找不到该属性,则设置为true
。
之后,如果您将thingEnabled
设置为false,它将保持为false。基本上,Spring只会在开始时分配thingEnabled
的值,除非你自己做,否则不会再做任何更改。
在你的情况下,
现在,我想让它有一个反馈机制...就像,事情 功能写入数据库。如果DB代码捕获超时 异常,将thingEnabled设置为false,持续5分钟,然后再试一次。
粗略地转化为:
// database operation...
} catch (SQLTimeoutException e) {
thingEnabled = false;
// start a timerTask that will run in 5 minute, and then execute your code again
}
但thingEnabled
在这种情况下并不真正相关,我不明白feedback
在这里你的意思。
我假设你的意思是后退。
在这种情况下,您将执行以下操作:
// database operation...
} catch (SQLTimeoutException e) {
if (thingEnabled) { // if the fallback is enabled
// start a timerTask that will run in 5 minute, and then execute your code again
}
}
这样,设置app.thingEnabled
实际上是相关的:
app.thingEnabled
为true
,请在超时异常后重试5分钟app.thingEnabled
为false
,请勿重试。