【问题标题】:Spring Boot consuming webservice with schedulerSpring Boot 使用调度程序使用 Web 服务
【发布时间】:2021-09-21 14:46:39
【问题描述】:

你好,我有一个带有类似方法的 RestController 注释类:

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

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

但是网络服务不断更新我从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);
}

【问题讨论】:

    标签: java spring spring-boot rest get-mapping


    【解决方案1】:

    你可以像这样使用@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 将被注入一次,但它的“胆量”可以随时更改。

    【讨论】:

    • 谢谢。但这不完全是我的问题。我想我无法解释我的问题。 InfoRepository 类获取一次 Info[] 对象,除非我重新启动程序,否则它不会更新它。我试图将 Bean 作为原型,但没有成功。我是春季靴子的新手
    • @iraquois 我编辑了我的答案
    • 谢谢你,我按你说的试过了,效果很好。
    猜你喜欢
    • 2019-06-02
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2015-11-30
    • 2015-05-19
    • 1970-01-01
    • 2014-06-09
    相关资源
    最近更新 更多