Laboratorio de Inversión y Especulación 9 - Progreso hasta Junio (Segunda parte)
Aqui tenemos una explicacion de Juanmi de como esta todo por su lado, básicamente la mayoría de los cambios del core han sido suyos partiendo de mi pequeño esqueleto inicial:
La versión de desarrollo actual es la "alpha". Se encuentra en el repository svn: http://laboratoriodein.svn
¿que cambia?
Usa Spring, log4j, quartz, Gridgain, aspectj y beanshell.
Los paquetes se han reestructurado, ahora todos cuelgan de org.laboratory.investment - Dentro de locations y locations.site siguen estando las abstracciones e implementaciones de descarga de quotas (Casi sin cambios, lo único que ahora bajan los históricos csv que sirven google y yahoo porque es mas flexible, rápido y cómodo).
¿Como funcionan ahora las cosas?
En org.aboratory.investment.start esta la Clase Boot que se encarga del arranque.
Lo que hace es descomprimir todos los archivos .pack (compresión pack200) que encuentra. La aplicación de distribuye con las librerias comprimidas. Después crea un classloader con todos los .jar que están el lib y sus subdirectorios. Posteriormente en funcion del argumento recibido por Boot se lanza la aplicación(Main) o un nodo de computación(GridNode).
Desde el punto de vista del desarrollador:
1-Bajamos el proyecto, src es la carpeta de fuentes. En el classpath del proyecto le metemos todos los paquetes que hay en lib y sus subdirectorios. Además añadimos al classpath del proyecto la carpeta /conf/aop/aspectj.
Si funcionamos en modo Grid:
En /conf/application.properties activamos el grid: org.lab.startup.embedded.Grid
A la hora de lanzar Boot tenemos que configurar las siguientes propiedades de
JVM: -ea "-javaagent:lib/aspectj
Si no pasamos ningún argumento mas al ejecutar Boot lanzaremos la aplicación, si le pasamos el argumento GridNode lanzaremos un nodo grid de apoyo.
Si no funcionamos en modo grid:
En /conf/application.properties desactivamos el grid: org.lab.startup.embedded.Grid
No hace falta pasar propiedades a la JVM.
Una vez invocado a Main desde Boot ocurre lo siguiente:
Se cargan las Beans (singletons) de Spring (conf/lab.xml) y el contexto se deja en org.laboratory.investment
Se usa la Bean STARTUPENGINES que es una instancia generada usando spring de la clase org.laboratory.investment
Esta instancia se encarga de levantar los servicios en función de la configuración que se le ha puesto a través de lab.xml y application.properties (Por ahora asi es mas facil de seguir y controlar, si aumentan los servicios tendremos que ir a una arquitectura de microkernel). El main lo único que hace es recuperar esta instancia vía Spring y llamar a Start, cuando se termina llama a Stop.
Servicios en orden de arranque (todos se pueden activar o desactivar en la configuración):
Hsqldb embebido: Arranca una base de datos Hsqldb como persistencia.
HsqldbViewer: Arranca el visor de base de datos de Hsqldb
BeanShellConsole: Arranca una ventana visual donde programar usando BeanShell, desde ahí se pueden tocar las tripas de la aplicación en tiempo de ejecución.
Por ahora en cuanto a comodidad de script hay un comando en org.laboratory.investment
Iconified:No lo he puesto configurable por ahora, simplemente minimiza todas las ventanas visuales de la aplicación.
StartImport: Lee el directorio PlainQuotesImport y carga todos los .data con quotes a la base de datos
StartTomcat: Arranca un tomcat embebido para poder hacer invocaciones desde Flex (jcampllonch esta desarrollando una capa visual).
StartBatch: Arranca el servicio de carga de scripts. Usa Quartz, cada minuto se comprueba el directorio batch buscando ficheros .batch nuevos, Si hay alguno
se abre, se cargan las sentencias de descarga y se lanzan.
StartScript: Lo mismo que en el caso anterior pero se buscan scripts .bsh de beanshell para ejecutar
StartWaitCommandLine: Para el hilo principal y se queda esperando por System.in comandos para realizar bajadas. Con Stop saldríamos del bucle infinito y del start por lo que se llamaría a close desde Main y terminaría la aplicación.
Close: Se realiza el servicio de startExport, si esta activado recopila todos los Quote de la base de datos y genera los respectivos ficheros .data en PlainQuotesExport.
Por ahora la aplicación solo sabe importar y exportar .data, bajar quotes (si esta en grid paraleliza y reparte las bajadas a los nodos) y servirlas vía tomcat.
La persistencia:
Esta basada en JDO y el motor de persistencia que se esta utilizando es JPOX.
**Cuidado!!! La persistencia esta "Trucada"**:
Se ha creado una clase llamado Universe. Un Universe seria un entorno de persistencia de objetos independiente dentro de JDO (tablas independientes, incluso puede que base de datos diferente).
Para recuperar o guardar cosas se necesita crear o recuperar un universe y dado ese universe registrado en el sistema pedir su PersistenceManager.
Los universe siguen un patrón de Node y pueden tener links a otros universe (para facilitar la navegación a la capa visual).
UniverseProvider se encarga de gestionar los universos y los PersitenceManager correspondientes!!
Por ahora esto esta un poco oculto en JDOQuotesPersistenceService. Esta clase se encarga dado un Ticker de recuperar o crear el universe correspondiente y darte las Quote y también de guardarlas cuando has terminado (Todo esto se aclarara y mejorara en el futuro).
¿Como se descargan las cosas?
Las líneas de comando se envían a ServiceFactory (hay una instancia accesible vía LaboratoryContext, aun así por ahora es stateless). ServiceFactory crea un Objeto Command, configurado con un feeder y el servicio de persistencia correspondiente, que cuando se ejecute (execute()) lanzara la bajada. Por ahora el servicio de persistencia es JDOQuotesPersistenceService y los feeder son BOLSAMADRID, YAHOO y GOOGLE.
Este servicio mejorara y cambiara en el futuro cuando tengamos mas cosas. Por ahora es solo lo básico para poner las cosas cómodas.
Los command se pueden agrupar dentro de un BatchService. Tanto el Command como el BatchService tienen etiquetas de grid para distribuir las bajadas en caso de tener varios nodos funcionando.
Los Feeder:
Simplemente se conectan a sus urls y bajan las quotes correspondientes apoyándose en el QuotesPersistenceService que se les pase para recuperar y guardar las Quote. La dependencia con QuotesPersistenceService desaparecera en el futuro.
Seguramente para probar y desarrollar necesiteis un entorno con los menos servicios posibles, muy ligero:
Quitar el tomcat:
org.lab.startup.embedded
Quitar importar quotes de un directorio:
org.lab.startup.Import.Quotes
Quitar lanzar Batch de un directorio:
org.lab.startup.batch=false
Quitar lanzar scripts:
org.lab.startup.script=false
Quitar exportar Quotes a un directorio:
org.lab.startup.Export.Quotes
Quitar el Grid y asi simplificar mucho la depuracion:
org.lab.startup.embedded.Grid
Quitar la ventana de BeanShell
org.lab.startup.beanshell
Quitar el visor de base de datos:
org.lab.startup.embedded
Dejar la linea de comandos interactiva para hacer pruebas y para que se espere el hilo principal hasta que digas stop:
org.lab.startup.waitStop=true
Ademas en log4j.properties puedes quitar la ventana visual de lf5:
Comentas las siguientes lineas con #
#log visual
#log4j.appender.Visual=org
#log4j.appender.Visual.MaxNumbe
En el modo de Grid para quitar la verborrea de carga de aspectos:
En conf/aop/aspectj/meta-inf/aop
se cambia la linea
Cosas que se van a ir abordando para mejorar:
- Aclara la gestión de Universe y determinar la estructura de su árbol base para el crecimiento.
- Aclarar la parte de descargas de futuros.
- Mejorar la estructura de descargas en general (Disminuir su dependencia, aislarla, mejorar su rendimiento y focalizarla). Seguira con un patron de algoritmo.
- Empezar a meter la parte matemática para los estudios.
- Terminar de aclarar el enlace con la parte visual para tener una versión funcional para el usuario.
- Plantear la descarga de cotizaciones de bonos
- Plantear un arquitectura de flujos de datos y coordinación de ejes para las graficas y los estudios.
Pues básicamente esto es todo lo que hay. No se si es lo que esperabais. Por favor comentarme todos vuestros deseos y dudas para poder ir planificando el entorno que todos necesitamos.
Etiquetas: laboratorio





Si tenemos instalado java 5, tenemos que descargar el archivo 








