Translate

Mostrando las entradas con la etiqueta Gradle. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Gradle. Mostrar todas las entradas

martes, 20 de septiembre de 2022

Spring boot con jetty




Tomcat y Jetty son los servidores web más populares en el mundo Java, pero Spring boot nos brinda la funcionalidad de servidor embebido con tomcat. Por que? ni idea, pero podemos cambiar esto y utilizar jetty de la siguiente manera. 

Generamos nuestro proyecto en : https://start.spring.io/ o como quieran pero tienen que elegir spring web como dependencia. 

Si ya funciona el entorno, vamos a la dependencia de spring web y excluimos tomcat y luego agregamos jetty : 


implementation ('org.springframework.boot:spring-boot-starter-web') {

exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'

}


implementation 'org.springframework.boot:spring-boot-starter-jetty'


Y listo, cuando inicie spring lo va hacer con un jetty embebido. Van a poder ver la siguiente linea en el log : 


2022-09-20 08:06:28.788  INFO 1304813 --- [           main] o.s.b.web.embedded.jetty.JettyWebServer


miércoles, 1 de junio de 2022

Cache con Redis y Spring boot


Vamos ha hacer una pequeña cache para unos servicios en spring boot. 

Primero es necesario tener instalado Redis, y si ...

Luego agregamos esta dependencia a nuestro proyecto (uso gradle) : 

implementation("org.springframework.boot:spring-boot-starter-cache")

implementation("org.springframework.boot:spring-boot-starter-data-redis")


Luego configuramos en nuestro cache con esta clase : 

 package com.uap.demo.config

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.redis.cache.RedisCacheConfiguration
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
import org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair
import java.time.Duration

@Configuration
class CacheConfig {

    @Bean
    fun cacheConfiguration(): RedisCacheConfiguration? {
        return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(60))
            .disableCachingNullValues()
            .serializeValuesWith(SerializationPair.fromSerializer(GenericJackson2JsonRedisSerializer()))
    }
}

Yo le puse 60 minutos de vida a mis datos dado que no cambian tan frecuente. 

Ahora en el Application agregamos @EnableCaching, algo así : 

@SpringBootApplication
@EnableCaching
class DemoApplication

fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}

Por ultimo a nuestro servicio le decimos que vamos a cachear los datos, en este ejemplo tengo un servicio X : 

@Service
class XServiceImpl : XService {

    @Cacheable(value = ["xxxxx"])
    override fun x(parametro: String): List<String> {
          ...
    }
}

Lo que va a ocurrir es que cuando llamemos al servicio con un parametro, se va generar una entrada en Redis, y la próxima vez que llamemos este servicio usará la cache. 

Y listo!!! 

jueves, 26 de mayo de 2022

Libros gratuitos de Java code geeks

 

Get schooled by Java Code Geeks

Download IT Guides!

 

JavaFX Programming Cookbook

JavaFX 2.0 and later is implemented as a native Java library, and applications using JavaFX are written in native Java code. JavaFX Script has been scrapped by Oracle, but development is...

 
 

Java Servlet Tutorial

A servlet can almost be thought of as an applet that runs on the server side-without a face. Java servlets make many Web applications possible.

Java...

 
 

Groovy Programming Cookbook

Groovy 1.0 was released on January 2, 2007, and Groovy 2.0 in July, 2012. Since version 2, Groovy can also be compiled statically, offering type inference and performance very close to...

 
 

Gradle Build Automation Handbook

Gradle was designed for multi-project builds which can grow to be quite large, and supports incremental builds by intelligently determining which parts of the build tree are up-to-date,...

 

viernes, 29 de abril de 2022

Consumiendo API con Retrofit


Si has trabajado con microservicios o simplemente has necesitado consumir una API de terceros, notaste que este código no es muy bello y muchas veces se torna complejo.

Retrofit es un framework que viene para salvarnos. 

Veamos un ejemplo, queremos consultar info de los repositorios de github, la información que necesitamos es esta : (voy a trabajar en kotlin porque pinto, es similar en Java) 

import com.google.gson.annotations.SerializedName


data class Repo(

    @SerializedName("id")

    var id: Int? = null,

    @SerializedName("name")

    var name: String,

    @SerializedName("full_name")

    var fullName: String,

    @SerializedName("language")

    var language: String

) {}

Entonces lo que tengo que hacer es agregar estas dependencias a mi proyecto (uso gradle) :

// https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit

