camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Quinn Stevenson <qu...@pronoia-solutions.com>
Subject Re: How to use the InOut (Request-Reply) pattern in combination with REST/Jetty?
Date Wed, 30 Nov 2016 15:45:05 GMT
Strange - the ActiveMQ configuration shouldn’t have anything to do with this.  What versions
of Camel and ActiveMQ are you using?  I’ve had to use more/different URI options in the
JMS URIs in older versions of Camel - I just don’t remember what they are right off hand.

> On Nov 30, 2016, at 3:58 AM, Wein, Frank (RRZE) <frank.wein@fau.de> wrote:
> 
> Hi all,
> just a short update: It looks like I made a mistake on the activemq configuration(?)
itself, with an embedded ActiveMQ instance it seems to work fine ("ActiveMQComponent.activeMQComponent("vm://localhost?broker.persistent=false"));).
I will take a look at this then. Thanks for everyone who thought about this.
> 
> Best regards
> Frank
> ________________________________________
> Von: Wein, Frank (RRZE) [frank.wein@fau.de]
> Gesendet: Dienstag, 29. November 2016 21:49
> An: users@camel.apache.org
> Betreff: AW: How to use the InOut (Request-Reply) pattern in combination with REST/Jetty?
> 
> 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