瀏覽代碼

Artemis dispatcher and receiver

Daniel Garcia Costa 2 年之前
父節點
當前提交
8fe65cef23

+ 5 - 0
pom.xml

@@ -22,6 +22,11 @@
 			<artifactId>spring-boot-starter-artemis</artifactId>
 		</dependency>
 		<dependency>
+			<groupId>org.apache.activemq</groupId>
+			<artifactId>artemis-jms-server</artifactId>
+			<version>2.28.0</version>
+		</dependency>
+		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
 		</dependency>

+ 35 - 2
src/main/java/es/uv/garcosda/controllers/MailerController.java

@@ -1,14 +1,21 @@
 package es.uv.garcosda.controllers;
 
+import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import es.uv.garcosda.domain.Mail;
 import es.uv.garcosda.domain.User;
+import es.uv.garcosda.objects.MailDTO;
+import es.uv.garcosda.services.DispatcherService;
 import es.uv.garcosda.services.UserService;
 
 @RestController
@@ -16,7 +23,16 @@ import es.uv.garcosda.services.UserService;
 public class MailerController {
 
 	@Autowired
-	private UserService us;
+	UserService us;
+	
+	@Autowired
+	DispatcherService ds;
+	
+	@GetMapping("users")
+	public ResponseEntity<?> getUsers() {
+		List<User> u = this.us.findAll();
+		return new ResponseEntity<List<User>>(u, HttpStatus.OK);
+	}
 	
 	@GetMapping("users/{email}")
 	public ResponseEntity<?> getUser(@PathVariable("email") String email) {
@@ -25,7 +41,24 @@ public class MailerController {
 			return new ResponseEntity<String>("No user found with email "+email, HttpStatus.NOT_FOUND);
 		}
 		else {
-			return new ResponseEntity<User>(u, HttpStatus.NOT_FOUND);
+			return new ResponseEntity<User>(u, HttpStatus.OK);
+		}
+	}
+	
+	@PostMapping("send")
+	public ResponseEntity<?> sendMail(@RequestBody MailDTO mail){
+		User from = this.us.findByEmail(mail.getFrom());
+		User to = this.us.findByEmail(mail.getTo());
+		if(from.getEmail() == null) {
+			return new ResponseEntity<String>("No origin user found with email "+mail.getFrom(), HttpStatus.NOT_FOUND);
+		}
+		else if(to.getEmail() == null) {
+			return new ResponseEntity<String>("No destination user found with email "+mail.getTo(), HttpStatus.NOT_FOUND);
+		}
+		else {
+			Mail m = new Mail(from, to, mail.getSubject(), mail.getBody());
+			ds.sendMessage(m);
+			return new ResponseEntity<Mail>(m, HttpStatus.OK);
 		}
 	}
 	

+ 10 - 2
src/main/java/es/uv/garcosda/domain/Mail.java

@@ -1,7 +1,10 @@
 package es.uv.garcosda.domain;
 
-public class Mail {
-	
+import java.io.Serializable;
+
+public class Mail implements Serializable {
+
+	private static final long serialVersionUID = 1L;
 	private User from;
 	private User to;
 	private String subject;
@@ -48,4 +51,9 @@ public class Mail {
 		this.body = body;
 	}
 	
+	@Override
+	public String toString() {
+		return String.format("Email{from=%s, to=%s, subject=%s}", this.getFrom().getEmail(), this.getTo().getEmail(), this.getSubject());
+	}
+	
 }

+ 4 - 1
src/main/java/es/uv/garcosda/domain/User.java

@@ -1,7 +1,10 @@
 package es.uv.garcosda.domain;
 
-public class User {
+import java.io.Serializable;
 
+public class User  implements Serializable {
+
+	private static final long serialVersionUID = 1L;
 	private String email;
 	private String firstname;
 	private String lastname;

+ 60 - 0
src/main/java/es/uv/garcosda/objects/MailDTO.java

@@ -0,0 +1,60 @@
+package es.uv.garcosda.objects;
+
+import java.io.Serializable;
+
+public class MailDTO  implements Serializable {
+	
+	private static final long serialVersionUID = 1L;
+	private String from;
+	private String to;
+	private String subject;
+	private String body;
+	
+	public MailDTO() {}
+	
+	public MailDTO(String from, String to, String subject, String body) {
+		this.from = from;
+		this.to = to;
+		this.subject = subject;
+		this.body = body;
+	}
+
+	public String getFrom() {
+		return from;
+	}
+
+	public void setFrom(String from) {
+		this.from = from;
+	}
+
+	public String getTo() {
+		return to;
+	}
+
+	public void setTo(String to) {
+		this.to = to;
+	}
+
+	public String getSubject() {
+		return subject;
+	}
+
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+
+	public String getBody() {
+		return body;
+	}
+
+	public void setBody(String body) {
+		this.body = body;
+	}
+	
+	@Override
+	public String toString() {
+		return String.format("Email{from=%s, to=%s, subject=%s}", this.getFrom(), this.getTo(), this.getSubject());
+	}
+	
+}
+

+ 24 - 0
src/main/java/es/uv/garcosda/services/DispatcherService.java

@@ -0,0 +1,24 @@
+package es.uv.garcosda.services;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.stereotype.Service;
+
+import es.uv.garcosda.domain.Mail;
+
+@Service
+public class DispatcherService {
+
+	@Autowired
+	JmsTemplate jms;
+	
+	@Value("${mailer.queue}")
+	String queue;
+	
+	public void sendMessage(Mail m) {
+		jms.convertAndSend(this.queue, m);
+	}
+	
+	
+}

+ 26 - 0
src/main/java/es/uv/garcosda/services/ReceiverService.java

@@ -0,0 +1,26 @@
+package es.uv.garcosda.services;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.stereotype.Service;
+
+import es.uv.garcosda.domain.Mail;
+import jakarta.jms.JMSException;
+import jakarta.jms.Message;
+
+@Service
+public class ReceiverService {
+
+	Logger log = LoggerFactory.getLogger(ReceiverService.class);
+	
+	@JmsListener(destination = "${mailer.queue}")
+	public void receive(Message message) {
+		try {
+			log.info("Received: " + message.getBody(Mail.class));	
+		} 
+		catch (JMSException e) {
+			e.printStackTrace();
+		}
+	}
+}

+ 4 - 0
src/main/java/es/uv/garcosda/services/UserService.java

@@ -39,6 +39,10 @@ public class UserService {
 		       ));
 	}
 	
+	public List<User> findAll(){
+		return this.users;
+	}
+	
 	public User findByEmail(String email) {
 		List<User> ps = this.users.stream().filter(x -> x.getEmail().toLowerCase().equals(email.toLowerCase())).collect(Collectors.toList());
 		if(ps.size() > 0) {

+ 5 - 0
src/main/resources/META-INF/additional-spring-configuration-metadata.json

@@ -0,0 +1,5 @@
+{"properties": [{
+  "name": "mailer.queue",
+  "type": "java.lang.String",
+  "description": "A description for 'mailer.queue'"
+}]}

+ 6 - 0
src/main/resources/application.properties

@@ -1 +1,7 @@
+spring.artemis.mode=embedded
+spring.artemis.broker-url=tcp://localhost:9876
+spring.artemis.user=admin
+spring.artemis.password=secret
+spring.artemis.embedded.topics=mailbox
 
+mailer.queue=mailbox