Invoering
Bij het ontwikkelen van applicaties met Spring-batch, vooral in een microserviceproject, worden we soms geconfronteerd met een of de meeste van de volgende gevallen:
- De noodzaak om de beveiligingscontext binnen de batchitems te krijgen om methoden aan te roepen die autorisaties vereisen binnen dezelfde microservice of om externe verwerking uit te voeren door andere microservices aan te roepen met Feign Client (HTTP) of Spring Cloud Stream (makelaar zoals Kafka, RabbitMq. ..)
- Propagerende Sleuth-trace-id en span-id om de traceerbaarheid van logboeken in alle toepassingscomponenten, inclusief andere microservices, te verbeteren, zodat de trace niet verloren gaat als we Job gebruiken.
- De landinstelling van de verbonden gebruiker (i18n) krijgen om geïnternationaliseerde uitvoer te genereren, anders worden alle taakuitvoer in de standaard servertaal gegenereerd.
- Ophalen van objecten die zijn opgeslagen in Mapped Diagnostic Context (MDC) voor opsporingsdoeleinden.
Het volgende schema illustreert externe oproepen die kunnen worden uitgevoerd in een op microservices gebaseerde toepassing en de contextinformatie die String Batch-items kunnen doorgeven.
De hierboven beschreven gevallen kunnen worden opgelost door de contextinformatie door te geven als taakparameters en deze te herstellen voordat de taak of stap wordt uitgevoerd met JobExecutionListener
of StepExecutionListener
, respectievelijk volgens de gemaakte uitvoeringsconfiguratie (één thread per taak of threadpool die).
Het probleem met deze benadering is dat de code die verantwoordelijk is voor de injectie van taakparameters bij het bedrijf verschijnt, wat verwarring kan veroorzaken tijdens het onderhoud van de code. Ook deze verwerking moet transparant zijn voor de ontwikkelaars, zodat ze zich meer kunnen concentreren op de bedrijfslogica. Daarom wil ik een nieuw raamwerk introduceren dat kan worden gebruikt om de hierboven beschreven contexten te verspreiden met de mogelijkheid om eenvoudig andere informatie toe te voegen.
Hoe het werkt
Het volgende diagram beschrijft globaal hoe dit raamwerk werkt:
- Een aspect dat de oproep van
JobLauncher.run()
methode om de contextinformatie in te voegen als een jobparameter. - Een op maat gemaakt
JobExecutionListener
wordt aangeroepen door Spring Batch vóór het begin van de taak om de contextparameters te deserialiseren en in deExecutionContext
. - Een op maat gemaakt
StepExecutionListener
wordt aangeroepen door Spring Batch vóór het begin van de stap om de context te herstellen en te wissen en het einde van de stap.
De baan JobExecutionListener
en StepExecutionListener
worden door het raamwerk automatisch geïnjecteerd en geassocieerd met elke taak. Dus geen extra code nodig.
Hoe te gebruiken
Het is heel simpel; aangezien het framework is voorzien van starters, voegt u eenvoudig de afhankelijkheid toe die overeenkomt met de benodigde context.
Voor Spring Security:
Voor Sleuth:
Voor MDC:
Voor locale (i18n):
Geavanceerd gebruik
Om een aangepaste context te verspreiden, moet de ontwikkelaar de interface implementeren JobExecutionContextListener
en injecteer het als een lenteboon. De nieuwe boon wordt automatisch door het raamwerk in aanmerking genomen.
De framework-broncode is gepubliceerd in github
CreditSource link