diff --git a/src/spring-petclinic-config-server/src/main/resources/application.yml b/src/spring-petclinic-config-server/src/main/resources/application.yml index 9a58811..3764030 100644 --- a/src/spring-petclinic-config-server/src/main/resources/application.yml +++ b/src/spring-petclinic-config-server/src/main/resources/application.yml @@ -5,6 +5,8 @@ spring: server: git: uri: https://github.com/spring-petclinic/spring-petclinic-microservices-config + username: hanzan + password: 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 default-label: main # Use the File System Backend to avoid git pulling. Enable "native" profile in the Config Server. native: diff --git a/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/config/MessagingConfig.java b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/config/MessagingConfig.java new file mode 100644 index 0000000..50c3766 --- /dev/null +++ b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/config/MessagingConfig.java @@ -0,0 +1,28 @@ +package org.springframework.samples.petclinic.visits.config; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jms.support.converter.MappingJackson2MessageConverter; +import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.samples.petclinic.visits.entities.VisitRequest; +import org.springframework.samples.petclinic.visits.entities.VisitResponse; + +@Configuration +public class MessagingConfig { + + @Bean + public MessageConverter jackson2Converter() { + MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); + + Map> typeMappings = new HashMap>(); + typeMappings.put("visitRequest", VisitRequest.class); + typeMappings.put("visitResponse", VisitResponse.class); + converter.setTypeIdMappings(typeMappings); + converter.setTypeIdPropertyName("messageType"); + return converter; + } +} diff --git a/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/config/QueueConfig.java b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/config/QueueConfig.java new file mode 100644 index 0000000..dac3732 --- /dev/null +++ b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/config/QueueConfig.java @@ -0,0 +1,12 @@ +package org.springframework.samples.petclinic.visits.config; + +import org.springframework.beans.factory.annotation.Value; + +public class QueueConfig { + @Value("${spring.jms.queue.visits-requests:visits-requests}") + private String visitsRequestsQueue; + + public String getVisitsRequestsQueue() { + return visitsRequestsQueue; + } +} diff --git a/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/entities/VisitRequest.java b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/entities/VisitRequest.java new file mode 100644 index 0000000..4c76355 --- /dev/null +++ b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/entities/VisitRequest.java @@ -0,0 +1,39 @@ +package org.springframework.samples.petclinic.visits.entities; + +import java.io.Serializable; +import java.util.Date; + +public class VisitRequest implements Serializable { + private static final long serialVersionUID = -249974321255677286L; + + private Integer requestId; + private Integer petId; + private String message; + + public VisitRequest() { + } + + public Integer getRequestId() { + return requestId; + } + + public void setRequestId(Integer id) { + this.requestId = id; + } + + public Integer getPetId() { + return petId; + } + + public void setPetId(Integer petId) { + this.petId = petId; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/entities/VisitResponse.java b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/entities/VisitResponse.java new file mode 100644 index 0000000..0132cc1 --- /dev/null +++ b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/entities/VisitResponse.java @@ -0,0 +1,40 @@ +package org.springframework.samples.petclinic.visits.entities; + +public class VisitResponse { + Integer requestId; + Boolean confirmed; + String reason; + + public VisitResponse() { + } + + public VisitResponse(Integer requestId, Boolean confirmed, String reason) { + this.requestId = requestId; + this.confirmed = confirmed; + this.reason = reason; + } + + public Boolean getConfirmed() { + return confirmed; + } + + public void setConfirmed(Boolean confirmed) { + this.confirmed = confirmed; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Integer getRequestId() { + return requestId; + } + + public void setRequestId(Integer requestId) { + this.requestId = requestId; + } +} diff --git a/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/service/VisitsReceiver.java b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/service/VisitsReceiver.java new file mode 100644 index 0000000..27f097a --- /dev/null +++ b/src/spring-petclinic-visits-service/src/main/java/org/springframework/samples/petclinic/visits/service/VisitsReceiver.java @@ -0,0 +1,40 @@ +package org.springframework.samples.petclinic.visits.service; + +import java.util.Date; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.samples.petclinic.visits.entities.VisitRequest; +import org.springframework.samples.petclinic.visits.entities.VisitResponse; +import org.springframework.samples.petclinic.visits.model.Visit; +import org.springframework.samples.petclinic.visits.model.VisitRepository; +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +@RequiredArgsConstructor +public class VisitsReceiver { + private final VisitRepository visitsRepository; + + private final JmsTemplate jmsTemplate; + + @JmsListener(destination = "visits-requests") + void receiveVisitRequests(VisitRequest visitRequest) { + log.info("Received message: {}", visitRequest.getMessage()); + try { + Visit visit = new Visit(null, new Date(), visitRequest.getMessage(), + visitRequest.getPetId()); + visitsRepository.save(visit); + jmsTemplate.convertAndSend("visits-confirmations", new VisitResponse(visitRequest.getRequestId(), true, "Your visit request has been accepted")); + } catch (Exception ex) { + log.error("Error saving visit: {}", ex.getMessage()); + jmsTemplate.convertAndSend("visits-confirmations", new VisitResponse(visitRequest.getRequestId(), false, ex.getMessage())); + } + } + +}