Hi
Isn't this a serious bug in Camel?
I am also fiddling with mina (TCP) to implement a synchronous service
(InOut). But I never get a response from Camel if I use an outside test
application to send and listen for the response (ie a Groovy app).
If I use the Camel way of sending a request then I can get a response just
as the MinaTcpWithInOutTest testcase. But I think the testcase is wrong as
it should use raw socket code to simulate a client and not depend on Camel
code to send/receive.
And how can we configure in the routebuilder if MinaConsumer should be
InOnly (async) or InOut (sync)?
georgiosgeorgiadis wrote:
>
> I have scanned the source of MINAConsumer.java and
>
> in the doStart() method:
>
> IoHandler handler = new IoHandlerAdapter() {
> @Override
> public void messageReceived(IoSession session, Object message)
> throws Exception {
> getProcessor().process(endpoint.createExchange(session,
> message));
> }
> };
>
> if I change it to:
>
> IoHandler handler = new IoHandlerAdapter() {
> @Override
> public void messageReceived(IoSession session, Object message)
> throws Exception {
> MinaExchange exchange = endpoint.createExchange(session,
> message);
> getProcessor().process(exchange);
> session.write(exchange.getOut().getBody());
> }
> };
>
> It works and returns the reply back to the caller, otherwise it never
> seems to return as the
> MinaProducer.ResponseHandler.messageReceived() never seems to be callled
> thus the
> CountDownLatch.counter never decrements.
>
> make any sense?
>
> Regards
>
> Georgios
>
>
> georgiosgeorgiadis wrote:
>>
>> Thanks, though still it seems it is not working. I am sending a snippet
>> of my code just in case I do something wrong.
>>
>> First I send my Receiver class:
>>
>> public class Receiver{
>>
>> public static void main(String [] s){
>>
>> try{
>>
>> CamelContext context = new DefaultCamelContext();
>>
>> context.addRoutes(new RouteBuilder() {
>> public void configure() {
>> from("mina:tcp://localhost:6123").process(new Processor()
>> {
>> public void process(Exchange e) {
>> System.out.println("Received exchange: " +
>> e.getIn().getBody());
>> e.getOut().setBody("tcp reply");
>> }
>> });
>> }
>> });
>>
>> context.start();
>>
>> }catch(Throwable ex){
>> ex.printStackTrace();
>> }
>> }
>> }
>>
>> When I start the receiver program, indeed a TCP server at port 6123
>> startslistening for calls.
>>
>> Now my Sender program:
>>
>> public class Sender{
>>
>> public static void main(String [] s){
>>
>> try{
>>
>> CamelContext context = new DefaultCamelContext();
>>
>> context.start();
>>
>> Endpoint endpoint =
>> context.getEndpoint("mina:tcp://localhost:6123");
>>
>> MinaExchange exchange =
>> (MinaExchange)endpoint.createExchange(ExchangePattern.InOut);
>>
>> Message in = exchange.getIn();
>>
>> in.setBody("tcp request");
>>
>> Producer producer = endpoint.createProducer();
>>
>> producer.start();
>>
>> producer.process(exchange);
>>
>> Message out = exchange.getOut();
>>
>> System.out.println(out.getBody());
>>
>> producer.stop();
>>
>> context.stop();
>>
>> }catch(Throwable ex){
>> ex.printStackTrace();
>> }
>>
>> }
>> }
>>
>> When I start the sender, the request is received by the receiver, thus I
>> see
>> "Received exchange: tcp request"
>> printed on the receiver side.
>>
>> The sender blocks at Producer.process() method and after 10 seconds
>> throws
>>
>> java.lang.RuntimeException: No response from server within 10000
>> millisecs
>> at
>> org.apache.camel.component.mina.MinaProducer.process(MinaProducer.java:76)
>> at Sender.main(Sender.java:33)
>>
>> And the exchange.getOut().getBody() is null.
>>
>> I am sure that I am doing something wrong, but I acnnot seem to see it.
>> The requiremnet is as simple as the above communication.
>>
>> The two snippets above should compile and run as is.
>>
>> Very best regards
>>
>> Georgios
>>
>>
>> Tully, Gary wrote:
>>>
>>> Hi Georgios,
>>> I am new to this so apologies if I put you wrong but I think what you
>>> need is to access the exchange Out message in your process method:
>>>
>>> public void process(Exchange e) {
>>> e.getOut().setBody("some text");
>>> }
>>>
>>> Gary.
>>>
>>>> -----Original Message-----
>>>> From: georgiosgeorgiadis [mailto:[EMAIL PROTECTED]
>>>> Sent: 12 February 2008 17:17
>>>> To: [email protected]
>>>> Subject: Re: Camel TCP receiver endpoint
>>>>
>>>>
>>>> Hi James, thanks the examples helped a lot. I managed to
>>>> create a Mina TCP receiver which routes the call to a
>>>> component. Then I created a sender that calls the Mina TCP
>>>> component and passes it a serializable object, which managed
>>>> to reach my component at the other side of the TCP call. Till
>>>> here all worked fine. Yeepee. My problem now is a response
>>>> back to the caller. I have set up the sender to use Exchange
>>>> of type InOut, but I am sure how to prompt the receiver to
>>>> return a value via TCP to sender. The sender of course
>>>> times-out after 10 seconds telling me that the
>>>> Exchange.getOut() Message is null.
>>>>
>>>> Any suggestions?
>>>>
>>>> The InOut example from the Camel MINA examples works, but it
>>>> uses a local variable which is accessed directly by both the
>>>> receiver and sender (see protected Exchange receivedExchange;
>>>> in MinaTcpWithInOutTest.java). In my case the receiver and
>>>> sender in completely separate machines. I can see that my
>>>> sender blocks for a timeout period of 10 seconds (can we control this
>>>> parameter?) and returns. My receiver is added as a route
>>>> listeningto the TCP port but the process method of processor
>>>> is void thus there is no way to forward back a response.
>>>>
>>>> Hope all this makes sense.
>>>>
>>>> Thanks again for the huge help.
>>>>
>>>> Georgios
>>>>
>>>>
>>>>
>>>> James.Strachan wrote:
>>>> >
>>>> > On 12/02/2008, georgiosgeorgiadis
>>>> <[EMAIL PROTECTED]> wrote:
>>>> >>
>>>> >> Thanks again James,
>>>> >>
>>>> >> I will give it a try and will keep posted.
>>>> >>
>>>> >> One last thing:
>>>> >>
>>>> >> Are there any MINA-Camel examples that I can look through
>>>> somewhere?
>>>> >
>>>> > There's a bunch of test cases here...
>>>> >
>>>> https://svn.apache.org/repos/asf/activemq/camel/trunk/components/camel
>>>> > -mina/
>>>> >
>>>> > in here...
>>>> >
>>>> https://svn.apache.org/repos/asf/activemq/camel/trunk/components/camel
>>>> > -mina/src/test/java/org/apache/camel/component/mina/
>>>> >
>>>> > though these all use the default Codecs and don't configure
>>>> their own.
>>>> >
>>>> > To ease the configuration of your codec, you could create
>>>> an extension
>>>> > of the MinaComponent that customizes the Codec to use and then bind
>>>> > that new component to some URI scheme of your choosing.
>>>> >
>>>> > e.g. if you chose 'foo' as your new protocol scheme you could then
>>>> > route in Camel via...
>>>> >
>>>> > from("foo://localhost:1234").to("something");
>>>> >
>>>> > See
>>>> > http://activemq.apache.org/camel/writing-components.html
>>>> > --
>>>> > James
>>>> > -------
>>>> > http://macstrac.blogspot.com/
>>>> >
>>>> > Open Source Integration
>>>> > http://open.iona.com
>>>> >
>>>> >
>>>>
>>>> --
>>>> View this message in context:
>>>> http://www.nabble.com/Camel-TCP-receiver-endpoint-tp15430834s2
>>> 2882p15436595.html
>>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>>
>>>
>>> ----------------------------
>>> IONA Technologies PLC (registered in Ireland)
>>> Registered Number: 171387
>>> Registered Address: The IONA Building, Shelbourne Road, Dublin 4,
>>> Ireland
>>>
>>>
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/Camel-TCP-receiver-endpoint-tp15430834s22882p15528487.html
Sent from the Camel - Users mailing list archive at Nabble.com.