Files
spring-integration-samples/basic/tcp-client-server/README.md
Artem Bilan cb052d2d98 URL Cleanup
This commit updates URLs to prefer the https protocol.
Redirects are not followed to avoid accidentally expanding intentionally
shortened URLs (i.e. if using a URL shortener).

# HTTP URLs that Could Not Be Fixed
These URLs were unable to be fixed.
Please review them to see if they can be manually resolved.

* [ ] http://blueprintcss.org (200) with 3 occurrences could not be migrated:
   ([https](https://blueprintcss.org) result AnnotatedConnectException).
* [ ] http://jmesnil.net/ (200) with 1 occurrences could not be migrated:
   ([https](https://jmesnil.net/) result ConnectTimeoutException).
* [ ] http://jtds.sourceforge.net (200) with 1 occurrences could not be migrated:
   ([https](https://jtds.sourceforge.net) result AnnotatedConnectException).
* [ ] http://www.jmesnil.net/stomp-websocket/doc/ (301) with 1 occurrences could not be migrated:
   ([https](https://www.jmesnil.net/stomp-websocket/doc/) result ConnectTimeoutException).
* [ ] http://enfranchisedmind.com/blog/posts/jquery-periodicalupdater-ajax-polling/ (404) with 1 occurrences could not be migrated:
   ([https](https://enfranchisedmind.com/blog/posts/jquery-periodicalupdater-ajax-polling/) result SSLHandshakeException).

# Fixed URLs

## Fixed But Review Recommended
These URLs were fixed, but the https status was not OK.
However, the https status was the same as the http request or http redirected to an https URL, so they were migrated.
Your review is recommended.

* [ ] http://smokejumperit.com (301) with 1 occurrences migrated to:
  https://blog.enfranchisedmind.com/posts/author/candide/?coming_from=smokejumperit.com ([https](https://smokejumperit.com) result UnknownHostException).
* [ ] http://sockjs.org (303) with 2 occurrences migrated to:
  https://github.com/sockjs/sockjs-client ([https](https://sockjs.org) result AnnotatedConnectException).
* [ ] http://platform.beta.mapquest.com/traffic/ (UnknownHostException) with 1 occurrences migrated to:
  https://platform.beta.mapquest.com/traffic/ ([https](https://platform.beta.mapquest.com/traffic/) result UnknownHostException).
* [ ] http://en.wikipedia.org/wiki/Caf%C3%A9 (301) with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Caf%25C3%25A9 ([https](https://en.wikipedia.org/wiki/Caf%C3%A9) result 400).
* [ ] http://ws.cdyne.com/WeatherWS/ (403) with 3 occurrences migrated to:
  https://ws.cdyne.com/WeatherWS/ ([https](https://ws.cdyne.com/WeatherWS/) result 403).
* [ ] http://blogs.oracle.com/swinger/entry/collections_trick_i_lru_cache (404) with 1 occurrences migrated to:
  https://blogs.oracle.com/swinger/entry/collections_trick_i_lru_cache ([https](https://blogs.oracle.com/swinger/entry/collections_trick_i_lru_cache) result 404).
* [ ] http://static.springsource.org/spring-integration/docs/latest-ga/reference/html/samples.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring-integration/docs/latest-ga/reference/html/samples.html ([https](https://static.springsource.org/spring-integration/docs/latest-ga/reference/html/samples.html) result 404).
* [ ] http://static.springsource.org/spring-integration/reference/html/messaging-routing-chapter.html (301) with 3 occurrences migrated to:
  https://docs.spring.io/spring-integration/reference/html/messaging-routing-chapter.html ([https](https://static.springsource.org/spring-integration/reference/html/messaging-routing-chapter.html) result 404).
* [ ] http://docs.spring.io/spring-integration/reference/html/samples.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring-integration/reference/html/samples.html ([https](https://docs.spring.io/spring-integration/reference/html/samples.html) result 404).
* [ ] http://static.springsource.org/spring-integration/reference/htmlsingle/ (301) with 4 occurrences migrated to:
  https://docs.spring.io/spring-integration/reference/htmlsingle/ ([https](https://static.springsource.org/spring-integration/reference/htmlsingle/) result 404).
* [ ] http://xml.apache.org/xslt (404) with 3 occurrences migrated to:
  https://xml.apache.org/xslt ([https](https://xml.apache.org/xslt) result 404).
* [ ] http://customcode.info (503) with 1 occurrences migrated to:
  https://customcode.info ([https](https://customcode.info) result 503).

## Fixed Success
These URLs were switched to an https URL with a 2xx status. While the status was successful, your review is still recommended.

* [ ] http://activemq.apache.org/ with 1 occurrences migrated to:
  https://activemq.apache.org/ ([https](https://activemq.apache.org/) result 200).
* [ ] http://db.apache.org/derby/ with 1 occurrences migrated to:
  https://db.apache.org/derby/ ([https](https://db.apache.org/derby/) result 200).
* [ ] http://developer.mapquest.com/ with 1 occurrences migrated to:
  https://developer.mapquest.com/ ([https](https://developer.mapquest.com/) result 200).
* [ ] http://docs.oracle.com/javase/tutorial/jmx/mbeans/index.html with 1 occurrences migrated to:
  https://docs.oracle.com/javase/tutorial/jmx/mbeans/index.html ([https](https://docs.oracle.com/javase/tutorial/jmx/mbeans/index.html) result 200).
* [ ] http://static.springsource.org/spring-integration/api/org/springframework/integration/ip/tcp/serializer/ByteArrayCrLfSerializer.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring-integration/api/org/springframework/integration/ip/tcp/serializer/ByteArrayCrLfSerializer.html ([https](https://static.springsource.org/spring-integration/api/org/springframework/integration/ip/tcp/serializer/ByteArrayCrLfSerializer.html) result 200).
* [ ] http://static.springsource.org/spring-integration/api/org/springframework/integration/ip/tcp/serializer/ByteArrayStxEtxSerializer.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring-integration/api/org/springframework/integration/ip/tcp/serializer/ByteArrayStxEtxSerializer.html ([https](https://static.springsource.org/spring-integration/api/org/springframework/integration/ip/tcp/serializer/ByteArrayStxEtxSerializer.html) result 200).
* [ ] http://static.springsource.org/spring-integration/api/org/springframework/integration/store/MessageGroupStoreReaper.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring-integration/api/org/springframework/integration/store/MessageGroupStoreReaper.html ([https](https://static.springsource.org/spring-integration/api/org/springframework/integration/store/MessageGroupStoreReaper.html) result 200).
* [ ] http://static.springsource.org/spring-integration/docs/2.2.0.RC3/reference/htmlsingle/ (301) with 2 occurrences migrated to:
  https://docs.spring.io/spring-integration/docs/2.2.0.RC3/reference/htmlsingle/ ([https](https://static.springsource.org/spring-integration/docs/2.2.0.RC3/reference/htmlsingle/) result 200).
* [ ] http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/convert/ConversionService.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/convert/ConversionService.html ([https](https://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/convert/ConversionService.html) result 200).
* [ ] http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/serializer/Deserializer.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/serializer/Deserializer.html ([https](https://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/serializer/Deserializer.html) result 200).
* [ ] http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/serializer/Serializer.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/serializer/Serializer.html ([https](https://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/core/serializer/Serializer.html) result 200).
* [ ] http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html (301) with 1 occurrences migrated to:
  https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html ([https](https://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html) result 200).
* [ ] http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol ([https](https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol) result 200).
* [ ] http://en.wikipedia.org/wiki/Binary_Synchronous_Communications with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Binary_Synchronous_Communications ([https](https://en.wikipedia.org/wiki/Binary_Synchronous_Communications) result 200).
* [ ] http://en.wikipedia.org/wiki/CURL with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/CURL ([https](https://en.wikipedia.org/wiki/CURL) result 200).
* [ ] http://en.wikipedia.org/wiki/Control_character with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Control_character ([https](https://en.wikipedia.org/wiki/Control_character) result 200).
* [ ] http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol with 2 occurrences migrated to:
  https://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol ([https](https://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol) result 200).
* [ ] http://en.wikipedia.org/wiki/Java_Message_Service with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Java_Message_Service ([https](https://en.wikipedia.org/wiki/Java_Message_Service) result 200).
* [ ] http://en.wikipedia.org/wiki/Netcat with 2 occurrences migrated to:
  https://en.wikipedia.org/wiki/Netcat ([https](https://en.wikipedia.org/wiki/Netcat) result 200).
* [ ] http://en.wikipedia.org/wiki/Newline with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Newline ([https](https://en.wikipedia.org/wiki/Newline) result 200).
* [ ] http://en.wikipedia.org/wiki/OAuth with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/OAuth ([https](https://en.wikipedia.org/wiki/OAuth) result 200).
* [ ] http://en.wikipedia.org/wiki/SOAP with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/SOAP ([https](https://en.wikipedia.org/wiki/SOAP) result 200).
* [ ] http://en.wikipedia.org/wiki/Telnet with 2 occurrences migrated to:
  https://en.wikipedia.org/wiki/Telnet ([https](https://en.wikipedia.org/wiki/Telnet) result 200).
* [ ] http://en.wikipedia.org/wiki/Transmission_Control_Protocol with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Transmission_Control_Protocol ([https](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) result 200).
* [ ] http://en.wikipedia.org/wiki/XML with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/XML ([https](https://en.wikipedia.org/wiki/XML) result 200).
* [ ] http://en.wikipedia.org/wiki/XPath with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/XPath ([https](https://en.wikipedia.org/wiki/XPath) result 200).
* [ ] http://en.wikipedia.org/wiki/XSLT with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/XSLT ([https](https://en.wikipedia.org/wiki/XSLT) result 200).
* [ ] http://hillert.blogspot.com/2011/01/marshal-json-data-using-jackson-in.html with 1 occurrences migrated to:
  https://hillert.blogspot.com/2011/01/marshal-json-data-using-jackson-in.html ([https](https://hillert.blogspot.com/2011/01/marshal-json-data-using-jackson-in.html) result 200).
* [ ] http://hillert.blogspot.com/2011/05/testing-email-notifications-with-apache.html with 1 occurrences migrated to:
  https://hillert.blogspot.com/2011/05/testing-email-notifications-with-apache.html ([https](https://hillert.blogspot.com/2011/05/testing-email-notifications-with-apache.html) result 200).
* [ ] http://james.apache.org/ with 1 occurrences migrated to:
  https://james.apache.org/ ([https](https://james.apache.org/) result 200).
* [ ] http://james.apache.org/server/3/quick-start.html with 1 occurrences migrated to:
  https://james.apache.org/server/3/quick-start.html ([https](https://james.apache.org/server/3/quick-start.html) result 200).
* [ ] http://jquery.com/ with 1 occurrences migrated to:
  https://jquery.com/ ([https](https://jquery.com/) result 200).
* [ ] http://meyerweb.com/eric/tools/dencoder/ with 1 occurrences migrated to:
  https://meyerweb.com/eric/tools/dencoder/ ([https](https://meyerweb.com/eric/tools/dencoder/) result 200).
* [ ] http://projects.spring.io/spring-integration/ with 2 occurrences migrated to:
  https://projects.spring.io/spring-integration/ ([https](https://projects.spring.io/spring-integration/) result 200).
* [ ] http://sizzlejs.com/ with 1 occurrences migrated to:
  https://sizzlejs.com/ ([https](https://sizzlejs.com/) result 200).
* [ ] http://tomcat.apache.org/ with 1 occurrences migrated to:
  https://tomcat.apache.org/ ([https](https://tomcat.apache.org/) result 200).
* [ ] http://twitter.com/huntchr with 1 occurrences migrated to:
  https://twitter.com/huntchr ([https](https://twitter.com/huntchr) result 200).
* [ ] http://www.360innovate.co.uk with 1 occurrences migrated to:
  https://www.360innovate.co.uk ([https](https://www.360innovate.co.uk) result 200).
* [ ] http://www.amqp.org/ with 1 occurrences migrated to:
  https://www.amqp.org/ ([https](https://www.amqp.org/) result 200).
* [ ] http://tempuri.org/ (302) with 1 occurrences migrated to:
  https://www.bing.com/ ([https](https://tempuri.org/) result 200).
* [ ] http://www.eclipse.org/jetty/ with 1 occurrences migrated to:
  https://www.eclipse.org/jetty/ ([https](https://www.eclipse.org/jetty/) result 200).
* [ ] http://www.eaipatterns.com/ (302) with 2 occurrences migrated to:
  https://www.enterpriseintegrationpatterns.com/ ([https](https://www.eaipatterns.com/) result 200).
* [ ] http://www.eaipatterns.com/gregor.html (302) with 1 occurrences migrated to:
  https://www.enterpriseintegrationpatterns.com/gregor.html ([https](https://www.eaipatterns.com/gregor.html) result 200).
* [ ] http://www.eaipatterns.com/ramblings/18_starbucks.html (302) with 1 occurrences migrated to:
  https://www.enterpriseintegrationpatterns.com/ramblings/18_starbucks.html ([https](https://www.eaipatterns.com/ramblings/18_starbucks.html) result 200).
* [ ] http://www.gnu.org/licenses/gpl.html with 1 occurrences migrated to:
  https://www.gnu.org/licenses/gpl.html ([https](https://www.gnu.org/licenses/gpl.html) result 200).
* [ ] http://fusesource.com (302) with 1 occurrences migrated to:
  https://www.jboss.org/ ([https](https://fusesource.com) result 200).
* [ ] http://www.microsoft.com/en-us/download/details.aspx?id=23650 with 2 occurrences migrated to:
  https://www.microsoft.com/en-us/download/details.aspx?id=23650 ([https](https://www.microsoft.com/en-us/download/details.aspx?id=23650) result 200).
* [ ] http://www.postgresql.org/ with 1 occurrences migrated to:
  https://www.postgresql.org/ ([https](https://www.postgresql.org/) result 200).
* [ ] http://www.rabbitmq.com/ with 6 occurrences migrated to:
  https://www.rabbitmq.com/ ([https](https://www.rabbitmq.com/) result 200).
* [ ] http://www.w3schools.com/xml/ with 1 occurrences migrated to:
  https://www.w3schools.com/xml/ ([https](https://www.w3schools.com/xml/) result 200).
* [ ] http://forum.springsource.org/archive/index.php/t-84006.html (301) with 1 occurrences migrated to:
  https://forum.spring.io/archive/index.php/t-84006.html ([https](https://forum.springsource.org/archive/index.php/t-84006.html) result 301).
* [ ] http://forum.spring.io/forum/spring-projects/integration/117523-starting-multiple-consumers?p=589517 with 1 occurrences migrated to:
  https://forum.spring.io/forum/spring-projects/integration/117523-starting-multiple-consumers?p=589517 ([https](https://forum.spring.io/forum/spring-projects/integration/117523-starting-multiple-consumers?p=589517) result 301).
* [ ] http://forum.spring.io/forum/spring-projects/integration/119081-dynamic-inbound-channel-adapter-creation with 1 occurrences migrated to:
  https://forum.spring.io/forum/spring-projects/integration/119081-dynamic-inbound-channel-adapter-creation ([https](https://forum.spring.io/forum/spring-projects/integration/119081-dynamic-inbound-channel-adapter-creation) result 301).
* [ ] http://jira.springframework.org/browse/ROO-909 with 1 occurrences migrated to:
  https://jira.springframework.org/browse/ROO-909 ([https](https://jira.springframework.org/browse/ROO-909) result 301).
* [ ] http://jquery.org/license with 1 occurrences migrated to:
  https://jquery.org/license ([https](https://jquery.org/license) result 301).
* [ ] http://junit.org/ with 1 occurrences migrated to:
  https://junit.org/ ([https](https://junit.org/) result 301).
* [ ] http://mina.apache.org/sshd-project with 1 occurrences migrated to:
  https://mina.apache.org/sshd-project ([https](https://mina.apache.org/sshd-project) result 301).
* [ ] http://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx with 1 occurrences migrated to:
  https://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx ([https](https://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx) result 301).
* [ ] http://projects.spring.io/spring-boot with 1 occurrences migrated to:
  https://projects.spring.io/spring-boot ([https](https://projects.spring.io/spring-boot) result 301).
* [ ] http://springsource.com with 1 occurrences migrated to:
  https://springsource.com ([https](https://springsource.com) result 301).
* [ ] http://support.microsoft.com/default.aspx?scid=kb;EN-US;914277 with 2 occurrences migrated to:
  https://support.microsoft.com/default.aspx?scid=kb;EN-US;914277 ([https](https://support.microsoft.com/default.aspx?scid=kb;EN-US;914277) result 301).
* [ ] http://www.360innovate.co.uk/blog/2009/03/periodicalupdater-for-jquery/ with 1 occurrences migrated to:
  https://www.360innovate.co.uk/blog/2009/03/periodicalupdater-for-jquery/ ([https](https://www.360innovate.co.uk/blog/2009/03/periodicalupdater-for-jquery/) result 301).
* [ ] http://www.eaipatterns.com/eaipatterns.html (302) with 1 occurrences migrated to:
  https://www.enterpriseintegrationpatterns.com/eaipatterns.html ([https](https://www.eaipatterns.com/eaipatterns.html) result 301).
* [ ] http://www.google.com/talk/ with 1 occurrences migrated to:
  https://www.google.com/talk/ ([https](https://www.google.com/talk/) result 301).
* [ ] http://www.gradle.org with 4 occurrences migrated to:
  https://www.gradle.org ([https](https://www.gradle.org) result 301).
* [ ] http://www.gradle.org/docs/current/userguide/application_plugin.html with 10 occurrences migrated to:
  https://www.gradle.org/docs/current/userguide/application_plugin.html ([https](https://www.gradle.org/docs/current/userguide/application_plugin.html) result 301).
* [ ] http://www.gradle.org/docs/current/userguide/jetty_plugin.html with 1 occurrences migrated to:
  https://www.gradle.org/docs/current/userguide/jetty_plugin.html ([https](https://www.gradle.org/docs/current/userguide/jetty_plugin.html) result 301).
* [ ] http://www.mapquestapi.com/ with 1 occurrences migrated to:
  https://www.mapquestapi.com/ ([https](https://www.mapquestapi.com/) result 301).
* [ ] http://www.mongodb.org/display/DOCS/Querying with 1 occurrences migrated to:
  https://www.mongodb.org/display/DOCS/Querying ([https](https://www.mongodb.org/display/DOCS/Querying) result 301).
* [ ] http://www.opensource.org/licenses/mit-license.php with 1 occurrences migrated to:
  https://www.opensource.org/licenses/mit-license.php ([https](https://www.opensource.org/licenses/mit-license.php) result 301).
* [ ] http://www.oracle.com/technetwork/indexes/downloads/index.html with 2 occurrences migrated to:
  https://www.oracle.com/technetwork/indexes/downloads/index.html ([https](https://www.oracle.com/technetwork/indexes/downloads/index.html) result 301).
* [ ] http://www.rabbitmq.com/install.html with 4 occurrences migrated to:
  https://www.rabbitmq.com/install.html ([https](https://www.rabbitmq.com/install.html) result 301).
* [ ] http://www.springsource.org/node/3598 with 1 occurrences migrated to:
  https://www.springsource.org/node/3598 ([https](https://www.springsource.org/node/3598) result 301).
* [ ] http://www.springsource.org/spring-amqp with 4 occurrences migrated to:
  https://www.springsource.org/spring-amqp ([https](https://www.springsource.org/spring-amqp) result 301).
* [ ] http://www.springsource.org/spring-integration with 35 occurrences migrated to:
  https://www.springsource.org/spring-integration ([https](https://www.springsource.org/spring-integration) result 301).
* [ ] http://www.springintegration.org/ (301) with 7 occurrences migrated to:
  https://www.springsource.org/spring-integration/ ([https](https://www.springintegration.org/) result 301).
* [ ] http://www.springsource.org/spring-security with 1 occurrences migrated to:
  https://www.springsource.org/spring-security ([https](https://www.springsource.org/spring-security) result 301).
* [ ] http://www.springsource.org/spring-web-services with 1 occurrences migrated to:
  https://www.springsource.org/spring-web-services ([https](https://www.springsource.org/spring-web-services) result 301).
* [ ] http://www.springsource.org/sts with 1 occurrences migrated to:
  https://www.springsource.org/sts ([https](https://www.springsource.org/sts) result 301).
* [ ] http://www.youtube.com/SpringSourceDev with 2 occurrences migrated to:
  https://www.youtube.com/SpringSourceDev ([https](https://www.youtube.com/SpringSourceDev) result 301).
* [ ] http://dev.twitter.com with 1 occurrences migrated to:
  https://dev.twitter.com ([https](https://dev.twitter.com) result 302).
* [ ] http://dev.twitter.com/ with 4 occurrences migrated to:
  https://dev.twitter.com/ ([https](https://dev.twitter.com/) result 302).
* [ ] http://visualvm.java.net/ with 1 occurrences migrated to:
  https://visualvm.java.net/ ([https](https://visualvm.java.net/) result 302).
* [ ] http://www.springsource.com/developer/sts with 4 occurrences migrated to:
  https://www.springsource.com/developer/sts ([https](https://www.springsource.com/developer/sts) result 302).

# Ignored
These URLs were intentionally ignored.

* http://java.sun.com/JSP/Page with 40 occurrences
* http://java.sun.com/jsp/jstl/core with 34 occurrences
* http://java.sun.com/jsp/jstl/fmt with 2 occurrences
* http://java.sun.com/jsp/jstl/functions with 29 occurrences
* http://localhost:8080/broadcast/foo with 2 occurrences
* http://localhost:8080/chat with 1 occurrences
* http://localhost:8080/foo with 3 occurrences
* http://localhost:8080/monitoring with 1 occurrences
* http://localhost:8080/multipart-http/inboundAdapter.htm with 1 occurrences
* http://localhost:8080/rest-http/services/employee/ with 3 occurrences
* http://localhost:8080/rest-http/services/employee/0/search with 1 occurrences
* http://localhost:8080/rest-http/services/employee/1/search with 1 occurrences
* http://localhost:8080/shutdown with 1 occurrences
* http://localhost:8080/sockjs.js with 2 occurrences
* http://localhost:8080/stomp.js with 1 occurrences
* http://localhost:8080/time with 1 occurrences
* http://localhost:8080/ws-inbound-gateway/echoservice with 2 occurrences
* http://localhost:8082 with 1 occurrences
* http://schemas.xmlsoap.org/soap/envelope/ with 1 occurrences
* http://tiles.apache.org/tags-tiles with 1 occurrences
* http://www.example.org/orders with 3 occurrences
* http://www.example.org/orders-bigbooks with 2 occurrences
* http://www.springframework.org/spring-ws/samples/echo with 5 occurrences
* http://www.springframework.org/tags with 34 occurrences
* http://www.springframework.org/tags/form with 18 occurrences
* http://www.w3.org/1999/XSL/Transform with 1 occurrences
2019-03-22 15:59:21 -04:00

7.9 KiB

TCP Sample

This is the place to get started with the Samples for Spring Integration's support for the the Transmission Control Protocol (TCP). The sample demonstrates a simple message flow represented by the diagram below:

Gateway (SimpleGateway) -> Channel -> TcpOutboundGateway -> <==Socket==> -> TcpInboundGateway -> Channel -> ServiceActivator (EchoService)

The EchoService class returns a response which the Inbound Gateway sends back over the socket to the Outbound Gateway and the result is returned to the client that invoked the original SimpleGateway method.

Several variations of the sample are provided:

  • Client-Server Demo with explicit Transformers (Sample also provides Telnet connectivity)
  • Client-Server Demo with ConversionService
  • Serializer Demo
  • Annotation based client-server Demo (JUnit test only)

Client-Server Demo

The Client-Server Demo illustrates the use of a Gateway as an entry point into the integration flow. The message generated by the Gateway is sent over TCP by the Outbound Gateway to the Inbound Gateway. In turn the Inbound Gateway sends the message to an echo service (Class EchoService) and the echoed response comes back over TCP. The demo uses explicit Transformers to convert the byte array payloads to Strings.

You can execute this sample simply via Gradle:

$ gradlew :tcp-client-server:run

Alternatively, you can also execute the Main method in class org.springframework.integration.samples.tcpclientserver.Main. In both cases you should see the following console output:

=========================================================

    Welcome to the Spring Integration
          TCP-Client-Server Sample!

    For more information please visit:
    https://www.springsource.org/spring-integration/

=========================================================
Detect open server socket...using port 5680
Waiting for server to accept connections...running.


Please enter some text and press <enter>:
	Note:
	- Entering FAIL will create an exception
	- Entering q will quit the application

	--> Please also check out the other samples, that are provided as JUnit tests.
	--> You can also connect to the server on port '5680' using Telnet.


hello
echo:hello
q
Exiting application...bye.

The respective open server socket it dynamically selected. Alternatively, you can also customize the port by providing an additional system property at startup e.g.

$ gradlew :tcp-client-server:run -DavailableServerSocket=7777

Connect via Telnet

The configured Inbound Gateway processes CRLF (Carriage Return + Line Feed) delimited messages using the default ByteArrayCrLfSerializer. This means that the Inbound Gateway works works fine as a very simple Telnet server! Just start up the sample and connect to the used port:

$ telnet localhost <your_port>

Each time you hit enter you should see your input echoed back, preceded by 'echo:'

$ telnet localhost 11111
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello world!
echo:Hello world!
Test
echo:Test
^]
telnet> quit
Connection closed.

In order to quit the Telnet session, press Ctrl+] (Windows) or Control+] (Mac) followed by q or quit.

The test case also demonstrates error handling on an Inbound Gateway using direct channels. If the payload is 'FAIL', the EchoService throws an exception. The Gateway is configured with an error-channel attribute. Messages sent to that channel are consumed by a Transformer that concatenates the inbound message payload with the message text from the thrown exception, returning FAIL:Failure Demonstration over the TCP socket.

This can also be demonstrated with the Telnet client:

telnet 127.0.0.1 5679
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
echo:hello
FAIL
FAIL:Failure Demonstration
Hello World
echo:Hello World
^]
telnet> quit
Connection closed.

Client-Server Demo with ConversionService

This demo is similar to the previous demo. However, instead of using explicit Transformers, this version shows how Spring's Conversion Service can be used to convert the byte array payloads to Strings. This demo also uses a Gateway as an entry point into the integration flow. The message generated by the Gateway is sent over TCP by the Outbound Gateway to the Inbound Gateway. In return, the Inbound Gateway sends the message to the echo service and the echoed response comes back over TCP and is returned to the test case for verification.

Please note the channel's dataType attribute. This attribute which will trigger the conversion service.

<int:channel id="toSA" datatype="java.lang.String" />

You can run the example by executing JUnit test TcpClientServerDemoWithConversionServiceTest.

Serializer Demo

A third option exists for converting a stream of bytes to a domain object or message payload. You can hook up a different Serializer/Deserializer at the connection factory:

<int-ip:tcp-connection-factory id="…"
	…
	serializer=""
	deserializer=""/>

This will apply the conversions right when the stream comes in to the Gateway and right when it goes out. Two examples (JUnit Tests) are provided:

  • TcpServerConnectionDeserializeTest for using a simple (comes with Spring) Stx/Etx Serializer/Deserializer.
  • TcpServerCustomSerializerTest for creating and using your own serializers

Stx-Etx Serializer Demo

The Stx-Etx Serializer Demo shows an example of using the Stx/Etx stream framing serializer (ByteArrayStxEtxSerializer) that is included with Spring Integration. This serializer reads data in an InputStream to a byte array. The data must be prefixed with the <stx> control character and terminated by the <etx> control character.

We can be confident that the streams are properly handled because we explicitly send a stream with the Stx/Etx frame and the beginning and end of the actual content and the Server is configured to be able to handle the frame. In the asserts, we assert that the payload, once it reaches a component (in this case, the message listener we create and attach to the incomingServerChannel), does not have any of the Stx/Etx bytes.

You can run the example by executing JUnit test TcpServerConnectionDeserializeTest.

Using Custom Serializers

Some use cases may dictate you needing to create your own stream handling serializers and deserializers. This sample shows a custom Serializer/Deserializer being used with the Java socket API on the front end (client) and the Spring Integration TCP inbound gateway with the custom serializer/deserializers.

You can run the example by executing JUnit test TcpServerCustomSerializerTest.

Annotation-based Configuration

A simple client server test using entirely annotation-based configuration is shown in TcpClientServerAnnotationDemoTest.