在SpringBoot中以编程方式设置属性的值

时间:2018-04-20 16:03:46

标签: java spring spring-boot

我有一个应用程序,我有一个功能,通过application.properties中的设置启用或禁用,如

app.thingEnabled=true

当然,这可能是真的,也可能是假的。我有我的控制器:

@Value("${app.thingEnabled:true}")
private boolean thingEnabled;

当然,我们检查这是真是假,然后做或不做。

现在,我想让它有一个反馈机制...就像,Thing功能写入数据库。如果DB代码捕获超时异常,请将thingEnabled设置为false 5分钟,然后再试一次。那种事。

春天有可能吗?我已经考虑过创建一个单独的组件,例如,一个" ThingConfiguration"可以在其上设置属性然后将属性连接到该属性并让控制器调用它。然后它可以有一个可以动态更新的getter和setter,但似乎可能有更好的方法。

我也不完全确定这些类在什么时候实例化,以及它们是否在多个请求服务线程中是通用的。

其次,有没有办法启动一个休眠5分钟的线程然后做一些工作而不必深入挖掘低级线程api?我看到那里有一个@Scheduled的东西,但看起来它意味着反复运行一些工作,而不是代码本身启动的东西。

2 个答案:

答案 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.thingEnabledtrue,请在超时异常后重试5分钟
  • 如果app.thingEnabledfalse,请勿重试。

您可能希望阅读TimerTimerTask。此外,可以找到一个很好的例子here