在运行时从 Google 云存储中刷新 Spring 资源
Refresh Spring Resource from Google Cloud Storage in Runtime
我在 Google 云存储中有一个文件用作我的 Spring 服务器中的资源。我发现 Spring here 有一个 GCS SDK。但是,它只支持在应用程序启动时获取一次资源,就像任何 Spring 资源一样。就我而言,我需要在运行时定期更新资源,因此不需要重新部署。
当然可以像上面提到的那样在运行时获取资源 ,但是如果每个函数调用独立存储资源,内存使用量可能会膨胀。使用像 Spring 资源这样的单例模式将是理想的情况,因为资源计划用于多个 @Service
并节省内存使用量。有没有办法定义 @Bean
或 @Resource
并定期更新它们?
根据问题评论部分中 Guillaume 的建议,这是我实施的解决方案。
@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()
函数调用都会为内容分配内存资源,而不仅仅是引用。
我在 Google 云存储中有一个文件用作我的 Spring 服务器中的资源。我发现 Spring here 有一个 GCS SDK。但是,它只支持在应用程序启动时获取一次资源,就像任何 Spring 资源一样。就我而言,我需要在运行时定期更新资源,因此不需要重新部署。
当然可以像上面提到的那样在运行时获取资源 @Service
并节省内存使用量。有没有办法定义 @Bean
或 @Resource
并定期更新它们?
根据问题评论部分中 Guillaume 的建议,这是我实施的解决方案。
@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()
函数调用都会为内容分配内存资源,而不仅仅是引用。