Skip to content

Commit

Permalink
10_5_JMS
Browse files Browse the repository at this point in the history
  • Loading branch information
JavaWebinar committed Dec 18, 2017
1 parent 1c89512 commit 838ec71
Show file tree
Hide file tree
Showing 8 changed files with 171 additions and 5 deletions.
14 changes: 14 additions & 0 deletions config_templates/context.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,18 @@
password="password"
url="jdbc:postgresql://localhost:5432/masterjava"/>

<Resource name="jms/ConnectionFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="failover:(vm://localhost)"
brokerName="LocalActiveMQBroker"
useEmbeddedBroker="true"/>

<Resource name="jms/queue/MailQueue"
auth="Container"
type="org.apache.activemq.command.ActiveMQQueue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="MAIL.QUEUE"/>

</Context>
1 change: 1 addition & 0 deletions parent-web/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

<properties>
<maven.resources.overwrite>true</maven.resources.overwrite>
<activemq.version>5.15.2</activemq.version>
</properties>

<build>
Expand Down
7 changes: 7 additions & 0 deletions services/mail-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -99,5 +99,12 @@
<artifactId>jersey-bean-validation</artifactId>
<version>${jersey.version}</version>
</dependency>

<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>${activemq.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package ru.javaops.masterjava.service.mail.listeners;

import lombok.extern.slf4j.Slf4j;

import javax.jms.*;
import javax.naming.InitialContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
@Slf4j
public class JmsMailListener implements ServletContextListener {
private Thread listenerThread = null;
private QueueConnection connection;

@Override
public void contextInitialized(ServletContextEvent sce) {
try {
InitialContext initCtx = new InitialContext();
QueueConnectionFactory connectionFactory =
(QueueConnectionFactory) initCtx.lookup("java:comp/env/jms/ConnectionFactory");
connection = connectionFactory.createQueueConnection();
QueueSession queueSession = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) initCtx.lookup("java:comp/env/jms/queue/MailQueue");
QueueReceiver receiver = queueSession.createReceiver(queue);
connection.start();
log.info("Listen JMS messages ...");
listenerThread = new Thread(() -> {
try {
while (!Thread.interrupted()) {
Message m = receiver.receive();
// TODO implement mail sending
if (m instanceof TextMessage) {
TextMessage tm = (TextMessage) m;
String text = tm.getText();
log.info("Received TextMessage with text '{}'", text);
}
}
} catch (Exception e) {
log.error("Receiving messages failed: " + e.getMessage(), e);
}
});
listenerThread.start();
} catch (Exception e) {
log.error("JMS failed: " + e.getMessage(), e);
}
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
if (connection != null) {
try {
connection.close();
} catch (JMSException ex) {
log.warn("Couldn't close JMSConnection: ", ex);
}
}
if (listenerThread != null) {
listenerThread.interrupt();
}
}
}
7 changes: 7 additions & 0 deletions web/webapp/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,12 @@
<artifactId>mail-api</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<scope>provided</scope>
<version>${activemq.version}</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package ru.javaops.masterjava.webapp;

import lombok.extern.slf4j.Slf4j;

import javax.jms.*;
import javax.naming.InitialContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.IllegalStateException;

@WebServlet("/sendJms")
@Slf4j
public class JmsSendServlet extends HttpServlet {
private Connection connection;
private Session session;
private MessageProducer producer;

@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
try {
InitialContext initCtx = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) initCtx.lookup("java:comp/env/jms/ConnectionFactory");
connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer((Destination) initCtx.lookup("java:comp/env/jms/queue/MailQueue"));
} catch (Exception e) {
throw new IllegalStateException("JMS init failed", e);
}
}

@Override
public void destroy() {
if (connection != null) {
try {
connection.close();
} catch (JMSException ex) {
log.warn("Couldn't close JMSConnection: ", ex);
}
}
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String result;
try {
log.info("Start sending");
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String users = req.getParameter("users");
String subject = req.getParameter("subject");
String body = req.getParameter("body");
result = sendJms(users, subject, body);
log.info("Processing finished with result: {}", result);
} catch (Exception e) {
log.error("Processing failed", e);
result = e.toString();
}
resp.getWriter().write(result);
}

private synchronized String sendJms(String users, String subject, String body) throws JMSException {
TextMessage testMessage = session.createTextMessage();
testMessage.setText(subject);
producer.send(testMessage);
return "Successfully sent JMS message";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
import javax.servlet.http.Part;
import java.io.IOException;

@WebServlet("/send")
@WebServlet("/sendSoap")
@Slf4j
@MultipartConfig
public class SendServlet extends HttpServlet {
public class SoapSendServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String result;
Expand Down
7 changes: 4 additions & 3 deletions web/webapp/src/main/webapp/WEB-INF/templates/users.html
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
<p>
<input type="radio" name="transport" onchange="setTransport('SOAP');" checked>SOAP<br>
<input type="radio" name="transport" onchange="setTransport('REST');">REST<br>
<input type="radio" name="transport" onchange="setTransport('JMS');">JMS<br>
</p>
<p>
<button type="button" onclick="send()">Send</button>
Expand Down Expand Up @@ -79,14 +80,14 @@
var attach = $('#attach')[0].files[0];
if (attach) data.append('attach', attach);
param = {
url: "send",
url: "sendSoap",
data: data,
contentType: false,
processData: false
};
} else if(transport === "REST"){
} else if (transport === "REST" || transport === "JMS") {
param = {
url: "/mail/rest/send",
url: (transport === "REST" ? "/mail/rest/send" : "sendJms"),
data: "users=" + users + "&subject=" + $("#subject").val() + "&body=" + $("#body").val(),
contentType: "application/x-www-form-urlencoded"
};
Expand Down

0 comments on commit 838ec71

Please sign in to comment.