Skip to content

Commit 9d40430

Browse files
committed
Se agregan archivos README a cada carpeta de codigo fuente
1 parent 328e671 commit 9d40430

File tree

8 files changed

+1615
-0
lines changed

8 files changed

+1615
-0
lines changed

java-streams/README.md

Lines changed: 481 additions & 0 deletions
Large diffs are not rendered by default.

spring-async/README.MD

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
## Introducción
2+
En ocasiones necesitamos devolver una respuesta al usuario independientemente si la ejecución de un método finalizó o no, por ejemplo en una página de registro, una vez que la información se guardó en la base de datos podemos devolver inmediatamente la respuesta al usuario indicando que su registro se completó con éxito y en segundo plano envíar el correo electrónico.
3+
4+
___
5+
6+
## MailSender y SimpleMailMessage
7+
Spring proporciona estas dos clases para el envío de correos electrónicos en formato plano.
8+
9+
[``MailSender``](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/mail/MailSender.html). Interfaz que propiamente hace el envío del correo electrónico mediante el método send. Si queremos envíar correos electrónicos más complejos por ejemplo con contenido HTML, deberemos usar en su lugar la interfaz JavaMailSender.
10+
11+
[``SimpleMailMessage``](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/mail/SimpleMailMessage.html). Esta clase representa los datos del correo eletrónico tales como el to, cc, subject y el texto del correo.
12+
13+
Spring Boot a su vez nos proporciona una autoconfiguración de las interfaces y clases arriba mencionadas y varias otras más que nos permite trabajar con el envío de correos de forma muy rápida y sencilla.
14+
15+
A nuestro proyecto Spring Boot debemos agregar la siguiente dependencia,
16+
17+
compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.5.2.RELEASE'
18+
19+
---
20+
21+
## Habilitando el soporte para tareas asíncronas
22+
Un método anotado con [``@Async``](http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/Async.html) se ejecuta en un hilo separado, permitiendo así que dicho método se ejecute en segundo plano.
23+
24+
Para habilitar el soporte de tareas asíncronas necesitamos agregar la anotación [``@EnableAsync``](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html) a la clase principal de Spring Boot.
25+
26+
```java
27+
@SpringBootApplication
28+
@EnableAsync
29+
public class SpringAsyncApplication
30+
```
31+
32+
Ahora vamos a crear el servicio que nos va a permitir simular el registro de un usuario en una base de datos y posteriormente enviaremos un correo real mediante el SMTP de Gmail.
33+
34+
El servicio quedaría de la siguiente forma,
35+
36+
```java
37+
@Service
38+
public class RegistroAsync {
39+
40+
private MailSender mailSender;
41+
42+
@Autowired
43+
public RegistroAsync(MailSender mailSender) {
44+
this.mailSender = mailSender;
45+
}
46+
47+
// Metodo que simula el registro de un usuario en alguna base de datos
48+
public Usuario registrar(Usuario usuario){
49+
50+
System.out.printf("Registrando a nuevo usuario: %s", usuario);
51+
52+
/**
53+
* Aqui el código requerido para guardar los datos en la base de datos
54+
*/
55+
56+
usuario.setUser("windoctor");
57+
58+
System.out.println("Finaliza el registro del usuario.");
59+
60+
return usuario;
61+
}
62+
63+
@Async
64+
public void enviarCorreo(Usuario usuario){
65+
for(int i = 1; i < 21; i++) {
66+
System.out.println("enviando correo "+i);
67+
SimpleMailMessage mailMessage = new SimpleMailMessage();
68+
mailMessage.setFrom("aqui el correo electronico del emisor");
69+
mailMessage.setTo(usuario.getEmail());
70+
mailMessage.setSubject("Registro completado");
71+
mailMessage.setText("Su registro fue completado con exito");
72+
73+
mailSender.send(mailMessage);
74+
}
75+
}
76+
}
77+
```
78+
79+
Podemos ver que el método _enviarCorreo_ está marcado con la anotación [``@Async``](http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/Async.html), esto le permitirá ejecutarse de manera asíncrona. Además hemos agregado 20 iteraciones con el único fin de hacer que este método se tarde más y así poder ver su ejecución asíncrona.
80+
81+
Ahora debemos configurar los datos del servidor de correos. Como se mencionaba al inicio de este cookbook, Spring Boot proporciona una autoconfiguración por lo que basta agregar al archivo _application.properties_ los parámetros del servidor SMTP.
82+
83+
```properties
84+
# El servidor SMTP de gmail. El puerto 465 es el puerto seguro de gmail.
85+
spring.mail.host=smtp.gmail.com
86+
spring.mail.port= 465
87+
88+
# Indicamos que se habilite el soporte SSL
89+
spring.mail.properties.mail.smtp.ssl.enable = true
90+
91+
# aqui pon tu direccion de correo electronico de gmail
92+
spring.mail.username= molder.itp@gmail.com
93+
94+
# aqui pon tu contraseña de tu cuenta de correo gmail
95+
spring.mail.password= F0h731183virg@
96+
```
97+
98+
___
99+
100+
## Creando el Controller
101+
Ahora crearemos un sencillo servicio REST que invocaremos desde nuestro navegador.
102+
103+
```java
104+
@RestController
105+
@RequestMapping("/registro")
106+
public class RegistroController {
107+
108+
@Autowired
109+
RegistroAsync registroAsync;
110+
111+
@RequestMapping(method = RequestMethod.GET, value = "/usuario")
112+
public String registrar(){
113+
114+
Usuario usuario = new Usuario("ascari", "aqui la cuenta de correo electronico a donde deseamos enviar la notificacion");
115+
Usuario registro = registroAsync.registrar(usuario);
116+
System.out.println("ahora enviamos el correo");
117+
registroAsync.enviarCorreo(registro);
118+
return "registro exitoso, su usuario es: "+registro.getUser();
119+
}
120+
}
121+
122+
```
123+
124+
Debemos agregar también una dependencia al _build.gradle_
125+
126+
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.2.RELEASE'
127+
128+
129+
Podemos observar que el método http usado es GET. Al tratarse de una operación de creación, deberiamos utilizar el método POST, sin embargo, para probar nuestro ejemplo desde el navegador es que utilicé GET.
130+
131+
___
132+
133+
## Una consideración final
134+
Para poder utilizar el servicio de correo de google desde nuestra aplicación, debemos asegurarnos de cumplir con 2 cosas:
135+
136+
1. Debes tener deshabilitada la autenticación en 2 pasos. Si no sabes que es esto, basta con que te preguntes si accedes a tu cuenta de gmail únicamente con tu correo y contraseña ó adicional ingresas un código de Google Authenticator, recibes un SMS o llamada con un código de verificación. Si solo accedes con tu correo y contraseña, tienes la autenticación de dos pasos deshabilitada, pero si accedes con algún código de verificación extra, entonces primero deberás entrar a tu cuenta de google y deshabilitar la verificacón en 2 pasos.
137+
138+
1. Debes permitir el acceso a aplicaciones menos seguras. Esto lo haces ingresando [aquí](https://myaccount.google.com/lesssecureapps)
139+
140+
## Viendo el resultado
141+
Les dejo el video donde podrán ver el ejemplo funcionando de este cookbook.
142+
143+
<iframe width="560" height="315" src="https://www.youtube.com/embed/0pkARIDeIXE?ecver=1" frameborder="0" allowfullscreen></iframe>

0 commit comments

Comments
 (0)