You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Willem Jiang <wi...@gmail.com> on 2010/04/01 07:42:57 UTC

Re: async requests and responses on a single connection

I don't think current mina producer can do the work that you want.
But if you take a look at the Camel 2.x Async[1], and 
JettyHttpProduer[2], you can find a way to implement the async request 
and response with Camel.

[1] http://camel.apache.org/async.html
[2] 
https://svn.apache.org/repos/asf/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java

Willem

anandsk wrote:
> Thanks for response,I beleive it's same behavior in camel mina 2.0 and 2.2.
> we are thinking of using 2.0M2 as we have release in a month. But my main
> question is how do I keep this producer object/component alive till a route
> is shutdown so that I don't loose any messages. any thoughts on solution
> below, i know it is not elegant as I am using filter to capture the replies
> from external server but would there be a possibility of loosing messages
> with this approach?. 
> also what is the life cycle of a producer/component?.
> 
> 
> 
> 
> willem.jiang wrote:
>> I think you can let the producer keep the connection.
>> I just checked the code of camel-mina, the mina producer only close the 
>> session if the disconnect option[1] is true (it is new for camel 2.3.0).
>> So please try out the latest Camel 2.3.0-SNAPSHOT for verification.
>>
>> [1]http://camel.apache.org/mina.html
>>
>> Willem
>>
>> anandsk wrote:
>>> can I make the producer object to stay around and keep it connected to
>>> external address until a route is shutdown that way we can gurantee no
>>> loss
>>> of message?.any thoughts?.
>>>
>>>
>>> anandsk wrote:
>>>> Sorry this may be a repost. I was wondering if anyone has solved this. I
>>>> can use only one thread for sending messages becuase I can have only
>>>> single TCP connection to external server. I want to be able to send
>>>> multiple requests one after the other without waiting for a response.
>>>> responses need to be processed asynchronously. any solutions for this
>>>> scenario?. 
>>>> Here is one possible solution but I am not sure about the life cycle of
>>>> the mina endpoint, is it possible to loose messages with this solution?.
>>>> I
>>>> have also written custom component to share same endpoint/receivehandler
>>>> for the producer and consumer. I would like to use below solution or
>>>> variation of it  if there are no problems with it. as you can see below
>>>> solution is very simple compared to writing a custom component.
>>>> also I want to findout if 2.3 or later releases have plans to include a
>>>> component for the typical requirement defined above.
>>>>
>>>>
>>>>                 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); 
>>>>             } 
>>>>         
>>>> } 
>>>>
>>>>
>>>>
>>
>>
> 


Re: async requests and responses on a single connection

Posted by anandsk <sk...@arccorp.com>.
you are right, async api doesn't. But I am talking about using sync option
with Mina. Mina has a timeout, so like I mentioned below wouldn't I have
syncrnization issues or message receive starvation issue and timeout on a
message. in the end I loose messages?. if I use sync=false option in Mina
then it returns before even reply arrives.



