Migrere fra AVRO
Topic
Produsenter trenger kun å forholde seg til ett topic for å opprette og inaktivere varsler. Opprett pr i github-repository.
Buildere og avro
Vi bruker ikke lenger avro for å validere schema. Varsel-eventer sendes som json-string, med varsel-id som nøkkel.
Endringer i meldingene
Se produsere varsler for dokumentasjon av nytt format.
meldingstyper
Tidligere har det vært fire meldingstyper (beskjed, oppgave, innboks, done). Disse er nå slått sammen til to objekter: opprett og inaktiver. Varseltypen spesifiseres i opprett-eventet.
endring av feltnavn
eventId
->varselId
sikkerhetsnivaa
->sensitivitet
(3 -> substantial, 4 -> high)synligFremTil
->aktivFremTil
fodselsnummer
->ident
deprekerte felter
grupperingsId
og tidspunkt
er fjernet.
tekst
Alle tekster må ha en språkkode. Det er anbefalt å legge til tekst for flere språk.
Om det er tekst på flere språk, må én være satt som default.
Eksempel
Et system sender varsler til brukere til gammelt topic med avro, og skal migreres.
Varslene har:
- type oppgave
- sikkerhetsnivå 4
- lenke til https://www.nav.no
- frist 14 dager etter oppretting
- teksten "Dette er et oppgave-varsel"
- ekstern varsling på sms med teksten "Dette er en sms om oppgave"
Gammelt oppsett med avro-builder
val gammeltOppgaveTopic = "min-side.aapen-brukernotifikasjon-oppgave-v1"
val kafkaProps = Properties().apply {
put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer::class.java)
put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer::class.java)
// ...
}
val kafkaProducer = KafkaProducer<NokkelInput, OppgaveInput>(kafkaProps)
val oppgaveId = UUID.randomUUID().toString()
val nokkelInput = NokkelInputBuilder()
.withEventId(oppgaveId)
.withGrupperingsId("123")
.withFodselsnummer(fodselsnummer)
.withNamespace("test-team")
.withAppnavn("demo-app")
.build()
val oppgaveInput = OppgaveInputBuilder()
.withTidspunkt(LocalDateTime.now())
.withSynligFremTil(LocalDateTime.now().plusDays(14))
.withTekst("Dette er et oppgave-varsel")
.withLink(URL("https://www.nav.no"))
.withSikkerhetsnivaa(4)
.withEksternVarsling(true)
.withSmsVarslingstekst("Dette er en sms om oppgave")
.withPrefererteKanaler("SMS")
kafkaProducer.send(ProducerRecord(gammeltOppgaveTopic, nokkelInput, oppgaveInput))
// ...
val gammeltDoneTopic = "min-side.aapen-brukernotifikasjon-done-v1"
val done = DoneInputBuilder()
.withTidspunkt(now())
kafkaProducer.send(ProducerRecord(gammeltDoneTopic, nokkel, done))
Nytt oppsett med kotlin-builder
val nyttVarselTopic = "min-side.aapen-brukervarsel-v1"
val kafkaProps = Properties().apply {
put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer::class.java)
put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer::class.java)
// ...
}
val kafkaProducer = KafkaProducer<String, String>(kafkaProps)
val oppgaveId = UUID.randomUUID().toString()
val opprettVarsel = VarselActionBuilder.opprett {
type = Varseltype.Oppgave
varselId = oppgaveId
sensitivitet = Sensitivitet.High
ident = fodselsnummer
tekst = Tekst(
spraakkode = "nb",
tekst = "Dette er et oppgave-varsel",
default = true
)
link = "https://www.nav.no"
aktivFremTil = ZonedDateTime.now().plusDays(14)
eksternVarsling = EksternVarslingBestilling(
prefererteKanaler = listOf(EksternKanal.SMS),
smsVarslingstekst = "Dette er en sms om oppgave",
)
}
kafkaProducer.send(ProducerRecord(nyttVarselTopic, varselId, opprettVarsel))
// ...
val inaktiverVarsel = VarselActionBuilder.inaktiver {
varselId = oppgaveId
}
kafkaProducer.send(ProducerRecord(nyttVarselTopic, varselId, inaktiverVarsel))