Groovy Script Procedure

Postado em Atualizado em

groovydukemedUma das grandes justificativas que mantém a escrita de regra de negócio na forma de procedures dentro de um SGDB é justamente pelo fato de poder dar manutenção nelas sem precisar reiniciar a solução, não ocasionado indisponibilidades de downtime geradas pelos redeploys. Muito bem, hoje eu vou te ensinar a usar um recurso que eu chamo de “Groovy Procedure” que pode ser utilizado para resolver esse cenário e assim extinguindo por completo essa pratica. A coisa funciona resumidamente assim:

Passo 1

Crie uma tabela no banco de dados que armazena um texto aonde será dinamicamente gravado um script Groovy que será usado para escrever alguma regra de negócio. Segue um exemplo usando MySQL:

CREATE TABLE regras (

   REGID int(10) unsigned NOT NULL auto_increment, 

   REGTEXTO mediumtext NOT NULL,                   

   PRIMARY KEY  (REGID),                           

   UNIQUE KEY REGID (REGID)                      

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Passo 2

Escreva um script groovy que que acesse qualquer outra tabela de negócio do sistema expressando alguma regra de negócio:

import groovy.sql.Sql 

con = Sql.newInstance(“jdbc:mysql://localhost:3306/urna1”, “root”, “root”,”com.mysql.jdbc.Driver”)

lista = con.rows(“select * from votante where nm_pessoa like ‘F%'”)

con.close()

lista

Passo 3

Insira o script dentro da tabela regras com o ID 1:

insert into regra ( REGID , REGTEXTO ) values ( ‘1’,’  con = Sql.newInstance( “jdbc:mysql://localhost:3306/urna1 “,  “root “,  “root “, “com.mysql.jdbc.Driver “)    lista = con.rows( “* from votante where nm_pessoa like ‘F% “);    con.close()    lista’)

Passo 4:

Crie um programa Java que acesse esse registro na tabelas de regras e execute o script groovy na solução, retornando da execução uma ArrayList<> com o resultado da execução dinâmica. No caso, eu fiz um programa desktop usando groovy (mas que poderia ser Java):

import groovy.sql.Sql

class JavaProcedure {

static main(args) {

def con = Sql.newInstance(“jdbc:mysql://localhost:3306/estudo”, “root”,

“root”,”com.mysql.jdbc.Driver”)

def lista = con.rows(“select * from regras”)

con.close()

GroovyShell engine = new GroovyShell();

lista = engine.evaluate(lista[0].regtexto)

lista.each {linha-> println linha.nm_pessoa }

}

}

O resultado disso é o mesmo que uma procedure tradicional SGDB. Veja:

FOR – J TREINAMENTOS LTDA – ME

FABIO MASSONI JUNIOR

FABIO ADALBERTO FAVARO

FABRICIO PARRA GARCIA

FABIO FERREIRA LEHMANN

FARID LIBOS JUNIOR

FERNANDA BENQUERER COSTA

FRANCISCO MOITA SOARES

FLAVIO MENDONCA DE MORAES

FERNANDO THOMAZINHO

FERNANDA AUGUSTA POLO TONSIG

FLAVIANE PEREIRA MARTINS

Conclusão

Nesse modelo você esta escrevendo uma procedure baseada em script usando do Groovy, que por sua vez usufrui de todos os poderes e recursos da GDK e JDK e ainda sim pode ser dinamicamente, compilada e executada sem gerar interrupções na disponibilidade da solução. Fácil não? Espero que você leitor tenha visualizado o poder arquitetural que essa simples brincadeira oferece. Até a próxima!

“Sonda-me, ó Deus, e conhece o meu coração, prova-me e conhece os meus pensamentos; vê se há em mim algum caminho mau e guia-me pelo caminho eterno.” Salmos 139:23-24

Anúncios