implementation("com.squareup.retrofit2:retrofit:2.9.0")

implementation("com.squareup.retrofit2:converter-gson:2.9.0")

y luego tengo que crear una interface que represente el servicio que voy a consumir : 


interface GitHubClient {

    @GET("users/{user}/repos")

    fun listRepos(@Path("user") user: String?): Call<List<Repo?>?>?

}

Y por último debo construir este cliente y usarlo : 


        val retrofit = Retrofit.Builder()

            .baseUrl("https://api.github.com/")

            .addConverterFactory(GsonConverterFactory.create())

            .build()


        val gitHubClient = retrofit.create(GitHubClient::class.java)

        val repos = gitHubClient.listRepos(userName)?.execute()?.body()


Y listo!!    

Dejo link : 

https://square.github.io/retrofit/

jueves, 2 de septiembre de 2021

Creando la primera aplicación con Quarkus



Empecemos por el principio, necesitamos graalvm 11 o superior (en realidad cualquier Jdk 11 o superior pero yo voy a utilizar graalvm para sacar todo el jugo) , maven o gradle (yo voy a usar intellij que viene con gradle y listo) y un ide. 

Pueden usar maven o gradle para crear el proyecto o intellij (tambien) pero yo utilice la pagina https://code.quarkus.io/ y luego lo abrí con intellij. Pero eso lo hice porque quise, pueden hacerlo como quieran. 

Más allá de si eligieron maven o gradle o como hiciero para crear el proyecto, deberían tener esta dependencia : 

implementation 'io.quarkus:quarkus-resteasy'

Ahora veamos el código que genero, es un hola mundo común en un servicio REST : 


import javax.ws.rs.GET;

import javax.ws.rs.Path;

import javax.ws.rs.Produces;

import javax.ws.rs.core.MediaType;


@Path("/hello")

public class GreetingResource {


    @GET

    @Produces(MediaType.TEXT_PLAIN)

    public String hello() {

        return "Hello RESTEasy";

    }

}

Si ejecutamos esto con : 

gradle :quarkusDev 

Va a demorar un rato pero luego si vamos a http://localhost:8080/hello vemos : 

Hello RESTEasy

Y como primer acercamiento, bien, en proximos post vamos a seguir desarrollando este ejemplo. 



viernes, 13 de agosto de 2021

Consumiendo mensajes desde Apache Kafka con Spring Boot


Vamos a hacer un ejemplo de spring boot que consuma un mensaje desde Kafka. Primero tenemos que bajar nuestro proyecto de spring initializr en esta pagina podemos agregar spring-kafka o agregarlo luego  : 

implementation 'org.springframework.kafka:spring-kafka'

Usando Gradle o Maven. 

Antes vamos a hacer un mensaje de ejemplo, que va ser el mensaje a escribir : 


public class Message {

    private long id;

    private String message;

    private LocalDateTime time;


    public Message() {}


    public Message(long id, String message, LocalDateTime time) {

        this.id = id;

        this.message = message;

        this.time = time;

    }


    public Message(String message, LocalDateTime time) {

        this(new Random().nextLong(), message, time);

    }


    public Message(String message) {

        this(message,LocalDateTime.now());

    }


    public long getId() {

        return id;

    }


    public void setId(long id) {

        this.id = id;

    }


    public String getMessage() {

        return message;

    }


    public void setMessage(String message) {

        this.message = message;

    }


    public LocalDateTime getTime() {

        return time;

    }


    public void setTime(LocalDateTime time) {

        this.time = time;

    }


    @Override

    public boolean equals(Object o) {

        if (this == o) return true;

        if (o == null || getClass() != o.getClass()) return false;

        Message message1 = (Message) o;

        return Objects.equals(message, message1.message) &&

                Objects.equals(time, message1.time);

    }


    @Override

    public int hashCode() {

        return Objects.hash(message, time);

    }


    @Override

    public String toString() {

        return "Message{" +

                "message='" + message + '\'' +

                ", time=" + time +

                '}';

    }

}

Tenemos que escribir 2 clases de configuración, una para indicar como nos conectar a Kafka y como esta serializado el objeto. 


@EnableKafka

@Configuration

public class KafkaConsumerConfig {


    @Value(value = "${kafka.bootstrapAddress}")

    private String bootstrapAddress;


    @Bean