willem.jiang wrote:
> 
> Current async API doesn't provides the mechanism to check if the 
> response message is time out, maybe you should write some customer code 
> to maintain the response message and do the time out check yourself.
> 
> Willem
> 
> anandsk wrote:
>> I have looked over async. but I have to use only one connection and
>> message
>> receive order is not gauranteed, I am thinking it is possible to have
>> syncrnization issues or message receive starvation issue and timeout on a
>> message. in the end I loose messages?.
>> 
>> 
>> 
>> willem.jiang wrote:
>>> I don't think current mina producer can do the work that you want.
>>> But if you take a look at the Camel 2.x Async[1], and 
>>> JettyHttpProduer[2], you can find a way to implement the async request 
>>> and response with Camel.
>>>
>>> [1] http://camel.apache.org/async.html
>>> [2] 
>>> https://svn.apache.org/repos/asf/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java
>>>
>>> Willem
>>>
>>> anandsk wrote:
>>>> Thanks for response,I beleive it's same behavior in camel mina 2.0 and
>>>> 2.2.
>>>> we are thinking of using 2.0M2 as we have release in a month. But my
>>>> main
>>>> question is how do I keep this producer object/component alive till a
>>>> route
>>>> is shutdown so that I don't loose any messages. any thoughts on
>>>> solution
>>>> below, i know it is not elegant as I am using filter to capture the
>>>> replies
>>>> from external server but would there be a possibility of loosing
>>>> messages
>>>> with this approach?. 
>>>> also what is the life cycle of a producer/component?.
>>>>
>>>>
>>>>
>>>>
>>>> willem.jiang wrote:
>>>>> I think you can let the producer keep the connection.
>>>>> I just checked the code of camel-mina, the mina producer only close
>>>>> the 
>>>>> session if the disconnect option[1] is true (it is new for camel
>>>>> 2.3.0).
>>>>> So please try out the latest Camel 2.3.0-SNAPSHOT for verification.
>>>>>
>>>>> [1]http://camel.apache.org/mina.html
>>>>>
>>>>> Willem
>>>>>
>>>>> anandsk wrote:
>>>>>> can I make the producer object to stay around and keep it connected
>>>>>> to
>>>>>> external address until a route is shutdown that way we can gurantee
>>>>>> no
>>>>>> loss
>>>>>> of message?.any thoughts?.
>>>>>>
>>>>>>
>>>>>> anandsk wrote:
>>>>>>> Sorry this may be a repost. I was wondering if anyone has solved
>>>>>>> this.
>>>>>>> I
>>>>>>> can use only one thread for sending messages becuase I can have only
>>>>>>> single TCP connection to external server. I want to be able to send
>>>>>>> multiple requests one after the other without waiting for a
>>>>>>> response.
>>>>>>> responses need to be processed asynchronously. any solutions for
>>>>>>> this
>>>>>>> scenario?. 
>>>>>>> Here is one possible solution but I am not sure about the life cycle
>>>>>>> of
>>>>>>> the mina endpoint, is it possible to loose messages with this
>>>>>>> solution?.
>>>>>>> I
>>>>>>> have also written custom component to share same
>>>>>>> endpoint/receivehandler
>>>>>>> for the producer and consumer. I would like to use below solution or
>>>>>>> variation of it  if there are no problems with it. as you can see
>>>>>>> below
>>>>>>> solution is very simple compared to writing a custom component.
>>>>>>> also I want to findout if 2.3 or later releases have plans to
>>>>>>> include
>>>>>>> a
>>>>>>> component for the typical requirement defined above.
>>>>>>>
>>>>>>>
>>>>>>>                 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); 
>>>>>>>             } 
>>>>>>>         
>>>>>>> } 
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>
>>>
>>>
>> 
> 
> 
> 

-- 
View this message in context: http://old.nabble.com/async-requests-and-responses-on-a-single-connection-tp28071805p28110494.html
Sent from the Camel - Users mailing list archive at Nabble.com.


Re: async requests and responses on a single connection

Posted by Willem Jiang <wi...@gmail.com>.
Current async API doesn't provides the mechanism to check if the 
response message is time out, maybe you should write some customer code 
to maintain the response message and do the time out check yourself.

Willem

anandsk wrote:
> I have looked over async. but I have to use only one connection and message
> receive order is not gauranteed, I am thinking it is possible to have
> syncrnization issues or message receive starvation issue and timeout on a
> message. in the end I loose messages?.
> 
> 
> 
> willem.jiang wrote:
>> I don't think current mina producer can do the work that you want.
>> But if you take a look at the Camel 2.x Async[1], and 
>> JettyHttpProduer[2], you can find a way to implement the async request 
>> and response with Camel.
>>
>> [1] http://camel.apache.org/async.html
>> [2] 
>> https://svn.apache.org/repos/asf/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java
>>
>> Willem
>>
>> anandsk wrote:
>>> Thanks for response,I beleive it's same behavior in camel mina 2.0 and
>>> 2.2.
>>> we are thinking of using 2.0M2 as we have release in a month. But my main
>>> question is how do I keep this producer object/component alive till a
>>> route
>>> is shutdown so that I don't loose any messages. any thoughts on solution
>>> below, i know it is not elegant as I am using filter to capture the
>>> replies
>>> from external server but would there be a possibility of loosing messages
>>> with this approach?. 
>>> also what is the life cycle of a producer/component?.
>>>
>>>
>>>
>>>
>>> willem.jiang wrote:
>>>> I think you can let the producer keep the connection.
>>>> I just checked the code of camel-mina, the mina producer only close the 
>>>> session if the disconnect option[1] is true (it is new for camel 2.3.0).
>>>> So please try out the latest Camel 2.3.0-SNAPSHOT for verification.
>>>>
>>>> [1]http://camel.apache.org/mina.html
>>>>
>>>> Willem
>>>>
>>>> anandsk wrote:
>>>>> can I make the producer object to stay around and keep it connected to
>>>>> external address until a route is shutdown that way we can gurantee no
>>>>> loss
>>>>> of message?.any thoughts?.
>>>>>
>>>>>
>>>>> anandsk wrote:
>>>>>> Sorry this may be a repost. I was wondering if anyone has solved this.
>>>>>> I
>>>>>> can use only one thread for sending messages becuase I can have only
>>>>>> single TCP connection to external server. I want to be able to send
>>>>>> multiple requests one after the other without waiting for a response.
>>>>>> responses need to be processed asynchronously. any solutions for this
>>>>>> scenario?. 
>>>>>> Here is one possible solution but I am not sure about the life cycle
>>>>>> of
>>>>>> the mina endpoint, is it possible to loose messages with this
>>>>>> solution?.
>>>>>> I
>>>>>> have also written custom component to share same
>>>>>> endpoint/receivehandler
>>>>>> for the producer and consumer. I would like to use below solution or
>>>>>> variation of it  if there are no problems with it. as you can see
>>>>>> below
>>>>>> solution is very simple compared to writing a custom component.
>>>>>> also I want to findout if 2.3 or later releases have plans to include
>>>>>> a
>>>>>> component for the typical requirement defined above.
>>>>>>
>>>>>>
>>>>>>                 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); 
>>>>>>             } 
>>>>>>         
>>>>>> } 
>>>>>>
>>>>>>
>>>>>>
>>>>
>>
>>
> 


