Я устанавливаю кластер EAP 7 в автономном режиме. Я следовал этому учебнику и настроил свой кластер.
Затем я начал тестировать систему JMS с помощью простого приложения JMS. Каждый раз, когда я отправляю сообщение JMS, я наблюдаю, что счетчик сообщений JMS обновляется только в одном из узлов (вместо обоих узлов, показанных в видео). Общее количество отправленных сообщений равно сумме отсчетов с обоих узлов.
Однако, поскольку узлы сгруппированы, я ожидаю, что статистика JMS будет синхронизирована (что показано на видео), поэтому оба узла должны отображать общее количество сообщений, полученных в кластере, а не только их часть.
Кроме того, при отправке запланированного сообщения, если узел, содержащий сообщение, умирает, сообщение блокируется до перезапуска мертвого узла. Это определенно недопустимо, так как я ожидаю, что запланированное сообщение будет доставлено другим (работающим) узлом.
Все тесты выполняются с использованием standalone-full-ha.xml по умолчанию
Вот все шаги, чтобы воспроизвести проблему:
Настройка среды
- Загрузите eap7.1 / 7.2 или wildfly12 / 14 и разархивируйте в каталог
- переименуйте каталог в my-dir-node1
- скопировать ваш-dir-node1 в my-dir-node2
- Обновление конфигурации
- перейдите в my-dir-node1 / standalone и скопируйте standalone-full-ha.xml в standalone-full-ha-test.xml
- edit my-dir-node1 / standalone / standalone-full-ha-test.xml
- добавить имя = "узел1" к корневому элементу:
<server xmlns="urn:jboss:domain:5.0" name="node1">
- найдите
<cluster password="${jboss.messaging.cluster.password:CHANGE ME!!}"/>
и замените его на <cluster password="${jboss.messaging.cluster.password:mypassword}"/>
- добавить
<jms-queue name="JMSTest" entries="java:/jms/queue/test"/>
после <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
- Перейдите в my-dir-node2 / standalone и повторите вышеуказанные шаги. убедитесь, что вы называете его сервером "node2" вместо "node1"
Разверните тестовое приложение, скопировав test-jms.war в my-dir-node1 / standalone / deploy и your-dir-node2 / standalone / deploy
содержимое моего тестового приложения
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.jms.*" %>
<%@ page import="java.util.logging.Logger" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
Logger logger = Logger.getLogger("JMSSender");
InitialContext initialContext = new InitialContext();
ConnectionFactory factory = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
Destination destination = (Destination)initialContext.lookup("java:/jms/queue/test");
Connection connection = factory.createConnection();
Session session1 = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session1.createProducer(destination);
String body = request.getParameter("message");
if (body == null)
body = "Hello World!";
TextMessage message = session1.createTextMessage(body);
String delay = request.getParameter("delay");
if (delay != null)
message.setJMSDeliveryTime(System.currentTimeMillis() + Integer.parseInt(delay));
messageProducer.send(message);
logger.info("Send message: " + body);
%>
<html>
<head>
<title>Test JMS Sender</title>
</head>
<body>
<h1>Message</h1>
<p><strong><%=body%></strong></p>
<p>Add ?message=xxx to the url to change the message.</p>
<p>Add ?delay=xxx to the url to schedule a delivery at a later time. The unit of delay is in millisecond. ie: 1 second = 1000 </p>
</body>
</html>
JMS-приемник:
import org.apache.log4j.Logger;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(mappedName = "testQueue", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")
, @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
, @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/test")
})
public class JMSReceiver implements MessageListener {
// Logger for the class
private static Logger logger = Logger.getLogger(JMSReceiver.class.getName());
@Override
public void onMessage(Message message) {
TextMessage t = (TextMessage) message;
try {
logger.info(t.getText());
} catch (JMSException e) {
logger.info(e.getMessage());
}
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>