Spring 使用调度程序启动使用 web 服务
Spring Boot consuming webservice with scheduler
你好,我用这样的方法注释了 RestController class:
@Bean
@GetMapping
@Scope("prototype")
public Info[] setInfo()
{
return m_restTemplate.getForObject(m_url, Info[].class);
}
在这里我可以获得 info[]
并在我的 SQL table.
中使用它
但是 Web 服务不断更新我从 m_url
获得的信息对象。我只能在 spring 引导初始化时获得此 Info[]
一次。我必须重新启动 API 才能更新我的 SQL table.
这是一个自动装配的示例代码 info[]
@Autowired
public Info[] Infos;
public InfoRepository(NamedParameterJdbcTemplate m_jdbcTemplate) {
this.m_jdbcTemplate = m_jdbcTemplate;
}
public <S extends Info> S update(S info) {
m_jdbcTemplate.update(UPDATE_SQL, new BeanPropertySqlParameterSource(info));
return info;
}
但是当我尝试 运行 时,我显然得到了相同的对象。如何在调度程序中每次调用 @GetMapping 注释方法:
private final InfoRepository m_infoRepository;
private ArrayList<Info> m_Infos;
public void update()
{
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
m_coinInfos.forEach(i -> m_infoRepository.update(i));
}
}, 0, 2000);
}
您可以像这样使用 @Scheuled
注释:
@Scheduled(fixedDelay = 1000)
public void updateInfo() {
// update call
}
在这种情况下,它会每秒调用更新。
另一种方法是更改 WS 以广播有关更改的信息,但在那种情况下,您需要访问该 WS 的代码。
OP评论后编辑
在这种情况下,您需要某种值对象模式。将您的 Info[]
封装在某个容器中,例如InfoStore
:
@Component
class InfoStore{
private Info[] info;
public Info[] getInfo(){
//...
}
}
这将被注入到您的 bean 中。现在您可以在每次需要时更新 Info[]
并使用您想要的每种方法。你的“主要”bean 将被注入一次,但它的“胆量”可以在你需要的任何时候改变。
你好,我用这样的方法注释了 RestController class:
@Bean
@GetMapping
@Scope("prototype")
public Info[] setInfo()
{
return m_restTemplate.getForObject(m_url, Info[].class);
}
在这里我可以获得 info[]
并在我的 SQL table.
但是 Web 服务不断更新我从 m_url
获得的信息对象。我只能在 spring 引导初始化时获得此 Info[]
一次。我必须重新启动 API 才能更新我的 SQL table.
这是一个自动装配的示例代码 info[]
@Autowired
public Info[] Infos;
public InfoRepository(NamedParameterJdbcTemplate m_jdbcTemplate) {
this.m_jdbcTemplate = m_jdbcTemplate;
}
public <S extends Info> S update(S info) {
m_jdbcTemplate.update(UPDATE_SQL, new BeanPropertySqlParameterSource(info));
return info;
}
但是当我尝试 运行 时,我显然得到了相同的对象。如何在调度程序中每次调用 @GetMapping 注释方法:
private final InfoRepository m_infoRepository;
private ArrayList<Info> m_Infos;
public void update()
{
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
m_coinInfos.forEach(i -> m_infoRepository.update(i));
}
}, 0, 2000);
}
您可以像这样使用 @Scheuled
注释:
@Scheduled(fixedDelay = 1000)
public void updateInfo() {
// update call
}
在这种情况下,它会每秒调用更新。
另一种方法是更改 WS 以广播有关更改的信息,但在那种情况下,您需要访问该 WS 的代码。
OP评论后编辑
在这种情况下,您需要某种值对象模式。将您的 Info[]
封装在某个容器中,例如InfoStore
:
@Component
class InfoStore{
private Info[] info;
public Info[] getInfo(){
//...
}
}
这将被注入到您的 bean 中。现在您可以在每次需要时更新 Info[]
并使用您想要的每种方法。你的“主要”bean 将被注入一次,但它的“胆量”可以在你需要的任何时候改变。