domingo, 25 de mayo de 2008

Integrando .NET y Java

Como hacer que dos mundos diferentes se vean?

Esa es la pregunta que nos haciamos en mi nuevo trabajo.
Resulta que tenemos una aplicacion que tiene fuertemente encapsulada la logica de negocio y no puede desacoplarse.
El paso tipico seria poner un motor de reglas, un motor de BPM, de BPEL o algo para sacar la logica de ahi dentro y poder exponerla como servicio o en algun lugar normal de donde pueda consumir cualquier aplicacion (quizas con costo de performance, qos y tolerancia a fallos).
Resulta que no podemos hacer eso aun, por lo que requerimos copiar el codigo y hacerlo lo mas transportable y desacoplable a futuro posible. Estaria muy bueno poder hacer una biblioteca generica que represente una capa de negocio que se pueda utilizar en cualquier app, hecha en cualquier lenguaje. He aqui el problema... como integrar mundos diferentes? como integro Java y .NET si no puedo hacerlo con un servicio, un package de BD, un socket, una cola, ni un motor de reglas? Si tuviera que hacerlo con codigo como lo haria?

Al investigar descubrimos un par de cosas interesantes, aunque al final haremos una lib para Java y otra para .NET:

Integracion directa:
JNBridge
Las clases .NET se ven en Java, las clases Java se ven en .NET. Simple.
http://www.jnbridge.com/jnbphow.htm
Este es un producto pago.


Integracion por una 3ra tecnologia:
En estos casos, desde Java o .NET se pueden ver clases de un 3er lenguaje. En este caso lenguajes de scripting.
Desde el lenguaje de scripting (dependiendo del framework) se pueden ver las clases de Java o .NET.
Problema: debuggeo complicado, probables problemas en la integracion de las libs (en el manejo de memoria), codificacion antinatural :P

Python
Python for .NET
Jython

Ruby
Ruby para .NET . Hay varios interpretes. Esta es al direccion de un blog que habla al respecto Entry
JRuby

Groovy
Esta integrado en Java, pero no en .NET. Es que, esta pensado para Java
"An agile dynamic language for the Java Platform"
http://groovy.codehaus.org/

Javascript
Java soporta engines de interpretacion de javascript via rhino
Intuyo que .NET debe soportar VBScript, sino... bueno, capaz ni es util :P


Por framework que cargue los objetos:
Spring puede utilizar engines de interpretacion de lenguajes, al fin de que declarando que un bean esta hecho en ruby/python/groovy pueda crearse y utilizarse en codigo Java. Les dejo 2 formas:
Documentacion de spring:
http://static.springframework.org/spring/docs/2.0.x/reference/dynamic-language.html

Un ejemplo de un blog para hacerlo de otra forma, con una Ruby Bean Factory:
http://jroller.com/habuma/entry/spring_meet_ruby

Ademas de eso, Java 1.6 soporta engines para lenguajes de scripting:
http://java.sun.com/javase/6/docs/technotes/guides/scripting/index.html
La idea esta basada en el framework rhino

Pero Spring .NET y la VM de .NET todavia no soportan lenguajes dinamicos.


Espero que les sirva esta pequeña investigacion.
Saludos

No hay comentarios: