Skip to content

Commit ffbc7d6

Browse files
authored
Hindre out of memory i forhåndsvisning ved å begrense antallet samtidige håndteringer (#143)
* Hindre out of memory i forhåndsvisning ved å begrense antallet samtidige håndteringer
1 parent 1896296 commit ffbc7d6

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

web/src/main/java/no/nav/ung/sak/web/app/tjenester/formidling/FormidlingRestTjeneste.java

+18-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import static no.nav.ung.abac.BeskyttetRessursKoder.FAGSAK;
55

66
import java.util.Objects;
7+
import java.util.concurrent.Semaphore;
78

9+
import io.opentelemetry.instrumentation.annotations.WithSpan;
810
import org.slf4j.Logger;
911
import org.slf4j.LoggerFactory;
1012

@@ -54,6 +56,8 @@ public class FormidlingRestTjeneste {
5456
private static final String PDF_MEDIA_STRING = "application/pdf";
5557
private static final MediaType PDF_MEDIA_TYPE = MediaType.valueOf(PDF_MEDIA_STRING);
5658

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);
5761

5862
@Inject
5963
public FormidlingRestTjeneste(
@@ -110,7 +114,20 @@ public VedtaksbrevOperasjonerDto tilgjengeligeVedtaksbrev(
110114
public Response forhåndsvisVedtaksbrev(
111115
@NotNull @Parameter(description = "") @Valid @TilpassetAbacAttributt(supplierClass = AbacAttributtSupplier.class) VedtaksbrevForhåndsvisDto dto,
112116
@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) {
114131
GenerertBrev generertBrev = brevGenerererTjeneste.genererVedtaksbrev(dto.behandlingId());
115132

116133
var mediaTypeReq = Objects.requireNonNullElse(request.getHeader(HttpHeaders.ACCEPT), MediaType.APPLICATION_OCTET_STREAM);

0 commit comments

Comments
 (0)