camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Wein, Frank (RRZE)" <frank.w...@fau.de>
Subject AW: How to use the InOut (Request-Reply) pattern in combination with REST/Jetty?
Date Tue, 29 Nov 2016 20:49:24 GMT
Hi Claus,
unfortunately this still results in a the same error message (The OUT message was not received...).
Route now looks like this, rest of the code stayed the same:

        rest("/API/")
                .get("/object/{ID}/")
                .to("direct:objectGet");

        from("direct:objectGet").to(ExchangePattern.InOut, "activemq:test");
        
        from("activemq:test").process(resultProcessor);

The message history tells me:
RouteId              ProcessorId          Processor                                      
                                 Elapsed (ms)
[route1            ] [route1            ] [jetty:http://0.0.0.0:8080/API/object/%7BID%7D?httpMethodRestrict=GET
  ] [     21035]
[route1            ] [restBinding1      ] [                                              
                               ] [         6]
[route1            ] [route1            ] [direct:objectGet                              
                               ] [     21019]
[route2            ] [to1               ] [activemq:test                                 
                             ] [     21018]

So somehow the messages do not get fetched from the activemq bus, do I see this correctly?
Could this also be an ActiveMQ configuration problem? I'm a little bit stuck at this point.

Regards
Frank
________________________________________
Von: Claus Ibsen [claus.ibsen@gmail.com]
Gesendet: Dienstag, 29. November 2016 18:49
An: users@camel.apache.org
Betreff: Re: How to use the InOut (Request-Reply) pattern in combination with REST/Jetty?

Ah you need to break this up into two separate routes


from direct foo
   to activemq test


from activemq test
   process replyProcessor


On Tue, Nov 29, 2016 at 6:21 PM, Wein, Frank (RRZE) <frank.wein@fau.de> wrote:
> Hi,
> thanks for the link, unfortunately it still doesn't seem to work. The Exchange does not
receive a reply message:
> "org.apache.camel.ExchangeTimedOutException: The OUT message was not received within:
20000 millis due reply message with correlationID: [...]-33309-1480438574020-0-3 not received
on destination: temp-queue://ID:[...]-35217-1480438579489-1:1:1. Exchange[ID-[...]-33309-1480438574020-0-1]"
>
> The incoming messages on the ActiveMQ queue from the REST endpoint end up in the dead-letter
queue:
> dlqDeliveryFailureCause         java.lang.Throwable: Message Expired. Expiration:1480439266246
>
> I tried quite a few things (inOut at different position in the route description, getIn,
getOut, shared queue, ...), but nothing seems to work (always timeout waiting for the reply).
Is it possible at all what I want to accomplish (reminder: Jetty REST endpoint passes message
to queue, other route fetches from queue, modifies message and the original endpoint should
reply with modified message).
>
> Is there a mistake in my current code?
>
>  Processor resultProcessor = new Processor() {
>             @Override
>             public void process(Exchange exchange) throws Exception {
>                     exchange.getIn().setBody( "response");
>                 return;
>             }
>         };
>
>         getContext().addComponent("activemq", ActiveMQComponent.activeMQComponent("tcp://localhost:61616"));
>
>         restConfiguration().component("jetty").host("0.0.0.0").port(8080).dataFormatProperty("prettyPrint",
"true");
>
>         rest("/API/").get("/object/{ID}/").to("direct:objectGet");
>
>         from("direct:objectGet").to(ExchangePattern.InOut, "activemq:test").process(resultProcessor).to("activemq:test");
>
>
> Is my "to("activemq:test")" not the correct way to send back the modified message to
the producer? Actually I thought the message exchange will automatically take care of sending
back to the modified message body to the producer (doesn't seem to make a difference here
anyway).
>
>
> Thanks for any suggestions!
>
> Frank
>
> ________________________________________
> Von: Quinn Stevenson [quinn@pronoia-solutions.com]
> Gesendet: Montag, 28. November 2016 17:35
> An: users@camel.apache.org
> Betreff: Re: How to use the InOut (Request-Reply) pattern in combination with REST/Jetty?
>
> Yes - this is possible.  Look at "Request-Replyā€¯ in the JMS docs ( http://camel.apache.org/jms.html
<http://camel.apache.org/jms.html> ).
>
>
>> On Nov 28, 2016, at 12:51 AM, Frank Wein <frank.wein@fau.de> wrote:
>>
>> Hi all,
>> some additional info/Java code: What I have currently working is some code without
the ActiveMQ part:
>>
>> restConfiguration().component("jetty").host("0.0.0.0").port(8080)
>>                .dataFormatProperty("prettyPrint", "true")
>>                .bindingMode(RestBindingMode.auto);
>>
>>       rest("/API/").get("/object/{ID}/").to("direct:objectGet");
>>
>>        from("direct:objectGet")
>>                 .setExchangePattern(ExchangePattern.InOut)
>>                 .setHeader(Exchange.HTTP_PATH, simple(
>> "/Webservice/RESTService/Object/${header.ID}"))
>>                 .setHeader(Exchange.HTTP_METHOD, simple("GET"))
>> .to("jetty://http://localhost:8888?bridgeEndpoint=true");
>>
>> I send my REST request to localhost:8080/object/[ID]/ and get back the reply from
the other webservice running on localhost:8888.
>>
>> Now, I want to include an ActiveMQ queue here. Basically the ActiveMQ queue should
be between the two routes (from/to("direct:objectGet")). The first route should send the message
to the queue, the second route should fetch it, get the response from the other web service
and send the response back via the queue to the first route. This one should then reply to
the incoming REST request. Is this possible, if yes, how? My attempts at this did not really
work.
>>
>> Regards
>> Frank



--
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2

Mime
View raw message