2017-05-09 1 views
1

Ich verwende Spring Integration und den Feed Inbound Channel Adapter, um Nachrichten RSS-Feeds zu verarbeiten (was ich denke, ist fantastisch :). Ich möchte auch einige zusätzliche Nachrichtenfeeds konsumieren, die durch eine API in den gleichen Kanal verfügbar sind. Die API ist nur ein HTTP-Endpunkt, der eine Liste von Nachrichtenartikeln in JSON zurückgibt. Die Felder sind RSS sehr ähnlich, d. H. Es gibt einen Titel, eine Beschreibung, ein Veröffentlichungsdatum, das dem SyndEntry-Objekt zugeordnet werden könnte.Spring Integration anpassen Feed Inbound Channel Adapter

Idealerweise möchte ich die gleiche Funktionalität wie im Eingangskanaladapter für eingehende Nachrichten verwenden, die doppelte Einträge usw. behandelt. Ist es möglich, Feed Inbound Channel Adapter anzupassen, um JSON zu verarbeiten und zuzuordnen?

Jeder Beispielcode oder Zeiger wäre wirklich hilfreich.

Antwort

0

Nun, nein. FeedEntryMessageSource basiert vollständig auf der Rome Tools, die nur mit dem XML-Modell befasst.

Ich fürchte, Sie müssen Ihre eigene Komponente erstellen, die SyndEntry Instanzen für diese JSON-Datensätze produzieren wird. Das kann wirklich etwas wie HttpRequestExecutingMessageHandler sein, basierend auf der RestTemplate mit der MappingJackson2HttpMessageConverter, die sowieso standardmäßig vorhanden ist.

Sie können versuchen, HttpRequestExecutingMessageHandler zu setExpectedResponseType(SyndFeedImpl.class) zu konfigurieren und erwarten, in der Antwort application/json Content-Typ zu haben.

Um die "Angebote mit doppelten Einträgen" zu erreichen, können Sie in Betracht ziehen, das Muster Idempotent Receiver danach zu verwenden. Wo die MessageSelector auf den MetadaStore beruhen sollte, und wirklich Logik Vorform ähnlich den in den FeedEntryMessageSource:

if (lastModifiedDate != null) { 
     this.lastTime = lastModifiedDate.getTime(); 
    } 
    else { 
     this.lastTime += 1; //NOSONAR - single poller thread 
    } 
    this.metadataStore.put(this.metadataKey, this.lastTime + ""); 

    ... 

    if ((entryDate != null && entryDate.getTime() > this.lastTime) 

wo entry ist ein payload (FeedEntry) von splitted resultieren aus erwähnt HttpRequestExecutingMessageHandler.

+0

Dank Artem, ich dachte nicht, dass es so einfach wäre. Ich werde versuchen zu sehen, wie ich arbeiten kann, danke für deine Unterstützung. – Swordfish

Verwandte Themen