1

你好我有一个带有这样的方法的 RestController 注释类:

@Bean
@GetMapping
@Scope("prototype")
public Info[] setInfo()
{
    return m_restTemplate.getForObject(m_url, Info[].class);
}

在这里我可以得到info[]并在我的 SQL 表中使用它。

但是 Web 服务会不断更新我从中获得的 Info 对象m_url。我只能Info[]在春季启动初始化时得到这个。我必须重新启动 API 才能更新我的 SQL 表。

这是一个带有自动装配的示例代码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);
}
4

1 回答 1

1

您可以@Scheuled像这样使用注释:

@Scheduled(fixedDelay = 1000)
public void updateInfo() {
   // update call
}

在这种情况下,它将每秒调用一次更新。

另一种方法是更改​​ WS 以广播有关更改的信息,但在这种情况下,您需要访问该 WS 的代码。


OP评论后编辑

在这种情况下,您需要某种值对象模式。将您封装Info[]在某个容器中,例如InfoStore

@Component
class InfoStore{

   private Info[] info;

   public Info[] getInfo(){
     //...
   }
}

这将被注入你的豆子中。现在您可以在Info[]每次需要时更新并使用您想要的每种方法。您的“主要”bean 将被注入一次,但它的“胆量”可以随时更改。

于 2021-09-21T14:56:19.123 回答