2017-07-20 16 views
0

Ich benutze spring-cloud-stream-kafka, um einen kleinen Stresstest zu schreiben, der viele Ereignisse erzeugt und sie an ein bestimmtes Kafka-Thema sendet.Spring cloud stream partitionKeyExpression SpEL

Das Thema hat 6 Partitionen und ich möchte eine Benutzer-ID als Partitionierungsschlüssel verwenden. Da die Benutzer-ID jedoch nicht immer vorhanden ist, möchte ich, dass die Logik wie folgt aussieht: Partitionierung nach Benutzer-ID, falls sie vorhanden ist, andernfalls wird sie an eine zufällige Partition gesendet.

Gibt es eine Möglichkeit, die

spring.cloud.stream.bindings.output.producer.partitionKeyExpression 

Eigenschaft verwenden gewünschtes Verhalten zu erreichen?

P.S. Ich war in der Lage, eine Extraktorklasse zu erstellen, die das tut, aber ich frage mich, ob es eine Möglichkeit gibt, das mit Spel zu erreichen.

Danke, Marko

Antwort

0

Die Elvis Operator?

So etwas wie

payload.userId ?: Math.random() * 6 

?

+0

Nein, dies funktioniert nicht, da die userId nicht als Eigenschaft in einem Payload-JSON existiert. Ich denke, das würde funktionieren, wenn ich das Ereignis immer die Eigenschaft userId enthalten würde, aber manchmal ist die Eigenschaft _null_. Etwas wie _userId: null_. – Markotron

+0

Wenn es json ist, können Sie #jsonpath in Ihrem elvis-Ausdruck verwenden. –

+0

Ja, das funktioniert! Vielen Dank! Der Vollständigkeit halber werde ich nur hinzufügen, dass Sie jsonPath konfigurieren müssen, indem Sie die Option 'Option.DEFAULT_PATH_LEAF_TO_NULL' setzen, andernfalls wird ein Fehler ausgegeben, wenn die Eigenschaft nicht existiert! – Markotron

Verwandte Themen