Статьи

Руководство по развертыванию приложений JMS для начинающих

JMS или  Java Messaging Service — это API для обмена сообщениями (обмена информацией между двумя отдельными и независимыми сетевыми объектами) на основе Java EE . Он устанавливает ряд интерфейсов для отправки и получения сообщений. JMS поддерживает две модели обмена сообщениями: PTP или «точка-точка» и «публикация-подписка». Первая модель (PTP) опирается на концепцию очередей сообщений, где ключевыми характеристиками являются один потребитель на сообщение и отсутствие временной зависимости между отправителем и получателем. Модель публикации-подписки — наоборот: несколько потребителей на сообщение и временная зависимость между отправителем и получателем.

Основными преимуществами использования JMS являются:

  • Асинхронный обмен сообщениями (в этом случае все компоненты не должны быть включены, чтобы приложение функционировало в целом).
  • Хранение (сообщения сохраняются от имени получателя, пока он не работает, а затем отправляют их, как только он работает).

Итак, как обычно, давайте попробуем эту технологию в Jelastic Cloud,  используя сервер GlassFish!

Создать среду

1. Войдите в свою учетную запись Jelastic и нажмите Создать среду .

2. Выберите GlassFish в качестве сервера приложений и укажите для него ограничения ресурсов. Затем введите имя своей среды и нажмите « Создать» .

среда приложения jms

Через несколько минут ваша среда появится на Jelastic Dashboard.

Среда JMS с GlassFish

Создать приложение 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 .

JMS Connection Factory

3. Выберите gfcluster в качестве цели и сохраните изменения.

Цель фабрики соединений JMS

4. Перейдите к ресурсам назначения и создайте очередь jms / myQueue с  именем  Queue с типом  javax.jms.Queue . Цель также gfcluster.

JMS целевой ресурс

Развертывание приложения JMS

1. Перейдите на  вкладку « Приложения », загрузите пакет приложения и разверните его в контексте отправки сообщения кластера GlassFish.

Развертывание приложения JMS

2. Запустите приложение JMS в веб-браузере, чтобы проверить результаты.

Приложение JMS

Как вы можете видеть в приложении, даже сложные приложения работают в Jelastic Cloud как обаяние. Не просто поверьте нам на слово. Попробуйте Jelastic и получите немедленный доступ к бесплатной 2-недельной бесплатной пробной версии  !