style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Java Enterprise

J2EE, MVC, JSF, Struts, Hibernate, Spring, EJB's, Ant.

Cómo leer registros de base de datos como un Stream de Java

He estado usando Spring desde la versión 1.0 y una de las clases que siempre me han resultado extremadamente útiles es JdbcTemplate. Esperaba que para la versión 5 integrara funcionalidad del API de stream de Java, pero no fue así.

Sin embargo a veces necesito realizar búsquedas en base de datos que devuelven miles o incluso millones de registros, y no puedo usar los métodos de JdbcTemplate que devuelven listas porque me quedo sin memoria. Los métodos que usan RowCallbackHandler son más apropiados, pero sería mucho más conveniente poder usar Streams de Java, particularmente si se pueden leer los resultados como objetos usando algún RowMapper.

Así que decidí hacer mi propio generados de Stream para usar con un JdbcTemplate. Al final, terminé con uno que es realmente más genérico y se puede usar con cualquier código que genere elementos ya sea de manera finita o infinita (aunque para streams infinitos existe una API mucho más simple). No es suficiente material como para generar una biblioteca, así que decidí publicarlo como un post.

@Transactional spring framework

Hola soy nuevo en Spring y tengo una duda acerca de @Transactional, tengo un método que llama a dos métodos anotados con @Transactional cada uno de ellos hace un insert en una base de dados diferente pero cuando ocurre un error no hace rollback en ambas bases de datos.

Este es el método:

@Transactional(readOnly=false)
public ResponseEntity> modificaFechasVacaciones(@RequestBody RequestVacacionesVO request,HttpServletRequest http) throws ParseException{

// base de datos 1
this.vacacionesBO.modificaSolicitudes(request, usuarioFormat,diasSolicitados, diasExcedentes);

// base de datos 2
this.vacacionesBO.updateDiasSolicitados(request, diasSolicitados);

// base de datos 3
this.vacacionesBO.updateDiasDisponiblesRechazo(request, diasDisponibles);

}

Esta es la configuración de los txManager para las dos bases de datos:

<?xml version="1.0" encoding="UTF-8"?>

Payara creando imagen productiva

La última parte de este pequeño ejemplo, es poner todo en conjunto y pues dejar la version que todo el mundo usará, para eso tendremos como dependencia a Docker. Asumo que ya lo tienes instalado. El proyecto web que creamos la vez anterior ya tiene un comando que nos permite crear los bundles finales tanto de css como de js. Desde la terminal y en la carpeta del proyecto Payara-client ejecutamos:

npm run compile

En la carpeta dist se crearan los archivos, se debe copiar todo el contenido incluido el html en la carpeta src/main/webapp del proyecto Payara-kotlin (importante: el proyecto Payara-kotlin usa localhost en la base de datos deberas actualizar la ip y puerto de la base en produccion). Ya que copiamos los archivos en la carpeta del proyecto Payara-kotlin desde la terminal ejecutamos:

gradle war

Ahora bien necesitamos una carpeta nueva desde donde vamos a construir nuestra imagen docker. En la carpeta ponemos nuestro war que sale de ejecutar gradle war y agregamos dos archivos Dockerfile y .dockerignore el contenido de Dockerfile sera el siguiente:

FROM payara/micro

Payara, Web content

Del post anterior pueden observar que tenemos 2 servicios que la idea es usarlos en al menos una pequeña aplicación web, esta estará creada con las siguientes dependencias:

  • Preact
  • Redux
  • Ramda
  • Less

Para ello tomaremos como base la plantilla que he creado para una aplicación React. https://github.com/betotto/react-template. Las instrucciones de como usarla están en el README de ese repo.

Configurando el ambiente de desarrollo

La plantilla usa webpack como herramienta de construcción del sitio, pero solo nos enfocaremos a la parte puramente web, los servicios no estarán en Nodejs sino en nuestra aplicación que desarrollamos en Payara, pero no vamos a estar haciendo dos cambios en el código compilando y desplegando para ver que el cambio funciona, ya tenemos los servicios, entonces los dejamos corriendo en el server como si fuera un servidor de servicios cualquiera y crearemos la aplicación con webpack-dev-server.