    public ConsumerFactory<String, Message> consumerFactory() {

        var props = new HashMap<String, Object>();

        props.put(

                ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,

                bootstrapAddress);

        props.put(

                ConsumerConfig.GROUP_ID_CONFIG,

                "demo");

        props.put(

                ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,

                StringDeserializer.class);

        props.put(

                ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,

                JsonDeserializer.class);

        props.put(JsonDeserializer.TRUSTED_PACKAGES,

                "com.assembly.demo.model");

        return new DefaultKafkaConsumerFactory<>(props);

    }


    @Bean

    public ConcurrentKafkaListenerContainerFactory<String, Message>

    kafkaListenerContainerFactory() {

        var factory = new ConcurrentKafkaListenerContainerFactory<String, Message>();

        factory.setConsumerFactory(this.consumerFactory());

        return factory;

    }

}

Y Otra para confugurar el topic : 


@Configuration

public class KafkaTopicConfig {

    @Value(value = "${kafka.bootstrapAddress}")

    private String bootstrapAddress;

    @Bean

    public KafkaAdmin kafkaAdmin() {

        var configs = new HashMap<String, Object>();

        configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);

        return new KafkaAdmin(configs);

    }

    @Bean

    public NewTopic topicDemo() {

        return new NewTopic("demo", 1, (short) 1);

    }

}


Y ahora vamos a hacer un servicio que consuma el mensaje y lo escriba en pantalla : 


@Service

public class ConsumerService {

    @KafkaListener(topics = "${kafka.topicName}", groupId = "demo")

    public void listenGroupDemo(Message message) {

        System.out.println("Received Message in group demo : " + message);

    }

}

Y Listo!!

Dejo link del repo : https://github.com/emanuelpeg/springBoot-Kafka-example

Escribiendo mensajes en Apanche Kafka con Spring Boot


Vamos a hacer un ejemplo de spring boot que escriba un mensaje con Kafka. Primero tenemos que bajar nuestro proyecto de spring initializr en esta pagina podemos agregar spring-kafka o agregarlo luego  : 

implementation 'org.springframework.kafka:spring-kafka'

Usando Gradle o Maven. 

Antes vamos a hacer un mensaje de ejemplo, que va ser el mensaje a escribir : 


public class Message {

    private long id;

    private String message;

    private LocalDateTime time;


    public Message(long id, String message, LocalDateTime time) {

        this.id = id;

        this.message = message;

        this.time = time;

    }


    public Message(String message, LocalDateTime time) {

        this(new Random().nextLong(), message, time);

    }


    public Message(String message) {

        this(message,LocalDateTime.now());

    }


    public long getId() {

        return id;

    }


    public void setId(long id) {

        this.id = id;

    }


    public String getMessage() {

        return message;

    }


    public void setMessage(String message) {

        this.message = message;

    }


    public LocalDateTime getTime() {

        return time;

    }


    public void setTime(LocalDateTime time) {

        this.time = time;

    }

    @Override

    public boolean equals(Object o) {

        if (this == o) return true;

        if (o == null || getClass() != o.getClass()) return false;

        Message message1 = (Message) o;

        return Objects.equals(message, message1.message) &&

                Objects.equals(time, message1.time);

    }

    @Override

    public int hashCode() {

        return Objects.hash(message, time);

    }

    @Override

    public String toString() {

        return "Message{" +

                "message='" + message + '\'' +

                ", time=" + time +

                '}';

    }

}


Luego tenemos que hacer 2 objetos de configuración, uno para configurar el acceso a kafka y sus parámetros : 

@Configuration

public class KafkaProducerConfig {


    @Value(value = "${kafka.bootstrapAddress}")

    private String bootstrapAddress;


    @Bean

    public ProducerFactory<String, Message> producerFactory() {

        var configProps = new HashMap<String, Object>();

        configProps.put(

                ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,

                bootstrapAddress);

        configProps.put(

                ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,

                StringSerializer.class);

        configProps.put(

                ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,

                JsonSerializer.class);

        return new DefaultKafkaProducerFactory<>(configProps);

    }

//Y creamos un template que nos ayuda a escribir mensaje con la configuración realizada. 

    @Bean

    public KafkaTemplate<String, Message> kafkaTemplate() {

        return new KafkaTemplate<>(producerFactory());

    }

}


Y luego configuramos el acceso al topic : 


@Configuration

public class KafkaTopicConfig {

    @Value(value = "${kafka.bootstrapAddress}")

    private String bootstrapAddress;


    @Bean