Re: async requests and responses on a single connection

Posted by anandsk <sk...@arccorp.com>.
I have looked over async. but I have to use only one connection and message
receive order is not gauranteed, I am thinking it is possible to have
syncrnization issues or message receive starvation issue and timeout on a
message. in the end I loose messages?.



willem.jiang wrote:
> 
> I don't think current mina producer can do the work that you want.
> But if you take a look at the Camel 2.x Async[1], and 
> JettyHttpProduer[2], you can find a way to implement the async request 
> and response with Camel.
> 
> [1] http://camel.apache.org/async.html
> [2] 
> https://svn.apache.org/repos/asf/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java
> 
> Willem
> 
> anandsk wrote:
>> Thanks for response,I beleive it's same behavior in camel mina 2.0 and
>> 2.2.
>> we are thinking of using 2.0M2 as we have release in a month. But my main
>> question is how do I keep this producer object/component alive till a
>> route
>> is shutdown so that I don't loose any messages. any thoughts on solution
>> below, i know it is not elegant as I am using filter to capture the
>> replies
>> from external server but would there be a possibility of loosing messages
>> with this approach?. 
>> also what is the life cycle of a producer/component?.
>> 
>> 
>> 
>> 
>> willem.jiang wrote:
>>> I think you can let the producer keep the connection.
>>> I just checked the code of camel-mina, the mina producer only close the 
>>> session if the disconnect option[1] is true (it is new for camel 2.3.0).
>>> So please try out the latest Camel 2.3.0-SNAPSHOT for verification.
>>>
>>> [1]http://camel.apache.org/mina.html
>>>
>>> Willem
>>>
>>> anandsk wrote:
>>>> can I make the producer object to stay around and keep it connected to
>>>> external address until a route is shutdown that way we can gurantee no
>>>> loss
>>>> of message?.any thoughts?.
>>>>
>>>>
>>>> anandsk wrote:
>>>>> Sorry this may be a repost. I was wondering if anyone has solved this.
>>>>> I
>>>>> can use only one thread for sending messages becuase I can have only
>>>>> single TCP connection to external server. I want to be able to send
>>>>> multiple requests one after the other without waiting for a response.
>>>>> responses need to be processed asynchronously. any solutions for this
>>>>> scenario?. 
>>>>> Here is one possible solution but I am not sure about the life cycle
>>>>> of
>>>>> the mina endpoint, is it possible to loose messages with this
>>>>> solution?.
>>>>> I
>>>>> have also written custom component to share same
>>>>> endpoint/receivehandler
>>>>> for the producer and consumer. I would like to use below solution or
>>>>> variation of it  if there are no problems with it. as you can see
>>>>> below
>>>>> solution is very simple compared to writing a custom component.
>>>>> also I want to findout if 2.3 or later releases have plans to include
>>>>> a
>>>>> component for the typical requirement defined above.
>>>>>
>>>>>
>>>>>                 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); 
>>>>>             } 
>>>>>         
>>>>> } 
>>>>>
>>>>>
>>>>>
>>>
>>>
>> 
> 
> 
> 

-- 
View this message in context: http://old.nabble.com/async-requests-and-responses-on-a-single-connection-tp28071805p28107797.html
Sent from the Camel - Users mailing list archive at Nabble.com.