2017-04-10 171 views
0

我有一個端點正在做一些處理,最後在ResponseEntity內返回一個靜態資源byte[]。返回靜態資源的服務層的當前實現如下。靜態資源的Spring Boot ResourceLoader緩存

@Service 
public class MyService_Impl implements MyService { 
    private ResourceLoader resourceLoader; 

    @Autowired 
    public MyService_Impl (ResourceLoader resourceLoader) { 
     this.resourceLoader = resourceLoader; 
    } 

    @Override 
    public byte[] getMyResource() throws IOException { 
     Resource myResource = resourceLoader.getResource("classpath:/static/my-resource.gif"); 
     InputStream is = myResource.getInputStream(); 
     return IOUtils.toByteArray(is); 
    } 
} 

在高峯我看到在這個端點的響應時間增加較多,我的感覺是,這是瓶頸爲約100個線程同時請求該資源。是否有一個特定的Spring資源緩存機制,我可以使用這個資源保存在內存中,或者我需要在getMyResource()方法中引入ehcache

回答

0

U可以將轉換後的gif對象保存在同一個對象內的私有變量中。

@Service 
public class MyService_Impl implements MyService { 
    private ResourceLoader resourceLoader; 
    private byte[] gifContent; 

    @Autowired 
    public MyService_Impl (ResourceLoader resourceLoader) { 
     this.resourceLoader = resourceLoader; 
    } 

    @Override 
    public byte[] getMyResource() throws IOException { 
     if(gifContent == null){ 
     Resource myResource = resourceLoader.getResource("classpath:/static/my-resource.gif"); 
     InputStream is = myResource.getInputStream(); 
     gifContent = IOUtils.toByteArray(is); 
     } 
     return gitContent; 
    } 
} 

這隻讀一次gif,然後每次都返回緩存的實例。但是這可能會增加對象的內存佔用。單身物體是優選的。只是如果你想緩存一個gif去ehcache可能不是一個合適的情況。 U還可以考慮將讀取資源移動到Springs init方法生命週期回調中。

如果你有多個Gif需要根據輸入(鍵/值)進行動態服務,那麼你可以去任何第三方緩存實現,如番石榴或ehcache。