    public KafkaAdmin kafkaAdmin() {

        var configs = new HashMap<String, Object>();

        configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);

        return new KafkaAdmin(configs);

    }

    @Bean

    public NewTopic topicDemo() {

        return new NewTopic("demo", 1, (short) 1);

    }

}

Ahora hacemos un servicio que escriba el mensaje: 


@Service

public class ProducerService {

    @Autowired

    private KafkaTemplate<String, Message> kafkaTemplate;


    @Value(value = "${kafka.topicName}")

    private String topicName;


    public void sendMessage(Message message) {


        ListenableFuture<SendResult<String, Message>> future =

                kafkaTemplate.send(topicName, message);


        future.addCallback(new ListenableFutureCallback<SendResult<String, Message>>() {


            @Override

            public void onSuccess(SendResult<String, Message> result) {

                System.out.println("Sent message=[" + message.getTime() + message.getMessage() +

                        "] with offset=[" + result.getRecordMetadata().offset() + "]");

            }

            @Override

            public void onFailure(Throwable ex) {

                System.out.println("Unable to send message=["

                        + message + "] due to : " + ex.getMessage());

            }

        });

    }

}


Y ya que estamos hacemos un controller que exponga un servicio Rest que escriba mensajes: 

@RestController

@RequestMapping("demo")

public class DemoController {

    @Autowired

    private ProducerService service;


    @GetMapping("/{msg}")

    public void sendMessage(@PathVariable String msg) {

        var message = new Message(msg);

        service.sendMessage(message);

    }

}

Y listo!! 

Dejo link del repo : https://github.com/emanuelpeg/springBoot-Kafka-example

miércoles, 14 de julio de 2021

Libros de Java code geeks

 

Download IT Guides!

 

Groovy Programming Cookbook

Groovy 1.0 was released on January 2, 2007, and Groovy 2.0 in July, 2012. Since version 2, Groovy can also be compiled statically, offering type inference and performance very close to...

 
 

Gradle Build Automation Handbook

Gradle was designed for multi-project builds which can grow to be quite large, and supports incremental builds by intelligently determining which parts of the build tree are up-to-date,...

 
 

Apache Solr Cookbook

Providing distributed search and index replication, Solr is designed for scalability and fault tolerance. Solr is the second-most popular enterprise search engine after Elasticsearch.
...

 
 

Apache Maven Cookbook

An XML file describes the software project being built, its dependencies on other external modules and components, the build order, directories, and required plug-ins. It comes with...

 

sábado, 16 de enero de 2021

Libros Gratuitos de Java Code Geeks

 

Download IT Guides!

 

Java Servlet Tutorial

A servlet can almost be thought of as an applet that runs on the server side-without a face. Java servlets make many Web applications possible.

Java...

 
 

Groovy Programming Cookbook

Groovy 1.0 was released on January 2, 2007, and Groovy 2.0 in July, 2012. Since version 2, Groovy can also be compiled statically, offering type inference and performance very close to...

 
 

Gradle Build Automation Handbook

Gradle was designed for multi-project builds which can grow to be quite large, and supports incremental builds by intelligently determining which parts of the build tree are up-to-date,...

 
 

Apache Solr Cookbook

Providing distributed search and index replication, Solr is designed for scalability and fault tolerance. Solr is the second-most popular enterprise search engine after Elasticsearch.
...

 

domingo, 20 de enero de 2019

Que es Gradle?

Todos debemos estar al tanto de las herramientas de construcción de proyecto. Si vienen del mundo java seguro concen Maven, si vienen de Scala sbt, si vienen javascript npm, etc...

Gradle es una herramienta de automatización de compilación de proyectos de tecnología java, es de código abierto centrado en la flexibilidad y el rendimiento. Los scripts de compilación de Gradle se escriben utilizando un DSL Groovy o Kotlin. Lea sobre las características de Gradle para aprender lo que es posible con Gradle.

Altamente personalizable: Gradle se modela de una manera que es personalizable y extensible de la manera más fundamental.

Rápido: Gradle completa las tareas rápidamente, reutilizando los resultados de ejecuciones anteriores, procesando solo las entradas que han cambiado y ejecutando tareas en paralelo.

Potente: Gradle es la herramienta de compilación oficial para Android y es compatible con muchos lenguajes y tecnologías populares.

Porque tendria que usar Gradle en vez de Maven algunas razones son: flexibilidad, rendimiento, experiencia de usuario y administración de dependencias. En cuanto a la performance


