RE: Bi-directional comms on TCP connection

2015-04-15 Thread Quoc Le
Hi Willem,

I look at the code and your unit test NettyConsumerClientModeTest but still 
don't quite follow why clientMode can help with the case that Carl described. 
How can the consumer-server connects to the client-device in the first place? 
Can you explain the magic there?

Thanks,
-Quoc



-Original Message-
From: Willem Jiang [mailto:willem.ji...@gmail.com] 
Sent: Wednesday, April 15, 2015 3:00 AM
To: users@camel.apache.org
Subject: Re: Bi-directional comms on TCP connection

We implement CAMEL-1077[1] in camel-2.15.x recently, so the ESB can talk to the 
device as a client to receive the events. But now the miss part is how can we 
share the channel between netty consumer and the netty producer. 

[1]https://issues.apache.org/jira/browse/CAMEL-1077

--
Willem Jiang

Red Hat, Inc.
Web: http://www.redhat.com
Blog: http://willemjiang.blogspot.com (English) http://jnn.iteye.com (Chinese)
Twitter: willemjiang
Weibo: 姜宁willem



On April 14, 2015 at 11:33:13 PM, Carl Nygard (cjnyg...@gmail.com) wrote:
 I have a question about the Mina/Netty TCP connector in Camel. Can 
 Mina/Netty handle bi-directional comms through Camel, or do we need to 
 handle this type of interface externally? We have embedded devices 
 (button/light combo) that will consume TCP messages to light a device 
 and initiate messages to indicate button press events. In other words, 
 the device is the server, but will also spontaneously generate event 
 messages back to the client/ESB. Both sides (server/device,client/ESB) 
 expect ACKs for messages. So in essence, it is a 2-way communication 
 using 1 TCP connection, initiated by ESB.
  
  
  
 Unfortunately, Camel Netty and Mina doesn’t have the capability to 
 support 2-way asynchronous 
 (https://issues.apache.org/jira/browse/CAMEL-2624 - It’s still open 
 ticket rom 2010, 2012 + this is the duplicated ticket with some more 
 context: https://issues.apache.org/jira/browse/CAMEL-1075 )
  
  
  
 What we have tried so far:
  
  
  
 1. synchronous channel (before realize the limitation above): This 
 will always require our ESB-EndPoint to initiate the conversation, 
 good to receive ACK, but not allowing device to send Event message at will.
  
  
  
 2. asynchronous channel: (http://camel.apache.org/async.html ) With 
 async model, we can send request, do something else and let the async 
 callback to process the reply. However, we still have a 1-1 
 relationship between request and reply, and so in order to allow 
 device to “initiate” the Event message, ESB-Endpoint will need to send 
 more “no-op requests” to device-Endpoint, to catch for ACK and Event message.
  
  
  
 This solution is not beautiful (quite hacking), and will not work if 
 there’s no “no-op operation” (e.g. device will ACK on all messages sent).
  
  
  
 3. Look at examples in these 2 books: “Camel in Actions” ( 
 https://dl.dropboxusercontent.com/u/3786274/Camel%20In%20Action.pdf ) 
 and “Apache Camel Developer’s Cookbook” ( 
 https://dl.dropboxusercontent.com/u/3786274/Apache%20Camel%20Developer
 %20Cookbook.pdf
 )
 but not much light on the issue we are facing.
  
  
 Any help?
  
  
 --carl
  



RE: Bi-directional comms on TCP connection

2015-04-15 Thread Willem Jiang
First the Netty or Mina Consumer works in clientMode just connect the address 
of the device as a client when the route is started, then it can keep receiving 
the event from the device.

If the consumer doesn’t work in clientMode, it just start a server which listen 
to address and wait for the client to connect.

--  
Willem Jiang

Red Hat, Inc.
Web: http://www.redhat.com
Blog: http://willemjiang.blogspot.com (English)
http://jnn.iteye.com (Chinese)
Twitter: willemjiang  
Weibo: 姜宁willem



On April 16, 2015 at 7:30:45 AM, Quoc Le (quo...@fortna.com) wrote:
 Hi Willem,
  
 I look at the code and your unit test NettyConsumerClientModeTest but still 
 don't quite  
 follow why clientMode can help with the case that Carl described. How can the 
 consumer-server  
 connects to the client-device in the first place? Can you explain the magic 
 there?  
  
 Thanks,
 -Quoc
  
  
  
 -Original Message-
 From: Willem Jiang [mailto:willem.ji...@gmail.com]
 Sent: Wednesday, April 15, 2015 3:00 AM
 To: users@camel.apache.org
 Subject: Re: Bi-directional comms on TCP connection
  
 We implement CAMEL-1077[1] in camel-2.15.x recently, so the ESB can talk to 
 the device  
 as a client to receive the events. But now the miss part is how can we share 
 the channel between  
 netty consumer and the netty producer.
  
 [1]https://issues.apache.org/jira/browse/CAMEL-1077
  
 --
 Willem Jiang
  
 Red Hat, Inc.
 Web: http://www.redhat.com
 Blog: http://willemjiang.blogspot.com (English) http://jnn.iteye.com 
 (Chinese)  
 Twitter: willemjiang
 Weibo: 姜宁willem
  
  
  
 On April 14, 2015 at 11:33:13 PM, Carl Nygard (cjnyg...@gmail.com) wrote:
  I have a question about the Mina/Netty TCP connector in Camel. Can
  Mina/Netty handle bi-directional comms through Camel, or do we need to
  handle this type of interface externally? We have embedded devices
  (button/light combo) that will consume TCP messages to light a device
  and initiate messages to indicate button press events. In other words,
  the device is the server, but will also spontaneously generate event
  messages back to the client/ESB. Both sides (server/device,client/ESB)
  expect ACKs for messages. So in essence, it is a 2-way communication
  using 1 TCP connection, initiated by ESB.
 
 
 
  Unfortunately, Camel Netty and Mina doesn’t have the capability to
  support 2-way asynchronous
  (https://issues.apache.org/jira/browse/CAMEL-2624 - It’s still open
  ticket rom 2010, 2012 + this is the duplicated ticket with some more
  context: https://issues.apache.org/jira/browse/CAMEL-1075 )
 
 
 
  What we have tried so far:
 
 
 
  1. synchronous channel (before realize the limitation above): This
  will always require our ESB-EndPoint to initiate the conversation,
  good to receive ACK, but not allowing device to send Event message at will.
 
 
 
  2. asynchronous channel: (http://camel.apache.org/async.html ) With
  async model, we can send request, do something else and let the async
  callback to process the reply. However, we still have a 1-1
  relationship between request and reply, and so in order to allow
  device to “initiate” the Event message, ESB-Endpoint will need to send
  more “no-op requests” to device-Endpoint, to catch for ACK and Event 
  message.
 
 
 
  This solution is not beautiful (quite hacking), and will not work if
  there’s no “no-op operation” (e.g. device will ACK on all messages sent).
 
 
 
  3. Look at examples in these 2 books: “Camel in Actions” (
  https://dl.dropboxusercontent.com/u/3786274/Camel%20In%20Action.pdf )
  and “Apache Camel Developer’s Cookbook” (
  https://dl.dropboxusercontent.com/u/3786274/Apache%20Camel%20Developer  
  %20Cookbook.pdf
  )
  but not much light on the issue we are facing.
 
 
  Any help?
 
 
  --carl
 
  
  



Re: Bi-directional comms on TCP connection

2015-04-15 Thread Willem Jiang
We implement CAMEL-1077[1] in camel-2.15.x recently, so the ESB can talk to the 
device as a client to receive the events. But now the miss part is how can we 
share the channel between netty consumer and the netty producer. 

[1]https://issues.apache.org/jira/browse/CAMEL-1077

--  
Willem Jiang

Red Hat, Inc.
Web: http://www.redhat.com
Blog: http://willemjiang.blogspot.com (English)
http://jnn.iteye.com (Chinese)
Twitter: willemjiang  
Weibo: 姜宁willem



On April 14, 2015 at 11:33:13 PM, Carl Nygard (cjnyg...@gmail.com) wrote:
 I have a question about the Mina/Netty TCP connector in Camel. Can
 Mina/Netty handle bi-directional comms through Camel, or do we need to
 handle this type of interface externally? We have embedded devices
 (button/light combo) that will consume TCP messages to light a device and
 initiate messages to indicate button press events. In other words, the
 device is the server, but will also spontaneously generate event messages
 back to the client/ESB. Both sides (server/device,client/ESB) expect ACKs
 for messages. So in essence, it is a 2-way communication using 1 TCP
 connection, initiated by ESB.
  
  
  
 Unfortunately, Camel Netty and Mina doesn’t have the capability to support
 2-way asynchronous (https://issues.apache.org/jira/browse/CAMEL-2624 - It’s  
 still open ticket rom 2010, 2012 + this is the duplicated ticket with some
 more context: https://issues.apache.org/jira/browse/CAMEL-1075 )
  
  
  
 What we have tried so far:
  
  
  
 1. synchronous channel (before realize the limitation above): This will
 always require our ESB-EndPoint to initiate the conversation, good to
 receive ACK, but not allowing device to send Event message at will.
  
  
  
 2. asynchronous channel: (http://camel.apache.org/async.html ) With async
 model, we can send request, do something else and let the async callback to
 process the reply. However, we still have a 1-1 relationship between
 request and reply, and so in order to allow device to “initiate” the Event
 message, ESB-Endpoint will need to send more “no-op requests” to
 device-Endpoint, to catch for ACK and Event message.
  
  
  
 This solution is not beautiful (quite hacking), and will not work if
 there’s no “no-op operation” (e.g. device will ACK on all messages sent).
  
  
  
 3. Look at examples in these 2 books: “Camel in Actions” (
 https://dl.dropboxusercontent.com/u/3786274/Camel%20In%20Action.pdf ) and  
 “Apache Camel Developer’s Cookbook” (
 https://dl.dropboxusercontent.com/u/3786274/Apache%20Camel%20Developer%20Cookbook.pdf
   
 )
 but not much light on the issue we are facing.
  
  
 Any help?
  
  
 --carl