From 69a7f00645329ec3180ce3d3c91f664160bf8c15 Mon Sep 17 00:00:00 2001 From: Falucho <german.faller@pcunix71.fing.edu.uy> Date: Fri, 21 Jun 2019 02:37:29 -0300 Subject: [PATCH] Se trabaja en la integracion Con COlas de mensaje --- .../java/uy/edu/fing/tse/jsf/RequestBean.java | 2 +- .../java/uy/edu/fing/tse/jsp/MyServlet.java | 2 +- .../java/uy/edu/fing/tse/dto/Category.java | 6 +- .../uy/edu/fing/tse/dto/CheckChecker.java | 6 +- .../uy/edu/fing/tse/dto/CheckMechanism.java | 5 +- .../main/java/uy/edu/fing/tse/dto/Fact.java | 5 +- .../java/uy/edu/fing/tse/dto/Mechanism.java | 6 +- .../edu/fing/tse/dto/MechanismInternal.java | 1 + .../uy/edu/fing/tse/dto/Peripherical.java | 2 + .../main/java/uy/edu/fing/tse/dto/Role.java | 6 +- .../main/java/uy/edu/fing/tse/dto/Score.java | 6 +- .../main/java/uy/edu/fing/tse/dto/State.java | 6 +- .../uy/edu/fing/tse/dto/StateHistory.java | 5 +- .../main/java/uy/edu/fing/tse/dto/User.java | 6 +- .../main/java/uy/edu/fing/tse/dto/UserBO.java | 2 + .../main/java/uy/edu/fing/tse/dto/UserFO.java | 1 + central-ejb/pom.xml | 11 +++ central-ejb/src/main/java/.keep | 0 .../fing/tse/practico/business/Business.java | 25 ++---- .../tse/practico/business/BusinessBean.java | 47 +---------- .../practico/business/common/Propiedades.java | 79 +++++++++++++++++++ .../practico/business/jms/AltaNoticiaMDB.java | 38 --------- .../practico/business/jms/JMSProducer.java | 40 ---------- .../practico/business/mq/MessageConsumer.java | 78 ++++++++++++++++++ .../practico/business/mq/MessageProducer.java | 38 +++++++++ .../fing/tse/practico/business/mq/Queue.java | 21 +++++ .../practico/business/mq/RabbitConfig.java | 42 ++++++++++ .../src/main/resources/central.properties | 6 ++ pom.xml | 18 ++++- 29 files changed, 353 insertions(+), 157 deletions(-) delete mode 100644 central-ejb/src/main/java/.keep create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/practico/business/common/Propiedades.java delete mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/AltaNoticiaMDB.java delete mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/JMSProducer.java create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageConsumer.java create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageProducer.java create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/Queue.java create mode 100644 central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/RabbitConfig.java create mode 100644 central-ejb/src/main/resources/central.properties diff --git a/backoffice/src/main/java/uy/edu/fing/tse/jsf/RequestBean.java b/backoffice/src/main/java/uy/edu/fing/tse/jsf/RequestBean.java index 8e0d118..b358919 100644 --- a/backoffice/src/main/java/uy/edu/fing/tse/jsf/RequestBean.java +++ b/backoffice/src/main/java/uy/edu/fing/tse/jsf/RequestBean.java @@ -19,7 +19,7 @@ public class RequestBean { private BusinessLocal negocio; @EJB - private uy.edu.fing.tse.practico.business.jms.JMSProducer jms; + private uy.edu.fing.tse.practico.business.mq.JMSProducer jms; @ManagedProperty(value = "#{Session}") private SessionBean session; diff --git a/backoffice/src/main/java/uy/edu/fing/tse/jsp/MyServlet.java b/backoffice/src/main/java/uy/edu/fing/tse/jsp/MyServlet.java index 44d8889..b117d3b 100644 --- a/backoffice/src/main/java/uy/edu/fing/tse/jsp/MyServlet.java +++ b/backoffice/src/main/java/uy/edu/fing/tse/jsp/MyServlet.java @@ -20,7 +20,7 @@ public class MyServlet extends HttpServlet { private BusinessLocal negocio; @EJB - private uy.edu.fing.tse.practico.business.jms.JMSProducer jms; + private uy.edu.fing.tse.practico.business.mq.JMSProducer jms; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Category.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Category.java index 194727b..5930e47 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Category.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Category.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public final class Category { +import java.io.Serializable; + +public final class Category implements Serializable { + + private static final long serialVersionUID = -317249293474531216L; private Long id; private String name; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckChecker.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckChecker.java index 59d7463..b9ff4dc 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckChecker.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckChecker.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public final class CheckChecker { +import java.io.Serializable; + +public final class CheckChecker implements Serializable { + + private static final long serialVersionUID = 4798508172561834440L; private Long id; private UserBO checker; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckMechanism.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckMechanism.java index 64c5a36..4f49403 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckMechanism.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/CheckMechanism.java @@ -1,8 +1,11 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; import java.util.Date; -public final class CheckMechanism { +public final class CheckMechanism implements Serializable { + + private static final long serialVersionUID = -5354719133598426738L; private Long id; private Peripherical peripheral; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Fact.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Fact.java index 691ec0e..1fdf5af 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Fact.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Fact.java @@ -1,9 +1,12 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; -public final class Fact { +public final class Fact implements Serializable { + + private static final long serialVersionUID = -6218807350324946355L; private Long id; private String title; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Mechanism.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Mechanism.java index 65d5835..af2924f 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Mechanism.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Mechanism.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public class Mechanism { +import java.io.Serializable; + +public class Mechanism implements Serializable { + + private static final long serialVersionUID = 2443873705205432766L; private Long id; private String name; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/MechanismInternal.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/MechanismInternal.java index 7f2b038..e685e54 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/MechanismInternal.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/MechanismInternal.java @@ -3,4 +3,5 @@ package uy.edu.fing.tse.dto; public final class MechanismInternal extends Mechanism { + private static final long serialVersionUID = -8256891910168590447L; } diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Peripherical.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Peripherical.java index 91003e0..f74e7a3 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Peripherical.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Peripherical.java @@ -6,6 +6,8 @@ import java.util.List; public final class Peripherical extends Mechanism { + private static final long serialVersionUID = 3767463748206760371L; + private List<Category> categories = new ArrayList<>(); private String endpoint; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Role.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Role.java index 698980b..ff9c9a7 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Role.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Role.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public class Role { +import java.io.Serializable; + +public class Role implements Serializable { + + private static final long serialVersionUID = -1446670708639059343L; private Long id; private String name; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/Score.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/Score.java index 770b8ac..5014f94 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/Score.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/Score.java @@ -1,9 +1,13 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; + /** * Esta es la que puede ser vergonzosa, verdad a media, verdad, falsa */ -public final class Score { +public final class Score implements Serializable { + + private static final long serialVersionUID = -5278506826296305357L; private Long id; private String value; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/State.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/State.java index 483308d..97571a1 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/State.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/State.java @@ -1,9 +1,13 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; + /** * Son los estados para los hechos, Nuevo, aComprobar, enProceso, Verificado, Publicado, Cancelado */ -public final class State { +public final class State implements Serializable { + + private static final long serialVersionUID = 8369408999916591568L; private Long id; private String value; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/StateHistory.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/StateHistory.java index 9d7ed14..91b6978 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/StateHistory.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/StateHistory.java @@ -1,8 +1,11 @@ package uy.edu.fing.tse.dto; +import java.io.Serializable; import java.util.Date; -public final class StateHistory { +public final class StateHistory implements Serializable { + + private static final long serialVersionUID = 1032183705367730249L; private Long id; private State state; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/User.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/User.java index 7d1445c..6078a45 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/User.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/User.java @@ -1,6 +1,10 @@ package uy.edu.fing.tse.dto; -public abstract class User { +import java.io.Serializable; + +public abstract class User implements Serializable { + + private static final long serialVersionUID = -5501550545779779794L; private Long id; private String mail; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/UserBO.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/UserBO.java index f378d47..8058ca4 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/UserBO.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/UserBO.java @@ -3,6 +3,8 @@ package uy.edu.fing.tse.dto; public final class UserBO extends User { + private static final long serialVersionUID = -460563178765136315L; + private String salt; private String password; private Role role; diff --git a/central-dto/src/main/java/uy/edu/fing/tse/dto/UserFO.java b/central-dto/src/main/java/uy/edu/fing/tse/dto/UserFO.java index 933fc5e..6f82218 100644 --- a/central-dto/src/main/java/uy/edu/fing/tse/dto/UserFO.java +++ b/central-dto/src/main/java/uy/edu/fing/tse/dto/UserFO.java @@ -2,4 +2,5 @@ package uy.edu.fing.tse.dto; public final class UserFO extends User { + private static final long serialVersionUID = -7399690108581919726L; } diff --git a/central-ejb/pom.xml b/central-ejb/pom.xml index 9063b50..91f5fc6 100644 --- a/central-ejb/pom.xml +++ b/central-ejb/pom.xml @@ -83,6 +83,17 @@ <type>pom</type> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>2.9.9</version> + </dependency> + + <dependency> + <groupId>com.rabbitmq</groupId> + <artifactId>amqp-client</artifactId> + </dependency> + </dependencies> <build> diff --git a/central-ejb/src/main/java/.keep b/central-ejb/src/main/java/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/Business.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/Business.java index 8481131..3a650f5 100644 --- a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/Business.java +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/Business.java @@ -1,28 +1,13 @@ package uy.edu.fing.tse.practico.business; -import uy.edu.fing.tse.dto.NoticiaDTO; -import uy.edu.fing.tse.dto.PublicacionDTO; -import java.util.List; +import uy.edu.fing.tse.dto.CheckMechanism; +import uy.edu.fing.tse.dto.Peripherical; -/** - * La Capa de Negocio deberá proveer funcionalidades para Agregar una Publicación a - * una Noticia, Obtener Noticias, Obtener Publicaciones y Obtener las Publicaciones de - * una Noticia. - */ public interface Business { - void add(NoticiaDTO noticia); + void altaPeriferico(Peripherical p); - void add(PublicacionDTO publicacion, NoticiaDTO noticia); - - NoticiaDTO findNoticia(long idNoticia); - - List<NoticiaDTO> getNoticias(); - - List<PublicacionDTO> getPublicaciones(); - - List<PublicacionDTO> getPublicaciones(final long idNoticia); - - NoticiaDTO addPublicacionANoticia(final PublicacionDTO pub, final long idNoticia); + void altaVerificacionMecanismo(CheckMechanism cm); } + diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/BusinessBean.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/BusinessBean.java index fde79c4..b3d2c3f 100644 --- a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/BusinessBean.java +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/BusinessBean.java @@ -1,19 +1,13 @@ package uy.edu.fing.tse.practico.business; -import uy.edu.fing.tse.dto.NoticiaDTO; -import uy.edu.fing.tse.dto.PublicacionDTO; +import uy.edu.fing.tse.dto.CheckMechanism; +import uy.edu.fing.tse.dto.Peripherical; import uy.edu.fing.tse.practico.db.DataAccessBean; import javax.annotation.PostConstruct; import javax.ejb.*; -import java.util.List; -/** - * Se debe controlar que una noticia no tenga más de diez publicaciones. Esta - * capa deberá implementarse con Stateless Session Beans que provean interfaces - * remotas y locales - */ @Stateless @Local({BusinessLocal.class}) @Remote({BusinessRemote.class}) @@ -29,45 +23,12 @@ public class BusinessBean implements BusinessLocal, BusinessRemote { } @Override - public void add(NoticiaDTO noticia) { - dataAccess.alta(noticia); - } - - @Override - public void add(PublicacionDTO publicacion, NoticiaDTO noticia) { - noticia.getPublicaciones().add(publicacion); - dataAccess.alta(noticia); - } + public void altaPeriferico(Peripherical p) { - @Override - public NoticiaDTO findNoticia(final long idNoticia) { - return dataAccess.find(idNoticia); - } - - @Override - public List<NoticiaDTO> getNoticias() { - return dataAccess.getNoticias(); } @Override - public List<PublicacionDTO> getPublicaciones() { - return dataAccess.getPublicaciones(); - } - - @Override - public List<PublicacionDTO> getPublicaciones(final long idNoticia) { - return dataAccess.find(idNoticia).getPublicaciones(); - } - - @Override - public NoticiaDTO addPublicacionANoticia(final PublicacionDTO pub, final long idNoticia) { - NoticiaDTO noticiaDTO = dataAccess.find(idNoticia); - - if (noticiaDTO.getPublicaciones().size() >= 10) { - throw new RuntimeException("La noticia tiene demasiadas publicaciones ya."); - } + public void altaVerificacionMecanismo(CheckMechanism cm) { - noticiaDTO = dataAccess.addPublicacionToNoticia(pub, idNoticia); - return noticiaDTO; } } diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/common/Propiedades.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/common/Propiedades.java new file mode 100644 index 0000000..a0b19d5 --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/common/Propiedades.java @@ -0,0 +1,79 @@ +package uy.edu.fing.tse.practico.business.common; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.util.Map; +import java.util.Properties; + +public enum Propiedades { + + URI("uy.edu.fing.tse.business.rabbit.uri", ""), + HOST("uy.edu.fing.tse.business.rabbit.host", ""), + PORT("uy.edu.fing.tse.business.rabbit.port", "5672"), + VHOST("uy.edu.fing.tse.business.rabbit.vhost", ""), + USERNAME("uy.edu.fing.tse.business.rabbit.username", ""), + PASSWORD("uy.edu.fing.tse.business.rabbit.password", ""); + + private final String key; + private final String defaultValue; + + Propiedades(String key, String defaultValue) { + this.key = key; + this.defaultValue = defaultValue; + } + + public String getKey() { + return key; + } + + public String getDefaultValue() { + return defaultValue; + } + + public String getValue() { + return System.getProperty(key); + } + + public Integer getIntValue() { + return Integer.valueOf(System.getProperty(key)); + } + + public Boolean getBoolValue() { + return Boolean.valueOf(System.getProperty(key)); + } + + static { + //Agrego valores por defecto + for (Propiedades value : Propiedades.values()) { + System.setProperty(value.key, value.defaultValue); + } + //Cargo los valores del archivo + try { + final URL resource = Propiedades.class.getClassLoader().getResource("central.properties"); + final Path of = Path.of(resource.toURI()); + + load(of.toFile()); + } catch (URISyntaxException e) { + throw new RuntimeException("Error leyendo el archivo de propiedades", e); + } + + } + + public static void load(final File propFile) { + try (FileInputStream is = new FileInputStream(propFile)) { + Properties p = new Properties(); + p.load(is); + + for (Map.Entry<Object, Object> entry : p.entrySet()) { + System.setProperty(entry.getKey().toString(), entry.getValue().toString()); + } + + } catch (IOException ex) { + throw new RuntimeException("Error leyendo el archivo de propiedades", ex); + } + } +} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/AltaNoticiaMDB.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/AltaNoticiaMDB.java deleted file mode 100644 index b16d696..0000000 --- a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/AltaNoticiaMDB.java +++ /dev/null @@ -1,38 +0,0 @@ -package uy.edu.fing.tse.practico.business.jms; - -import uy.edu.fing.tse.dto.NoticiaDTO; -import uy.edu.fing.tse.practico.business.BusinessBean; - -import javax.ejb.ActivationConfigProperty; -import javax.ejb.EJB; -import javax.ejb.MessageDriven; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; - -//FIXME comentarlo para el despliegue en OpenShift -@MessageDriven(name = "AltaNoticia", activationConfig = { - @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/queue_alta_noticia"), - @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), - @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), - @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "50") -}) -public class AltaNoticiaMDB implements MessageListener { - - @EJB - private BusinessBean negocio; - - @Override - public void onMessage(Message message) { - try { - final String body = message.getBody(String.class); - final String[] split = body.trim().split("\\|"); - - final NoticiaDTO noticia = new NoticiaDTO(null, split[0], split[1]); - negocio.add(noticia); - - } catch (JMSException e) { - e.printStackTrace(); - } - } -} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/JMSProducer.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/JMSProducer.java deleted file mode 100644 index b364f6d..0000000 --- a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/jms/JMSProducer.java +++ /dev/null @@ -1,40 +0,0 @@ -package uy.edu.fing.tse.practico.business.jms; - -import uy.edu.fing.tse.dto.NoticiaDTO; - -import javax.annotation.Resource; -import javax.ejb.Stateless; -import javax.jms.*; - -@Stateless -public class JMSProducer { - - @Resource(lookup = "java:/ConnectionFactory") - private ConnectionFactory connectionFactory; - - @Resource(lookup = "java:/jms/queue/queue_alta_noticia") - private Queue sendQueue; - - public void altaNoticia(final NoticiaDTO noticia) { - try { - sendMsj(noticia.getTitulo() + "|" + noticia.getDescripcion()); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private void sendMsj(final String messageStr) { - // Create the JMS connection, session, producer, and consumer - try (Connection connection = connectionFactory.createConnection()) { - final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - final MessageProducer producer = session.createProducer(sendQueue); - - connection.start(); - - final Message message = session.createTextMessage(messageStr); - producer.send(message); - } catch (JMSException _e) { - //ignore - } - } -} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageConsumer.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageConsumer.java new file mode 100644 index 0000000..fc6a8fe --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageConsumer.java @@ -0,0 +1,78 @@ +package uy.edu.fing.tse.practico.business.mq; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.rabbitmq.client.AMQP; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.DefaultConsumer; +import com.rabbitmq.client.Envelope; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import uy.edu.fing.tse.dto.CheckMechanism; +import uy.edu.fing.tse.dto.Peripherical; +import uy.edu.fing.tse.practico.business.BusinessBean; + +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +@Singleton +@Startup +public class MessageConsumer { + + private static final Logger LOG = LoggerFactory.getLogger(MessageConsumer.class); + + private Channel channel; + + @EJB + private BusinessBean negocio; + + @PostConstruct + public void init() { + try { + channel = RabbitConfig.channel(); + subscripcion(Queue.SUBCRIBTION, channel); + verificacion(Queue.VERIFICATION, channel); + } catch (IOException | TimeoutException e) { + LOG.error("Error: ", e); + throw new RuntimeException("Error al construir la coneccion con MQ", e); + } + } + + private void subscripcion(final Queue queue, final Channel channel) throws IOException { + LOG.info("Subscribing: " + queue.name); + channel.basicConsume(queue.name, false, queue.name + "Tag", new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + String routingKey = envelope.getRoutingKey(); + String contentType = properties.getContentType(); + long deliveryTag = envelope.getDeliveryTag(); + + final Peripherical peripherical = new ObjectMapper().readValue(body, Peripherical.class); + negocio.altaPeriferico(peripherical); + + channel.basicAck(deliveryTag, false); + } + }); + } + + private void verificacion(final Queue queue, final Channel channel) throws IOException { + LOG.info("Subscribing: " + queue.name); + channel.basicConsume(queue.name, false, queue.name + "Tag", new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + String routingKey = envelope.getRoutingKey(); + String contentType = properties.getContentType(); + long deliveryTag = envelope.getDeliveryTag(); + + + final CheckMechanism cm = new ObjectMapper().readValue(body, CheckMechanism.class); + negocio.altaVerificacionMecanismo(cm); + + channel.basicAck(deliveryTag, false); + } + }); + } +} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageProducer.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageProducer.java new file mode 100644 index 0000000..cc264e1 --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/MessageProducer.java @@ -0,0 +1,38 @@ +package uy.edu.fing.tse.practico.business.mq; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.rabbitmq.client.Channel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.PostConstruct; +import javax.ejb.Stateless; +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +@Stateless +public class MessageProducer { + + private static final Logger LOG = LoggerFactory.getLogger(MessageProducer.class); + + private Channel channel; + + @PostConstruct + public void init() { + try { + channel = RabbitConfig.channel(); + } catch (IOException | TimeoutException e) { + LOG.error("Error: ", e); + throw new RuntimeException("Error al construir la coneccion con MQ", e); + } + } + + public void send(final Object message, final Queue queue) throws IOException { + final String body = new ObjectMapper().writeValueAsString(message); + send(body, queue); + } + + public void send(final String message, final Queue queue) throws IOException { + channel.basicPublish("", queue.name, null, message.getBytes()); + } +} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/Queue.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/Queue.java new file mode 100644 index 0000000..f5f1dae --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/Queue.java @@ -0,0 +1,21 @@ +package uy.edu.fing.tse.practico.business.mq; + +public enum Queue { + REQUEST("request"), + VERIFICATION("verification"), + SUBCRIBTION("subcription"), + DEFAULT("default"), + COLA("cola"); + + String name; + boolean durable; + boolean exclusive; + boolean autoDelete; + + Queue(String name) { + this.name = name; + durable = false; + exclusive = false; + autoDelete = false; + } +} diff --git a/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/RabbitConfig.java b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/RabbitConfig.java new file mode 100644 index 0000000..f7bc956 --- /dev/null +++ b/central-ejb/src/main/java/uy/edu/fing/tse/practico/business/mq/RabbitConfig.java @@ -0,0 +1,42 @@ +package uy.edu.fing.tse.practico.business.mq; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; +import uy.edu.fing.tse.practico.business.common.Propiedades; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +final class RabbitConfig { + //https://barnacle.rmq.cloudamqp.com/#/queues + private static Channel channel = null; + + private RabbitConfig() { + } + + static Channel channel() throws IOException, TimeoutException { + if (channel == null) { + channel = connection().createChannel(); + for (Queue queue : Queue.values()) { + channel.queueDeclare(queue.name, queue.durable, queue.exclusive, queue.autoDelete, null); + } + } + return channel; + } + + private static Connection connection() throws IOException, TimeoutException { + return connectionFactory().newConnection(); + } + + private static ConnectionFactory connectionFactory() { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(Propiedades.HOST.getValue()); + factory.setPort(Propiedades.PORT.getIntValue()); + factory.setPassword(Propiedades.PASSWORD.getValue()); + factory.setUsername(Propiedades.USERNAME.getValue()); + factory.setVirtualHost(Propiedades.VHOST.getValue()); + return factory; + } + +} diff --git a/central-ejb/src/main/resources/central.properties b/central-ejb/src/main/resources/central.properties new file mode 100644 index 0000000..33f1c55 --- /dev/null +++ b/central-ejb/src/main/resources/central.properties @@ -0,0 +1,6 @@ +uy.edu.fing.tse.business.rabbit.uri=amqp://hjxhckpo:kGFmsQ9HodjSzRVT016ttW-z7d2tn_IF@barnacle.rmq.cloudamqp.com/hjxhckpo +uy.edu.fing.tse.business.rabbit.host=barnacle.rmq.cloudamqp.com +uy.edu.fing.tse.business.rabbit.port=5672 +uy.edu.fing.tse.business.rabbit.vhost=hjxhckpo +uy.edu.fing.tse.business.rabbit.username=hjxhckpo +uy.edu.fing.tse.business.rabbit.password=kGFmsQ9HodjSzRVT016ttW-z7d2tn_IF \ No newline at end of file diff --git a/pom.xml b/pom.xml index f605bf0..d907081 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ <module>central-db</module> <module>central-ejb</module> <module>central-ear</module> - <module>backoffice</module> + <!-- <module>backoffice</module>--> </modules> <properties> @@ -25,12 +25,13 @@ <version.wildfly>15.0.0.Final</version.wildfly> <!-- other plugin versions --> - <version.compiler.plugin>3.1</version.compiler.plugin> + <version.compiler.plugin>3.8.1</version.compiler.plugin> <version.ear.plugin>3.0.1</version.ear.plugin> <version.ejb.plugin>3.0.1</version.ejb.plugin> - <version.surefire.plugin>2.22.1</version.surefire.plugin> + <version.surefire.plugin>2.22.2</version.surefire.plugin> <version.war.plugin>3.2.2</version.war.plugin> + <org.mapstruct.version>1.3.0.Final</org.mapstruct.version> </properties> <dependencyManagement> @@ -202,10 +203,16 @@ <version>1.2</version> </dependency> + <dependency> + <groupId>com.rabbitmq</groupId> + <artifactId>amqp-client</artifactId> + <version>5.7.0</version> + </dependency> + <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> - <version>1.3.0.Final</version> + <version>${org.mapstruct.version}</version> </dependency> </dependencies> </dependencyManagement> @@ -289,7 +296,10 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${version.surefire.plugin}</version> + <configuration> + <skip>false</skip> + <skipTests>false</skipTests> <argLine> --illegal-access=permit </argLine> -- GitLab