Aunque los IDE son importantes, un gran número de usuarios prefieren ejecutar operaciones de compilación a través de una interfaz de línea de comandos. Gradle proporciona un CLI moderno que tiene características de detección como "tareas de gradle", así como un mejor registro y finalización de la línea de comandos.

Finalmente, Gradle proporciona una interfaz de usuario basada en la web interactiva para depurar y optimizar construcciones: análisis de compilación. También se pueden alojar en las instalaciones para permitir a una organización recopilar el historial de compilación y hacer análisis de tendencias, comparar compilaciones para depurar o optimizar el tiempo de compilación.

Que esperas para aprender y usar Gladle?

Dejo link: https://gradle.org

sábado, 31 de enero de 2015

Gradle una herramienta para construir aplicaciones con la potencia y flexibilidad de Ant y con la gestión de dependencia de Maven

Ya escribí anteriormente a Gradle, es una herramienta que permite crear proyectos en Java o Groovy. Similar a Maven, es más utiliza los repositorio de Maven.

Si vemos la pagina web nos dice más o menos lo siguiente:

"Gradle es un sistema de automatización de compilación de código abierto. Gradle puede automatizar la creación, prueba, publicación, distribución y más de paquetes de software u otro tipo de proyectos, tales como sitios web generados estáticos, documentación generada o de hecho cualquier otra cosa.

Gradle combina la potencia y flexibilidad de Ant con la gestión de dependencias como Maven"

Pero, como utilizamos esta herramienta? Si utilizaron Maven anteriormente, instalar Gradle es muy similar. Se debe bajar esta herramienta y luego se debe agregar la carpeta a la variable PATH, en linux tenemos el archivo .profile y podemos hacer algo así:

export GRADLE_HOME=/java/gradle-2.2.1
export PATH=$GRADLE_HOME/bin:$PATH

Y luego hacemos que tome estos cambios con source

source .profile

Luego podemos probar esto de la siguiente manera:

$ gradle -v

------------------------------------------------------------
Gradle 2.2.1
------------------------------------------------------------

Build time:   2014-11-24 09:45:35 UTC
Build number: none
Revision:     6fcb59c06f43a4e6b1bcb401f7686a8601a1fb4a

Groovy:       2.3.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_11 (Oracle Corporation 25.11-b03)
OS:           Linux 3.11.0-12-generic amd64

Por hoy estamos, en siguientes post vamos a crear proyectos y ejecutar tareas. 

Dejo link: http://gradle.org/




lunes, 26 de enero de 2015

Spring Boot


Es raro que no haya escrito antes de Spring Boot dado que es un subproyecto de Spring muy útil. Este proyecto nos ayuda a comenzar un proyecto rápidamente.

Como saben crear un proyecto Spring con todo configurado no es fácil y conlleva tiempo. Con Spring Boot podemos crear diferentes proyectos rápidamente. Ojo luego debemos trabajar un poco para personalizar nuestro proyecto pero el trabajo más grueso ya esta hecho.

Algo que me falto decir es que Spring Boot utiliza maven o Gradle, se pueden crear proyectos como arquetipos.

Entre las características podemos nombrar:

  • Podemos utilizar jetty o tomcat embebido. 
  • No necesitamos tocar configuraciones de Maven
  • Tenemos un proyecto listo para ejecutar, con mínimas configuraciones. 
Dejo link:

domingo, 1 de julio de 2012

Una alternativa a Maven: Gradle 1.0 Released


Gradle es un proyecto para la construcción de aplicaciones java similar a maven. Pero este proyecto esta basado en groovy, por lo cual provee un dsl basado en groovy. Y proporciona una forma declarativa para describir todo tipo de construcciones a través de los parámetros por defecto. Gradle está convirtiendo rápidamente en el sistema de compilación de elección para muchos proyectos de código abierto.

Gradle provee una forma declarativa para describir todo tipo de construcciones.

Entre algunas características podemos nombrar:



  • Cualquier configuración están escritos en Groovy (en lugar de XML)
  • Soporte para Java, Groovy y Scala.
  • Soporte dependencias a repositorios Maven
  • Interfaz gráfica de usuario para la integración de todos los entornos de desarrollo populares
  • Experimental de C + + de apoyo




Y además es de código abierto.

Dejo liks:
http://www.gradle.org/
http://www.gradle.org/resources
http://gradle.org/downloads