2010-01-19 17 views
7

Estoy leyendo y escribiendo XML a través de una conexión TCP (no HTTP) como parte de un servicio web que estoy desarrollando, y me preguntaba si hay una manera más "springified" (o incluso otras ideas) de lograr lo que estoy tratando a continuación:¿Cuál sería la forma de Spring de usar conexiones TCP?

InputStream is = null; 
    OutputStream os = null; 
    Socket s = null; 
    try { 
     s = new Socket(address, portNo); 
     os = s.getOutputStream(); 
     os.write(msg.getBytes()); 
     os.flush(); 
     is = s.getInputStream(); 
     String xml = IOUtils.toString(is); 
     return xml; 
    } finally { 
     IOUtils.closeQuietly(os); 
     IOUtils.closeQuietly(is); 
     if (s != null) s.close(); 
    } 

Nota, no tengo control sobre el servidor, por lo que no creo que voy a ser capaz de utilizar la comunicación remota de primavera, pero se preguntaba si esto se puede mejorar similar a JdbcTemplates de primavera.

EDIT:

Nota, sólo para aclarar IOUtils es Apache commons-io ...

+0

Buena pregunta, pero no, Spring no proporciona ningún marco para esto. – skaffman

+0

Pensé mucho después de cavar a través de los javadocs ... gracias. – beny23

Respuesta

1

Eche un vistazo a WebServiceTemplate. Esa es la abstracción principal que Spring proporciona para el acceso al servicio web del lado del cliente. A pesar de que su servidor no es un servicio web típico, siempre y cuando utilice el mismo patrón de solicitud-respuesta, aún podrá utilizarlo como base para su solución. La clase proporciona ganchos para casi cada parte de la comunicación (clasificación, envío de la solicitud, recepción de la respuesta, desasignación, etc.). JavaDoc enumera todos los pasos necesarios para realizar llamadas al servicio web y puede anular casi cualquier cosa allí. Entonces, por ejemplo, puede usar el soporte integrado de clasificación, pero anular createConnection para construir su conexión TCP personalizada.

+0

Eso parece una manera interesante de avanzar. No estoy 100% seguro de que esto no termine siendo una solución más compleja que el código anterior, pero parece una opción. Gracias. – beny23

+0

¿Tuviste éxito con esta respuesta? –

+0

Terminé yendo por esa ruta, pero simplemente escribiendo mi propia solución abstracta. Esencialmente usando una plantilla de velocidad para crear XML de solicitud y usando JDOM para analizar la respuesta, con diferentes "conectores" para hablar con sockets TCP (simple o sobre SSL), balanceo de carga/fallar automáticamente, todo enganchado por resorte. Funcionó una delicia. – beny23

0

La mayoría de las Tecnologías de la primavera se basan en enfoques estándar para hacer las cosas. TCP/IP es un nivel inferior al que la mayoría de las aplicaciones necesitan tratar hoy en día. No recuerdo la última vez que escribí una línea de código que usaba la biblioteca Socket directamente. En cambio, lo que normalmente se hace es construir sobre un protocolo de nivel superior.

El uso de HTTP o RMI como punto de partida ahorraría muchas molestias en el nivel del zócalo. Hay toneladas de buenas bibliotecas de servicios web para abstraer los detalles del socket lejos del usuario. Yo recomendaría usar JAX-WS. Spring tiene una implementación de JAX-WS en su proyecto Spring-WS. Apache CXF también permite la configuración de servicios web a través de Spring.

RMI es también una opción. La comunicación remota de Spring abstrae el protocolo RMI de su código permitiéndole concentrarse en la funcionalidad. No le da acceso a los Sockets, pero probablemente eso no sea lo que quiere hacer de todos modos.

+0

Como dije, no tengo control sobre la parte del servidor, ya que me estoy conectando a un sistema heredado que no usa HTTP o servicios web o RMI simplemente XML sobre TCP (el legado es muy divertido ...) Habiendo dicho que estas son buenas sugerencias para el caso general, pero no del todo aplicables aquí. – beny23

2

El "enfoque de primavera" se aplica aquí no a cómo se hace la comunicación de socket TCP sino a cómo las clases que colloborate con esta clase interactúan con ella.

Creo que el "enfoque de primavera" sería ocultar cualquier tipo de comunicación de socket detrás de una interfaz MessageSender (nombre horrible, lo sé) para que las clases colaboradoras solo tengan que tratar con MessageSender y permanezcan ciegos al hecho que cualquier tipo de comunicación de socket de bajo nivel está pasando para lograr el envío de ese mensaje.

+0

El "enfoque" al que se refiere es el patrón utilizado por 'JdbcTemplate',' JndiTemplate', 'HibernateTemplate', y así sucesivamente. No tienen nada que ver con IoC ni con la gestión de recursos (por ejemplo, la gestión de la sesión/sesión/conexión). – skaffman

Cuestiones relacionadas