2
votes

Spring Boot Camel Route - obtenir des données du point de terminaison de repos

Je souhaite créer une route chameau dans le projet Spring Boot (2.1.1) pour obtenir les données d'un point de terminaison (reste) ( http: // localhost: 8080 / getAllUsers ) et d'envoyer ces données à activeMq.

J'ai essayé avec des données de minuterie de les envoyer sur activeMq et de les consommer et cela fonctionne. Mais j'ai des problèmes avec la collecte de données à partir du point final.

J'ai essayé plusieurs choses mais sans succès. C'est ce que j'ai essayé.

Dans cet exemple, je n'envoie pas les données à ActiveMq, je veux juste voir la réponse ...

 rest("//localhost:8080/getAllUsers")
 .get().consumes("application/json")
 .to("activemq://all-users");

Un autre itinéraire:

 from("servlet://localhost:8080/getAllUsers").to("activemq://all-users");

Et un autre:

public void createNewRoute() {
CamelContext context = new DefaultCamelContext();

try {
  ProducerTemplate template = context.createProducerTemplate();
  context.start();

  Exchange exchange = template.request("http://localhost:8080/getAllUsers",
      new Processor() {
        public void process(Exchange exchange) throws Exception {
        }
      });

  if (null != exchange) {
    Message out = exchange.getOut();
    int responseCode = out.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
    System.out.println("Response: " + String.valueOf(responseCode));
  }

  Thread.sleep(1000 * 3);
  context.stop();
} catch (Exception ex) {
  System.out.println("Exception: " + ex);
}

System.out.println("DONE!!");
 }


0 commentaires

3 Réponses :


1
votes

Essayez ceci sans context.start () ....

   CamelContext camelContext = new DefaultCamelContext();
    ProducerTemplate template = camelContext.createProducerTemplate();

    Exchange exchange = template.send("http://localhost:8080/getAllUsers", new Processor() {
        public void process(Exchange exchange) throws Exception {}
    });

    Message out = exchange.getOut();   


11 commentaires

Oui je l'ai testé avec curl, swagger, chrome, postman et etc ... Et sa réponse est correcte.


Essayez de supprimer context.start (); Voici quelqu'un avec le même problème: stackoverflow.com/questions/12306211/...


J'ai changé ma méthode comme la vôtre et maintenant elle donne Message [] ... Je pense que c'est la même chose.


bizarre. peut-être définir exchange.getIn (). setHeader (Exchange.HTTP_QUERY, ""); dans la méthode de processus?


Toujours le même ... Peut-être que le message est vide parce que la réponse est Array de JsonObjects?


Maintenant, j'ai: La réponse du modèle http est org.apache.camel.converter.stream.CachedOutputStream $ Wrapped‌ InputStream @ 7e1ffe70


J'ai trouvé celui-ci. Peut-être avez-vous raison stackoverflow.com/questions/51018993/…


J'ai vu cela mais la réponse est de créer une classe pojo comme l'objet dans la réponse et dans mon cas, ce n'est pas une solution. Que faire si je dois créer 20 itinéraires différents vers 20 points de terminaison différents, alors je devrai créer 20 pojos ...


Peut-être utiliser la carte pour la sérialisation? J'ai trouvé celui-ci stackoverflow.com/ questions / 13085921 /…


Je ne pourrais pas implémenter unmarshall dans cette voie. Je l'ai fait dans from-> unmarshal-> to (route) qui est le deuxième dans mon exemple et toujours rien ..


Ce n'est pas ça, je l'ai testé avec un autre point de terminaison qui donne une réponse String et la même chose. La réponse du modèle http est org.apache.camel.converter.stream.CachedOutputStream $ Wrapped‌ InputStream @ 6fa2448b



1
votes

Les composants http sont basés sur le streaming, vous pouvez donc demander à Camel de vous donner la réponse sous forme de chaîne à la place.

String s = exchange.getMessage().getBody(String.class);

Pour en savoir plus, consultez ces liens


0 commentaires

1
votes

Je vais reprendre votre deuxième exemple:

from("timer://test?repeatCount=1").routeId("newRoute")
    .streamCaching()
    .process(exchange -> exchange.getIn()
        .setBody(exchange.getIn()
            .getBody()))
    .marshal()
    .json(JsonLibrary.Jackson)
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
    .to("http://localhost:8080/getAllUsers")
    .log(LoggingLevel.INFO, "This is my body: ${body}")
    .to("activemq:queue://new-queue");

Cela le déclenchera une fois.


1 commentaires

Cela marche. Je vous remercie. Mais comment puis-je l'appeler (le déclencher) à la demande de l'utilisateur et non sur la minuterie?