2017-10-10 3 views
0

avec Spring Nuage DataFlow 1.3.0.M2 avec Spring Nuage Entrées flux Celsius.M1.Spring Nuage DataFlow: Obtenir payload Liste <Map>

J'ai deux processeurs. D'abord produit un List<Map> qui est censé être consommé par l'autre. Voici un code simplifié.

// Processor 1 
@StreamListener(Processor.INPUT) 
@SendTo(Processor.OUTPUT) 
// Note: had Object instead of List<> as the return, hoped perhaps using a 
// specific type would help, but no difference. 
public List<Map<String, Object>> process(final @Payload MyPojo payload) { 
    final List<Map<String, Object>> results = worker.doWork(payload); 
    LOG.debug("Returning " + results.size() + " objects"); 
    return results; 
} 

// Processor 2 
@StreamListener(Processor.INPUT) 
@SendTo(Processor.OUTPUT) 
public Object process(final @Payload List<Map<String, Object>> payload) { 
    LOG.debug("Received " + payload.size() + " objects"); 
    final List<Map<String, Object>> results = worker.moreWork(payload); 
    return results; 
} 

Je ces deux processeurs déployez dans un pipeline en utilisant le shell SCDF:

<source> | otherProcessors | processor1 | processor2 | log 

Le message de débogage pour processeur 1 dit qu'il a 2 objets dans la liste. Le message de débogage du processeur 2 indique qu'il a reçu 40 objets (chaque carte a 20 paires clé = valeur) - il apparaît que les deux cartes ont été aplaties en une liste de paires clé = valeur.

Je journalisation de débogage activé pour org.spring.integration et le message semble avoir une liste de format de cartes (ce qui est du processeur 2):

preSend on channel 'input', message: GenericMessage 
    [payload=[{"m1key1":"val1","m1key2":"val2",...,"m1key20":"val20"}, 
    {"m2key1":"val1","m2key2":"val2",...,"m2key20":"val20"}], headers={..}] 

Je voudrais Processeur 2 pour recevoir les 2 cartes produites par Processeur 1. Je me demande si c'est quelque chose lié aux types génériques. Quelqu'un peut-il me diriger vers la configuration pour y arriver?

---- Mise à jour pour les commentaires de Artem ----

processeur 1 a ceci dans son fichier application.properties:

spring.cloud.stream.bindings.output.content-type=application/json 

J'avais aussi essayé de modifier la définition de flux comme cela, mais il n » ai pas t semblent faire une différence:

<source> | otherProcessors | processor1 --outputType=application/json | processor2 --inputType=application/json | log 
+0

Vous savez que cela ne ressemble pas à JSON, mais bien comme 'GenericMessage.toString()'. Cela vous dérangerait-il de partager les «en-têtes» que vous avez là sur le sujet? Au moins 'contentType' –

+0

Et oui, quelle est la configuration' input/output' que vous avez sur ces processeurs? Je veux dire "contraignant" réglage –

+0

Mise à jour post pour répondre aux questions, Artem, merci. – user944849

Répondre

1

Ok, vous avez réellement tombé sur un bug :)

Ceci a été corrigé sur la branche 2.0, ce qui est un peu instable pour le moment vu qu'il s'agit d'un snapshot.

Les choses devraient être mieux une fois que nous publierons dans quelques jours.

équipe discute de la voie à suivre dans le dos de portage du correctif à 1.3 ligne.

+0

Super, en quelque sorte. Je me sens mieux maintenant, je me demandais ce que j'avais manqué dans la config, et juste quand je pensais que je commençais à comprendre aussi. :) Au moins, j'ai fourni un test assez petit pour que l'équipe puisse reproduire le problème et le résoudre! Merci pour la mise à jour! – user944849