在运行时从 Google Cloud Storage 刷新 Spring 资源

安国

我在 Google Cloud Storage 中有一个文件,用作 Spring 服务器中的资源。我发现有一个GCS SDK的春天在这里但是,它只支持在应用程序启动时获取资源一次,就像任何 Spring Resource 一样。就我而言,我需要在运行时定期更新资源,因此不需要重新部署。

当然可以像这里提到的那样在运行时获取资源,但如果每个函数调用独立存储资源,内存使用量可能会膨胀。使用像 Spring Resource 这样的单例模式将是理想的情况,因为该资源计划跨多个使用@Service并节省内存使用量。有没有办法定义一个@Beanor@Resource并定期更新它们?

安国

按照纪尧姆在问题评论部分的建议,这是我实施的解决方案。

@Component
public class FooClass implements InitializingBean {
    private static final String BUCKET_NAME = "bucket-name";
    private static final String FILE_PATH = "path/filename.extension";
    private static byte[] instanceVariable;

    @Autowired
    private Storage storage;

    public byte[] get() {
        return instanceVariable;
    }

    // Replacement of @PostConstruct
    @Override
    public void afterPropertiesSet() {
        setInstanceVariable();
    }

    @Scheduled(fixedRate = 60 * 1000) // Refresh each minute
    private void refreshAssociationRule() {
        setInstanceVariable();
    }

    private void setInstanceVariable() {
        Blob blob = storage.get(BUCKET_NAME, FILE_PATH);
        instanceVariable = blob.getContent();
    }
}

另一个 Spring 组件可以简单地自动装配FooClass并获取资源。

@Service
public class BarClass {
    @Autowired
    private FooClass fooClass;

    private void func() {
        byte[] resource = fooClass.get();
        // use resource here
    }
}

注意:如果资源不是像 String 这样的“传递引用值”数据类型,这可能会导致并行请求中的内存膨胀。由于每个get()函数调用都会为内容分配内存资源,而不仅仅是引用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章