Pero oh sorpresa, dos cosas importantes:

- La primera es que el servidor Payara hace un binding a la ip del servidor en el que inicias la aplicación

Payara, Kotlin y Mysql

Bueno comenzando la parte de los servicios vamos a tener básicamente dos endpoints uno para consultar preguntas y otro para insertar preguntas.

GET /services/questions/getAll
POST /services/questions/add

Por tanto creamos el archivo kotlin QuestionService en la carpeta question (primero crear la carpeta question), si no encontramos preguntas regresaremos 404, esto es a modo de ejemplo si quieres puedes regresar 200 y un array vacio es tu gusto y/o disenio, usaremos Gson como librería para parsear JSON a Kotlin y viceversa:

package question

import com.google.gson.Gson
import javax.ws.rs.*
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.Response

@Path("/question")
class QuestionService {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/getAll")
    fun getAllQuestionsApi(): Response {
        val questions = getAllQuestions()
        return if(questions.isEmpty()) {
            Response.status(404).build()
        } else {
            Response.status(200).entity(Gson().toJson(questions)).build()
        }
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)

Payara Hello-World

Ya sabia que no iban a dejar morir así como así a JEE, ahora que ya es mas independiente de Oracle seguramente evolucionara mas rápido de lo que lo había hecho, uno de los primeros servidores que me llamo mucho la atención fue Glassfish, cuando fue lanzado era el mas avanzado en JEE en su momento, creo que lo sigue siendo ya que todas las especificaciones de JEE se crean primero ahi, aunque ya no tiene soporte por parte de una empresa como lo era entonces SUN, desde luego Oracle no iba a hacerlo competir con Websphere, tan caro que les salió comprarselo a BEA.

Pero bueno pasado es pasado y los servidores JEE parecería que solo seguirían vivos en los ambientes viejos y que pocas veces cambian como bancos o empresas de seguros (donde todavía se puede encontrar AS400 y muchas cajeros corriendo Windows XP). A quien le suena el requerimiento: queremos que la aplicación funcione con las tecnologías mas modernas pero en IE6 o IE7 ?

JAVA DEV DAY 2018

Hola, uno de los eventos mas grande de programacion esta de regreso en Guadalajara, tendra speakers internacionales y nacionales, el evento es todo el dia da link en el link para tener mas informacion

http://bit.ly/javadevday18

Heredar transacción de Java EE a Spring

Hola después de mucho tiempo, hace tiempo me topé con un problema, espero puedan ayudarme con un panorama más amplio y ver de que otras formas podría resolver este problema.

Teniendo una clase Java EE y un método donde se realizan dichas acciones, tengo la anotación @Transactional, que se utiliza para poder abrir y manejar una transacción en la cual se realiza una afectación a BD, pero en este proceso se requiere una dependencia que se realizó con Spring y que de igual manera utiliza transacción si ocurriera algún fallo, mi pregunta es, cómo puedo heredar las transacciones desde Java EE a Spring y viceversa para no perder el control en ninguna de las 2 partes?

Ya que si del lado de la dependencia Spring no falla, pero si falla del lado de Java EE, no podría avisarle a Spring que hubo un fallo y debe también aplicar RollBack, bueno espero puedan aportar con alguna idea.

Saludos!

Bloqueo de tabla ocasionada por Trigger

Que tal amigos una pregunta..

Un trigger puede hacer que la tabla se bloquee??? digo esto debido a que tengo una tabla donde hay 2 trigger un AFTER INSERT y otro AFTER UPDATE por ahora el que al parecer esta causando problema es el primero (AFTER INSERT) ya que al hacer varios INSERTS simultáneos llega un punto donde me sale el error Try Restarting Trasaction etc... y al quitar esos triggers de la DB los procesos a pesar de ser simultáneos los hace de manera correcta.

Estoy usando Mybatis,Spring y Mysql.

Gracias.

Guia Basica de Maven

Estimados,

Les dejo una guía Básica de Maven, para los recien llegados, la idea es que con esta guía se pongan manos a la obra cuando antes.

http://marcosrobertos.blogspot.cl/2017/12/guia-rapida-de-maven.html

Saludos.

Distribuir contenido

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">