|
4 | 4 | import static no.nav.ung.abac.BeskyttetRessursKoder.FAGSAK;
|
5 | 5 |
|
6 | 6 | import java.util.Objects;
|
| 7 | +import java.util.concurrent.Semaphore; |
7 | 8 |
|
| 9 | +import io.opentelemetry.instrumentation.annotations.WithSpan; |
8 | 10 | import org.slf4j.Logger;
|
9 | 11 | import org.slf4j.LoggerFactory;
|
10 | 12 |
|
@@ -54,6 +56,8 @@ public class FormidlingRestTjeneste {
|
54 | 56 | private static final String PDF_MEDIA_STRING = "application/pdf";
|
55 | 57 | private static final MediaType PDF_MEDIA_TYPE = MediaType.valueOf(PDF_MEDIA_STRING);
|
56 | 58 |
|
| 59 | + private static final int MAX_ANTALL_SAMTIDIGE_FORHÅNDSVISNINGER = 2; //kan justeres sammen med minne for applikasjonen |
| 60 | + private static final Semaphore SEMAFOR_SAMTIDIGE_FORHÅNDSVISNINGER = new Semaphore(MAX_ANTALL_SAMTIDIGE_FORHÅNDSVISNINGER); |
57 | 61 |
|
58 | 62 | @Inject
|
59 | 63 | public FormidlingRestTjeneste(
|
@@ -110,7 +114,20 @@ public VedtaksbrevOperasjonerDto tilgjengeligeVedtaksbrev(
|
110 | 114 | public Response forhåndsvisVedtaksbrev(
|
111 | 115 | @NotNull @Parameter(description = "") @Valid @TilpassetAbacAttributt(supplierClass = AbacAttributtSupplier.class) VedtaksbrevForhåndsvisDto dto,
|
112 | 116 | @Context HttpServletRequest request
|
113 |
| - ) { |
| 117 | + ) throws InterruptedException { |
| 118 | + // Semafor her for å begrense hvor mange samtidige forhåndsvisninger som kjøres for å unngå OutOfMemoryError. |
| 119 | + // Operasjonen både bruker noe tid, og mye minne, så uten begrensning er det er fullt mulig å knele applikasjonen |
| 120 | + // ved å forhåndsvise flere ganger på kort tid. |
| 121 | + SEMAFOR_SAMTIDIGE_FORHÅNDSVISNINGER.acquire(); |
| 122 | + try { |
| 123 | + return doForhåndsvisVedtaksbrev(dto, request); |
| 124 | + } finally { |
| 125 | + SEMAFOR_SAMTIDIGE_FORHÅNDSVISNINGER.release(); |
| 126 | + } |
| 127 | + } |
| 128 | + |
| 129 | + @WithSpan //span her for å kunne skille venting på semafor fra resten |
| 130 | + private Response doForhåndsvisVedtaksbrev(VedtaksbrevForhåndsvisDto dto, HttpServletRequest request) { |
114 | 131 | GenerertBrev generertBrev = brevGenerererTjeneste.genererVedtaksbrev(dto.behandlingId());
|
115 | 132 |
|
116 | 133 | var mediaTypeReq = Objects.requireNonNullElse(request.getHeader(HttpHeaders.ACCEPT), MediaType.APPLICATION_OCTET_STREAM);
|
|
0 commit comments