私はInputStreamResource
というイメージを返すサーブレットを持っています。一部のget query
パラメータに基づいて返される約50の静止画像があります。RestControllerでInputStreamResourceをキャッシュする方法は?
(非常に頻繁に)要求されるたびにそれらの画像をそれぞれ調べる必要がないので、私はそれらの画像の応答をキャッシュしたいと思います。
@RestController
public class MyRestController {
//code is just example; may be any number of parameters
@RequestMapping("/{code}")
@Cachable("code.cache")
public ResponseEntity<InputStreamResource> getCodeLogo(@PathVariable("code") String code) {
FileSystemResource file = new FileSystemResource("d:/images/" + code + ".jpg");
return ResponseEntity.ok()
.contentType("image/jpg")
.lastModified(file.lastModified())
.contentLength(file.contentLength())
.body(new InputStreamResource(file.getInputStream()));
}
}
I_'mは、次の例外を取得し、(直接場合RestMapping
方法に関係なく、または外部サービスへのリファクタリング)@Cacheable
注釈を使用して:
cause: java.lang.IllegalStateException: InputStream has already been read - do not use InputStreamResource if a stream needs to be read multiple times - error: InputStream has already been read - do not use InputStreamResource if a stream needs to be read multiple times
org.springframework.core.io.InputStreamResource.getInputStream(InputStreamResource.java:96)
org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:100)
org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:47)
org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:195)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:238)
org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:183)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743)
質問:どのようにすることができます私はInputStreamResource
タイプのResponseEntity
をキャッシュしていますか?
一度だけ読み取る必要がありますか?または、ディスク上のファイルの変更を監視する必要がありますか? – Niels
私は '@ EvictCache'を固定周期で、例えば夜間や週単位で呼びたいと思っています。ですから、一般的には一度だけ準備してから、ファイルをローカルで調べなくても再利用する必要があります。 – membersound
クリア。それ以外の場合は、コントローラの初期化中に一度ファイルを読み込んでByteArrayResourceにロードすることができます。 – Niels