JMS или Java Messaging Service — это API для обмена сообщениями (обмена информацией между двумя отдельными и независимыми сетевыми объектами) на основе Java EE . Он устанавливает ряд интерфейсов для отправки и получения сообщений. JMS поддерживает две модели обмена сообщениями: PTP или «точка-точка» и «публикация-подписка». Первая модель (PTP) опирается на концепцию очередей сообщений, где ключевыми характеристиками являются один потребитель на сообщение и отсутствие временной зависимости между отправителем и получателем. Модель публикации-подписки — наоборот: несколько потребителей на сообщение и временная зависимость между отправителем и получателем.
Основными преимуществами использования JMS являются:
- Асинхронный обмен сообщениями (в этом случае все компоненты не должны быть включены, чтобы приложение функционировало в целом).
- Хранение (сообщения сохраняются от имени получателя, пока он не работает, а затем отправляют их, как только он работает).
Итак, как обычно, давайте попробуем эту технологию в Jelastic Cloud, используя сервер GlassFish!
Создать среду
1. Войдите в свою учетную запись Jelastic и нажмите Создать среду .
2. Выберите GlassFish в качестве сервера приложений и укажите для него ограничения ресурсов. Затем введите имя своей среды и нажмите « Создать» .
Через несколько минут ваша среда появится на Jelastic Dashboard.
Создать приложение JMS
Мы используем приложение JMS, написанное Аруном Гуптой , которое состоит из Отправителя, Получателя и простого тестового сервлета для проверки результатов выполнения программы.
1. Во-первых, создайте отправителя. Это EJB без сохранения состояния, который содержит только один метод для отправки сообщений:
package org.sample.sendmessage;
 
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.*;
 
@Stateless
public class MessageSender {
 
    @Resource(mappedName = "jms/JMSConnectionFactory")
    private ConnectionFactory connectionFactory;
 
    @Resource(mappedName = "jms/myQueue")
    Queue queue;
 
    public void sendMessage(String message) {
        MessageProducer messageProducer;
        TextMessage textMessage;
        try {
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            messageProducer = session.createProducer(queue);
            textMessage = session.createTextMessage();
            //textMessage.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
 
            textMessage.setText(message);
            messageProducer.send(textMessage);
 
            messageProducer.close();
            session.close();
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
2. Теперь мы создадим Receiver, который также является EJB с единственным методом для синхронного получения сообщений:
package org.sample.sendmessage;
 
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.*;
import java.util.Enumeration;
 
@Stateless
public class MessageReceiverSync {
 
    @Resource(mappedName = "jms/JMSConnectionFactory")
    private ConnectionFactory connectionFactory;
 
    @Resource(mappedName = "jms/myQueue")
    Queue myQueue;
 
    private String message;
 
    public String receiveMessage() {
        try {
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueBrowser queueBrowser = session.createBrowser(myQueue);
            Enumeration enumeration = queueBrowser.getEnumeration();
            while (enumeration.hasMoreElements()) {
                TextMessage o = (TextMessage) enumeration.nextElement();
               return "Receive " + o.getText();
 
            }
            session.close();
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
        return "";
    }
}
3. Наконец, давайте создадим тестовый сервлет, который соединяет все части нашего кода и помогает нам проверить результаты выполнения нашей программы:
package org.sample.sendmessage;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet(urlPatterns = {"/TestServlet"})
public class TestServlet extends HttpServlet {
 
    @EJB MessageSender sender;
 
    @EJB MessageReceiverSync receiver;
 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            out.println("");
            out.println("");
            out.println("JMS2 Send Message");
            out.println("");
            out.println("");
            out.println("JMS2 Send/Receive Message using JMS2 " + request.getContextPath() + "");
            String m = "Hello there";
            sender.sendMessage(m);
            out.format("Message sent: %1$s.", m);
            out.println("Receiving message...");
            String message = receiver.receiveMessage();
            out.println("Message rx: " + message);
            out.println("");
            out.println("");
        }
    }
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    @Override
    public String getServletInfo() {
        return "Short description";
    }
}
4. Соберите приложение в WAR-пакет.
Настроить GlassFish
1. Откройте GlassFish в браузере и войдите в консоль администратора GlassFish, используя учетные данные, которые Jelastic отправил вам при создании среды.
2. Java EE требует, чтобы JMS ConnectionFactory был настроен и доступен для приложения под именем JNDI. Во-первых, перейдите к ресурсам JMS и создайте новую фабрику с именем jms / JMSConnectionFactory с типом javax.jms.QueueConnectionFactory .
3. Выберите gfcluster в качестве цели и сохраните изменения.
4. Перейдите к ресурсам назначения и создайте очередь jms / myQueue с именем Queue с типом javax.jms.Queue . Цель также gfcluster.
Развертывание приложения JMS
1. Перейдите на вкладку « Приложения », загрузите пакет приложения и разверните его в контексте отправки сообщения кластера GlassFish.
2. Запустите приложение JMS в веб-браузере, чтобы проверить результаты.
Как вы можете видеть в приложении, даже сложные приложения работают в Jelastic Cloud как обаяние. Не просто поверьте нам на слово. Попробуйте Jelastic и получите немедленный доступ к бесплатной 2-недельной бесплатной пробной версии !






