Skip to main content

Alpura Back Java Lib Queue V.1.1

Manual de implementación de librería de pub/sub de google.


📦 Requisitos

  • Java JDK: 21 (Temurin LTS)
  • Spring Boot: 3.4.4 o superior
  • Gestor de dependencias: Maven o Gradle

⚙️ Instalación

Maven

<dependency>
<groupId>com.alpura</groupId>
<artifactId>back-java-lib-queues</artifactId>
<version>1.0</version>
</dependency>

🛠️ Configuración

Esta configuración debe realizarse en el archivo application.yml de tu servicio. Aquí un ejemplo de cómo quedaría:

Este valor apunta al servicio al cual nos suscribiremos para escuchar los nuevos mensajes

app:
pubsub:
subscription-id: alpura-notifications-uat-sub

Este valor apunta al proyecto al cual vamos a enviar los mensajes, y a las credenciales necesarias para hacerlo

spring:
gcp:
projectId: alpura-hub-uat
cloud:
gcp:
credentials:
location: ${GOOGLE_APPLICATION_CREDENTIALS}

🧭 Configuración del Escaneo de Componentes

Para que la librería de seguridad funcione correctamente, es necesario escanear los paquetes donde se encuentran los componentes, anotaciones y aspectos.
Asegúrate de incluir los siguientes paquetes en la anotación @ComponentScan de tu clase principal (@SpringBootApplication):

@ComponentScan({
"com.alpura.java.arch",
"com.alpura.utilities.web",
"com.alpura.utilities.annotation.aspectj",
"com.alpura.telemetry",
"com.alpura.security",
"com.alpura.queue"
})

🔧 Compilación del Proyecto

  1. Clona el repositorio desde GitLab:
git clone "url"
cd "local"

mvn clean install

Salida esperada:
[INFO] BUILD SUCCESS


🔧 Implementación de push de mensajes

import com.alpura.java.arch.common.vo.UserVO;
import com.alpura.queue.common.MessageVO;
import com.alpura.queue.common.UserLoggedInfo;
import com.alpura.queue.service.IPushService;

@Service
public class MiNuevoServicio {

private final IPushService pushService;
// Inyección de dependencia de IPushService
@Autowired
public MiNuevoServicio(IPushService pushService) {
this.pushService = pushService;
}
public void inicializarEnvio() {
// Objeto de ejemplo para enviar
MessageVO miMensaje = new MessageVO(new UserLoggedInfo("1","alan.flores@alpura.com", null,""), new UserVO(12,"alan", "Flores"));
String topicoDePrueba = "alpura-notifications-uat"; // Asegúrate de que este tópico exista en GCP
pushService.publish(topicoDePrueba, miMensaje);
}
}

🔧 Implementación de sub de mensajes

import com.alpura.java.arch.service.INotificationService;
import com.alpura.queue.common.MessageVO;
import com.alpura.queue.service.impl.PubSubMessageEvent;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class MyPubSubConsumerService {

private final ObjectMapper objectMapper;
private final INotificationService notificationService; // El servicio que procesa la notificación

// Inyecta ObjectMapper y tu servicio de notificación aquí
public MyPubSubConsumerService(ObjectMapper objectMapper, INotificationService notificationService) {
this.objectMapper = objectMapper;
this.notificationService = notificationService;
}

@EventListener // Este método escuchará los eventos de tipo PubSubMessageEvent
public void handlePubSubMessageEvent(PubSubMessageEvent event) {
String rawMessage = event.getRawMessageData();
log.info("Proyecto Principal: Recibido evento de mensaje PubSub para procesamiento: {}", rawMessage);

try {
MessageVO vo = new MessageVO();
vo.setMessage(rawMessage);
notificationService.processNotification(vo); // Llama a tu lógica de negocio

// Importante: Confirma el mensaje de Pub/Sub SÓLO DESPUÉS de procesarlo exitosamente
event.getPubsubMessage().ack();
log.info("Proyecto Principal: Mensaje procesado y confirmado exitosamente.");

} catch (Exception ex) {
log.error("Proyecto Principal: Error al procesar mensaje PubSub a NotificationVO o al enviar notificación. El mensaje NO será confirmado.", ex);
// En caso de error, el mensaje NO se confirma para que Pub/Sub lo re-entregue.
// O podrías hacer un nack() si tu versión de Pub/SubTemplate lo soporta para re-intentos explícitos.
// Para este ejemplo, omitir ack() o nack() es suficiente para que Pub/Sub re-envíe después del ack deadline.
}
}
}