Hi,
Is it not possible for you to decouple request-response communication with
your server using one way invocations and use a correlationId to correlate
the server responses at a later point i.e.
1> Client sends a one way invocation to the server on a port XXX and
optionally (sends a replyTo socket address in the payload)
client:
from("file:///test/test/response")
.setHeader("replyToAddress, constant("XXX");
.to("mina:tcp://localhost:6202?sync=false");
2> At a some later point the server responds to the replyToAddress with a
response that is correlated using some correlationId in the data
server:
from("mina:tcp://localhost:6202?sync=false")
.process(new Processor() {
// ... process payload and get replyToAddress
...
// sleep fo 20 seconds
sleep(20000)
// Send response to client
ProducerTemplate template = new ProducerTemplate();
template.sendBody("XXX", response);
});
Hope this helps.
Cheers,
Ashwin
anandsk wrote:
>
> it seems to work when I use iofilter, but I am not sure when this producer
> going to be destroyed, if it gets desroyed before it receives a reply then
> I will loose message, I feel that this may not be a right solution.
>
> from("file:///test/test/response")
> .convertBodyTo(String.class).threads(1)
>
> .to("mina:tcp://localhost:6202?sync=false&textline=true&filters=#listFilters");
>
> from("vm:response")
> .to("log:+++ reply++++");
>
> public class MessageFilter extends IoFilterAdapter {
> @Produce(uri = "vm:response")
> ProducerTemplate producer;
> @Override
> public void messageReceived(NextFilter nextFilter, IoSession
> session,
> Object message) throws Exception {
> if (message instanceof String) {
> producer.sendBody(message);
> }
>
> nextFilter.messageReceived(session, message);
> }
>
> }
>
>
>
>
> anandsk wrote:
>>
>> Ashwin,
>>
>> it is a simulated consumer in my code with a delay, actual consumer is a
>> external system which could take some time to send reply.
>>
>> I am using "toasync" instead of "to" so that I don't loose message. are
>> we saying that option sync=false doesn't work in combination with
>> "toasync"?.
>>
>> Thanks for working on a new framework. I am using this for a production
>> app, so I don't have much time to wait and switch to a new tcp
>> frameworks.
>>
>> Thanks,
>> Anand
>>
>> Ashwin Karpe wrote:
>>>
>>> Hi,
>>>
>>> Anand, it seems like you have sync set to true for the consumer, thereby
>>> making it a In-Out exchange driven consumer (i.e request/response).
>>>
>>> However your producer is set with sync=false thereby making it an
>>> in-only. This will cause the response to fall through the cracks and
>>> cause connection closure on the consumer. This should hopefully fix it
>>> for you.
>>>
>>> BTW, as Claus mentioned, I am working on a Camel Netty component (coding
>>> is done, currently writing tests and adding SSL support). I will bring
>>> it to the community in the next 2-3 weeks after due testing and cleanup.
>>>
>>> Cheers,
>>>
>>> Ashwin...
>>>
>>>
>>> anandsk wrote:
>>>>
>>>> Hi, Thanks for the response. I can use only one thread for sending
>>>> messages becuase I can have only one TCP connection to external server.
>>>> if I change sync flag to true then that thread is going to wait till
>>>> the response comes back before it sends another message right?. I want
>>>> to be able to send multiple requests one after the other without
>>>> waiting for a response. responses need to be processed
>>>> asynchronously.So, I can't set sync flag to true, is there any other
>>>> solution to my problem.
>>>>
>>>> Thanks,
>>>> Anand
>>>>
>>>> willem.jiang wrote:
>>>>>
>>>>> Hi I think you need to change the route like this
>>>>>
>>>>> from("mina:tcp://localhost:6202?textline=true&sync=true").process(new
>>>>> Processor() {
>>>>> public void process(Exchange exchange) throws Exception {
>>>>> String body = exchange.getIn().getBody(String.class);
>>>>> Thread.sleep(30000);
>>>>> exchange.getOut().setBody("Bye 1" + body);
>>>>> }
>>>>> });
>>>>>
>>>>> from("file:///test/test/response")
>>>>> .convertBodyTo(String.class)
>>>>> .toAsync("mina:tcp://localhost:6202?sync=true&textline=true",10)
>>>>> .to("log:+++ reply++++");
>>>>> To make sure the mina client can get the right response.
>>>>>
>>>>> Willem
>>>>>
>>>>> anandsk wrote:
>>>>>> Thanks. yes, I have seen the examples and I modified my code. but it
>>>>>> still
>>>>>> doesn't deliver reply asyncronously.
>>>>>> I am thinking may be camel Mina's sync option may be conflicting with
>>>>>> async
>>>>>> route. Please see my code below.
>>>>>>
>>>>>>
>>>>>> from("mina:tcp://localhost:6202?textline=true&sync=true").process(new
>>>>>> Processor() {
>>>>>> public void process(Exchange exchange) throws Exception {
>>>>>> String body = exchange.getIn().getBody(String.class);
>>>>>> Thread.sleep(30000);
>>>>>> exchange.getOut().setBody("Bye 1" + body);
>>>>>> }
>>>>>> });
>>>>>>
>>>>>> from("file:///test/test/response")
>>>>>> .convertBodyTo(String.class)
>>>>>>
>>>>>> .toAsync("mina:tcp://localhost:6202?sync=false&textline=true",10)
>>>>>> .to("log:+++ reply++++");
>>>>>>
>>>>>>
>>>>>>
>>>>>> Claus Ibsen-2 wrote:
>>>>>>> Have you seen the 2 asyncTo examples which are listed here?
>>>>>>> http://camel.apache.org/examples.html
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Tue, Mar 2, 2010 at 5:10 PM, anandsk <[email protected]> wrote:
>>>>>>>> Hi,
>>>>>>>> I tried this route with camel 2.2 and it is not forwarding response
>>>>>>>> to
>>>>>>>> end
>>>>>>>> point defined in async "direct:response". also I see the logs
>>>>>>>> showing
>>>>>>>> that
>>>>>>>> mina producer receiving the message back from tcp server but it is
>>>>>>>> not
>>>>>>>> forwarding them to async endpoint. am I doing this wrong.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Anand
>>>>>>>>
>>>>>>>>
>>>>>>>> from("mina:tcp://localhost:6202?textline=true&sync=true").process(new
>>>>>>>> Processor() {
>>>>>>>> public void process(Exchange exchange) throws
>>>>>>>> Exception {
>>>>>>>> String body =
>>>>>>>> exchange.getIn().getBody(String.class);
>>>>>>>> //Thread.currentThread();
>>>>>>>> Thread.sleep(1000);
>>>>>>>> exchange.getOut().setBody("Bye 1" +
>>>>>>>> body+"\n");
>>>>>>>> //exchange.getOut().setBody("Bye 2" +
>>>>>>>> body+"\n");
>>>>>>>> }
>>>>>>>> });
>>>>>>>>
>>>>>>>>
>>>>>>>> //from("jms:test.Camel1")
>>>>>>>> from("file:///test/test/response")
>>>>>>>> .convertBodyTo(String.class).threads(1)
>>>>>>>> //.to("log:jms.queue.message")
>>>>>>>> //.bean(smooks.StatusRequestMessageHandler.class)
>>>>>>>> //.setHeader(MinaEndpoint.HEADER_MINA_IOSESSION,
>>>>>>>> expression)
>>>>>>>>
>>>>>>>> .to("mina:tcp://localhost:6202?textline=true&sync=true")
>>>>>>>> .toAsync("direct:response",1)
>>>>>>>> .to("log:direct");
>>>>>>>>
>>>>>>>> from("direct:response")
>>>>>>>> .to("log:jms.queue.message");
>>>>>>>> --
>>>>>>>> View this message in context:
>>>>>>>> http://old.nabble.com/Mina-async-route-not-working-tp27757690p27757690.html
>>>>>>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Claus Ibsen
>>>>>>> Apache Camel Committer
>>>>>>>
>>>>>>> Author of Camel in Action: http://www.manning.com/ibsen/
>>>>>>> Open Source Integration: http://fusesource.com
>>>>>>> Blog: http://davsclaus.blogspot.com/
>>>>>>> Twitter: http://twitter.com/davsclaus
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>
-----
---
Ashwin Karpe, Principal Consultant, PS - Opensource Center of Competence
Progress Software Corporation
14 Oak Park Drive
Bedford, MA 01730
---
+1-972-304-9084 (Office)
+1-972-971-1700 (Mobile)
----
Blog: http://opensourceknowledge.blogspot.com/
--
View this message in context:
http://old.nabble.com/Mina-async-route-not-working-tp27757690p27779803.html
Sent from the Camel - Users mailing list archive at Nabble.com.