You could also use something like cxfrs to do the REST call and have it 
unmarshal your JSON return.
That would make it easier to integrate with Mark's idea to use Camel's error 
handling and retries.

-Steve

> -----Original Message-----
> From: Mark Nuttall <mknutt...@gmail.com>
> Sent: Friday, September 10, 2021 3:51 PM
> To: users@camel.apache.org
> Subject: Re: .process vs .to(bean: ?
> 
> You should use the Camel Processing to do retries.
> 
> Also, look at using something like OpenFeign to reduce the boilerplate HTTP
> call. It can be very few lines of code.
> or you should use the Camel HTTP component.
> 
> 
> 
> On Fri, Sep 10, 2021 at 2:00 AM Matthee, Elmar [elm...@sun.ac.za] <
> elm...@sun.ac.za> wrote:
> 
> > Good morning all.
> >
> > I'm VERY new to camel so I'm still trying to get a grip on all the
> > various components so please bear with me.
> >
> > I'm using quarkus/camel and have a route where I pull a message off of
> > a kafka topic (this part works perfectly btw) but then I want to send
> > the string on to a REST service and based on the response I get back
> > from the service (i.e. 200 - Ok - Go on to next message, 400 - Bad
> > Request - throw message in an error queue or 503 - Service unavailable
> > - Wait x amount of time and do y amounts of retries before stopping the
> route completely).
> >
> > My first attempt was to do all the REST calls in a .proccess java class.
> >
> > But I now saw that you can do a .to(bean:xxx) and basically also call
> > a java class to do all the required code etc.
> >
> > So my question is: what is the more "correct" way to do this
> > (especially with regards to getting application.properties values to
> > the java class and then sending/handeling the responses from the REST
> > service. Would it be better to do all the error/wait handeling in the
> > java class or rather build it into the route itself (with
> > .errorHandler etc?)
> >
> > Here is my current working route code:
> >
> > @ApplicationScoped
> > public class EnrollementEventRoute extends RouteBuilder {
> >     private EnrollmentEventRestSender eers;
> >
> >     @ConfigProperty(name = "kafka.topic.academia.registration")
> >     String registrationTopicName;
> >
> >     @ConfigProperty(name = "kafka.academia.broker")
> >     String kafkaBroker;
> >
> >     @ConfigProperty(name = "kafka.academia.config.clientId")
> >     String kafkaClientId;
> >
> >     @ConfigProperty(name =
> > "kafka.academia.registration.autoOffsetReset",
> > defaultValue = "latest")
> >     String offset;
> >
> >     @ConfigProperty(name = "kafka.academia.config.groupId")
> >     String groupId;
> >
> >     @ConfigProperty(name = "kafka.academia.config.keyDeserializer")
> >     String keyDeserializer;
> >
> >     @ConfigProperty(name = "kafka.academia.config.valueDeserializer")
> >     String valueDeserializer;
> >
> >     @ConfigProperty(name = "fms.registration.restservice.endpoint")
> >     String restEndpoint;
> >
> >     @Override
> >     public void configure() throws Exception {
> >         eers = new EnrollmentEventRestSender(restEndpoint);
> >         from(kafka(registrationTopicName)
> >                 .brokers(kafkaBroker)
> >                 .clientId(kafkaClientId)
> >                 .groupId(groupId)
> >                 .keyDeserializer(keyDeserializer)
> >                 .valueDeserializer(valueDeserializer)
> >                 .autoOffsetReset(offset))
> >                 .log("Registration Event received: ${body}")
> >                 .process(eers);
> >
> >     }
> >
> > And then here is the code in the EnrollmentEventRestSender class:
> >
> > @ApplicationScoped
> > public class EnrollmentEventRestSender implements Processor {
> >   private String restEndpoint;
> >
> >     public EnrollmentEventRestSender() {  //Dummy constructor needed.
> >
> >     };
> >
> >     public EnrollmentEventRestSender(String url) {
> >       this.restEndpoint = url;
> >     }
> >
> >
> >
> >     @Override
> >     public void process(Exchange exchange) throws Exception {
> >         try {
> >           CloseableHttpClient client = HttpClients.createDefault();
> >           System.out.println("Got endpoint of: " + restEndpoint);
> >           HttpPost httpPost = new HttpPost(restEndpoint);
> >           String json = (String) exchange.getIn().getBody();
> >           System.out.println("Got JSON in Exchange: " + json);
> >           StringEntity entity = new StringEntity(json);
> >           httpPost.setEntity(entity);
> >          // httpPost.setHeader("Accept", "application/json");
> >           httpPost.setHeader("Content-type", "text/plain; charset=utf-8");
> >           CloseableHttpResponse response = client.execute(httpPost);
> >           System.out.println("Got Response of: " +
> > response.getStatusLine().getStatusCode());
> >           if (!(response.getStatusLine().getStatusCode()==200)) { //
> > Something wrong
> >             InputStream is = response.getEntity().getContent();
> >             BufferedReader rd = new BufferedReader(new
> > InputStreamReader(is));
> >             StringBuilder errReply = new StringBuilder();
> >             String responseLine = null;
> >             while ((responseLine = rd.readLine()) != null) {
> >                errReply.append(responseLine.trim());
> >             }
> >             rd.close();
> >             is.close();
> >             System.out.println(errReply);
> >           }
> >           client.close();
> >         }
> >         catch (Exception ex ) {
> >           ex.printStackTrace();
> >         }
> >     }
> >
> > }
> > [https://www.sun.ac.za/productionfooter/email/ProductionFooter.jpg]<
> > https://www.sun.ac.za/english/about-us/strategic-documents>
> >
> > The integrity and confidentiality of this email are governed by these
> > terms. Disclaimer<https://www.sun.ac.za/emaildisclaimer/default.aspx>
> > Die integriteit en vertroulikheid van hierdie e-pos word deur die
> > volgende bepalings bereƫl. Vrywaringsklousule<
> > https://www.sun.ac.za/emaildisclaimer/default.aspx>
> >

Reply via email to