Contribuye

Grails y el SessionFactory

En esta ocasión escribiré de algunas cosas que he necesitado mientras estoy trabajando en construir una aplicación y usar el sessionFactory. Algunas de ellas las he rescatado de mi timeline de twitter y otras las he visto examinando un poco la documentación y el código fuente. A veces sólo deseamos habilitar el sql generado por Hibernate en ciertas partes de la aplicación y lo que hacemos es activar el atributo logSql desde DataSource.groovy o donde quiera que se tenga configurado.

Read More

Simple benchmark y memoize

Hace poco quise mostrar la utilidad de los closures como parámetros, y también charlaba con un compañero acerca del método memoize de los closures para probar la ejecución que almacena Groovy para entregarla de manera inmediata en la siguiente ejecución de igual manera parametrizada. Primero hablemos de la parte del benchmark. Aquí un closure que vi alguna vez en http://groovy-almanac.org/: [sourcecode language=”groovy”] def benchmark = { closure -> def start = System.currentTimeMillis() closure() def end = System.currentTimeMillis() end – start } [/sourcecode] Ahora hagamos definamos una función que nos de la secuencia de Fibonacci en la ene-sima iteración: [sourcecode language=”groovy”] def fibonacci = { n -> Thread.sleep(100) // Ojo con este delay def f0 = 0 def f1 = 1 def temp = 0 (n + 1).times { temp = f0 f0 = f0 + f1 f1 = temp } f1 } [/sourcecode] Hecha la función de benchmark y el closure de fibonacci, vamos a usarlas un par de veces y veamos que tiempo nos entrega: [sourcecode language=”groovy”] def time = benchmark { assert fibonacci(7) == 13 assert fibonacci(8) == 21 assert fibonacci(9) == 34 assert fibonacci(7) == 13 assert fibonacci(8) == 21 assert fibonacci(9) == 34 } println time // Deberá desplegar un poco más de 600 ms.

Read More

Agregando Constraints con Database Migration Plugin

Cuántas veces nos hemos encontrado con la necesidad de hacer un cambio en una base de datos en producción o en QA pero es requerido mantener los datos que ya estaban ahí y dependiendo el caso es posible hacerlo desde la misma BD pero esto involucraría a algún DBA si es que tienen a alguno. Otra opción, y es a la que se refiere el post, es utilizando el plugin que ya trae Grails por defecto Database Migration Plugin.

Read More

Warping Test to Spockframework

Hola! En esta ocasión les quiero mostrar un pequeño script de ejemplo para realizar pruebas con SpockFramework, una herramienta hecha en Groovy para hacer específicaciones, y que da pie a introducirse al [BDD(Behavior Driven Development)][2] de una manera sencilla. Este ejemplo lo tomé de la documentación de Spock y en verdad es muy ilustrativo: package com.synergyj.ejemplo3 import spock.lang.Specification class MiEspecificacion extends Specification { // Una especificación muy simple def "calcula el máximo de dos números"(){ expect: Math.max(a,b) == c where: a << [4,9,10] b << [7,3,50] c << [7,9,50] //c << [0,0,0] } } Ahora bien, he hecho una especificación que denota un poco más las fases de ejecución e interpretación de un método por Spock y que es para un buen entendimiento de donde puedes poner cada cosa dentro de tu Spec: package com.synergyj.ejemplo3 import spock.lang.Specification class MiEspecificacionExplicada extends Specification { // Especificando a Spock def "mostrar el ciclo de ejecución de Spock"(){ setup: "Aqui puedes inicializar recursos que necesites para la especificacion" println "Inicializando recursos para\t\t${a}\t\t${b}\t\t${tamanio}" and: "Y algo más si lo deseas" //given: "O bien contextualizarlo como un feature con given-when-then, es un alias de setup" when: "Ejecutas acciones concretas, incluso de objetos no definidos aún" a.toLowerCase() then: "Evaluas los resultados de las acciones, por lo generla ocurrió algún efecto colateral" a.size() == tamanio expect: "Similar a when-then juntos, pero se usa para métodos pruamente funcionales" a.toLowerCase() == b cleanup: "Aqui puedes inicializar recursos que necesites para la especificacion" println "Limpiando recursos para\t\t\t\t${a}\t\t${b}\t\t${tamanio}" where: "Condiciones varias que serán evaluadas tantas veces como valores tengamos" a | b | tamanio "HOLA" | "hola" | 4 "MUNDO" | "mundo" | 5 } } Muy útil para identificar que hace cada parte en Spock!

Read More

JMS configuración rápida en Grails

JMS es una API creada por Sun Microsystems para el uso de colas de mensajes. Es una librería estándar de mensajería que permite crear, enviar, recibir y leer mensajes de manera síncrona y asíncrona.1 Esta API se puede implementar en muchas aplicaciones Java pero ¿como la podemos integrar en una aplicación creada con Grails? Bueno este artículo está dedicado para implementarla ocupando el plugin de JMS 1.2 y activemq 5.3.0. Para empezar asumiremos que ya se tiene un proyecto creado en grails y agregaremos la siguiente dependencia dentro del archivo BuildConfig.groovy en el apartado correspondiente: [sourcecode language=”groovy”] compile ‘org.apache.activemq:activemq-core:5.3.0′ [/sourcecode] Después, dentro del mismo archivo agregaremos el plugin de JMS: [sourcecode language=”groovy”] compile “:jms:1.2” [/sourcecode] Una vez que grails descargue las dependencias necesarias y los plugins necesarios vamos a proceder a configurar el jmsConnectionFactory dentro del resources.groovy [sourcecode language=”groovy”] beans = { jmsConnectionFactory(org.apache.activemq.ActiveMQConnectionFactory) { brokerURL = ‘vm://localhost’ } } [/sourcecode] Una vez que tenemos esto solamente debemos hacer referencia en el lugar de nuestra elección de la siguiente manera: [sourcecode language=”groovy”] def jmsService [/sourcecode] Y para enviar el mensaje hacemos lo siguiente: [sourcecode language=”groovy”] jmsService.send(queue:’queueName’, params) [/sourcecode] Y el método que queremos que responda a la petición lo anotamos con @Queue [sourcecode language=”groovy”] @Queue(name=’queueName’) def doSomething(params){ // Procesar los datos } [/sourcecode] Si bien esta es una manera sencilla de hacerlo no es la mejor para ambientes de producción ya que falta algo de tunning sin embargo el propósito de este artículo es que el desarrollador vea que de una manera sencilla se pueden hacer grandes cosas.

Read More