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
- 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.
}
}
}