I'm working on my first Camel-based integration project and have a question
about integrating to an existing TCP-server (for which I don't have a source
code so no changes can be done to it) with either Mina or Netty (not sure
which is the better one to use for this). I've read the Camel in Action-book
but didn't find the answer there for this particular scenario.

The scenario is as follows:
- There is a legacy server application X that exposes a TCP server-port
9999.
- The application X is to be used so that a TCP-client opens a connection to
port 9999, sends one string "CONNECT"+CRLF and nothing else and then starts
listening the incoming stream from the server.
- Application X will periodically (time varies randomly, from seconds to
hours) send a string to the TCP-client and the TCP-client should then do
something with it, in my case it should be forwarded to a JMS-queue as a
TextMessage.
- The TCP-client should keep the connection open indefinitely and it
connection is lost, automatically retry the connection until it succeeds and
then continue processing like above.

I have been able to partly implement this with Camel with Mina BUT ONLY so
that Mina exposes a TCP-server that can be contacted with my simple
test-client. I am able to send strings from the test client and have them
forwarded as JMS-messages so the routing part seems to work as long as I
just get something into the TCP-server endpoint.

But here is my problem How do I get the TCP-endpoint to act as TCP-client
instead of TCP-server, i.e. connect to the TCP-server port 9999, send the
CONNECT-string once and then just keep the connection open and process the
incoming strings from the TCP-server?!?

I can't use polling to contact the server because it doesn't store anything
for later retrieval, it will only send data to connected TCP-clients if they
are connect at the moment when it has data to send, it is a kind of
"sensor"-type of application with no message/data buffering. Furthermore,
the system is very time-sensitive, I must process the text message
immediately after the server sends it, say, within 100-200ms, definitely
under 1s.

So, first of all: Is this possible with existing components, either Mina or
Netty? Which one? How would I define the endpoint? Or do I need to write my
own component? I've done some TCP-socket programming with Java so that would
be doable, but I'd like to avoid that if possible and just use the existing
stuff provided with Camel, otherwise; what's the point of using it. But
obviously I'll try the custom-component way if I have to.

So optimally I'd like the system to act something like this:
- When I start the CamelContext, a TCP-client endpoint will actively try to
connect to the TCP-server on port 9999 and if it fails, it will try again
periodically, say, once every 10 seconds. And also if the connection is
lost, it would retry to connect again automatically. The reason being that
the server may be unreachable at times so the TCP-client endpoint should be
robust enough to retry to connect if the connection is lost or server app
not reached immediately.
- After connection is formed, the TCP-client endpoint should keep the
connection open, listen to the inbound server-stream and when it receives a
line of text from the server, just forward it to the JMS-queue as
textmessage,the received string being the body.

Any advice on implementing this? It doesn't feel to me that complex
scenario, only the TCP-client/server roles seem a bit problematic.



--
View this message in context: 
http://camel.465427.n5.nabble.com/How-to-act-as-TCP-client-with-Camel-Mina-Netty-tp5718671.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to