#stomp #activemq-artemis #stomp-websocket
#топать #activemq-artemis #stomp-websocket
Вопрос:
Адресация продолжительности и настройка очереди сервера Artemis:
<address-settings>
<address-setting match="#">
<auto-create-addresses>false</auto-create-addresses>
<auto-delete-addresses>false</auto-delete-addresses>
<auto-create-queues>false</auto-create-queues>
<auto-delete-queues>false</auto-delete-queues>
</address-setting>
</address-settings>
<addresses>
<address name="test">
<anycast>
<queue name="abc.filter"/>
</anycast>
</address>
</addresses>
Клиент javascript, используемый для подключения к очереди и подписки на сообщение,:
<script src="jquery-3.5.1.min.js"></script>
<script src="stomp.js"></script>
<script>
$(document).ready(function() {
let client = Stomp.client("ws://127.0.0.1:61613");
// this allows to display debug logs directly on the web page
client.debug = function (str) {
console.log(str);
};
// the client is notified when it is connected to the server.
// let headers = {"ack": "client", "selector": "location = 'Europe'"};
let connected = function(frame) {
client.subscribe("/test", function(message) {
$("#messages").append("<p>" message.body "</p>n");
}, {"durable-subscription-name": "filter", "selector": "tag = 'aaa'"});
};
client.connect({"client-id": "abc"}, connected);
});
</script>
Хотя клиент устанавливает selector
для фильтрации сообщения, клиент может получать сообщения с другими тегами, такими как bbb
:
Однако аналогичный селектор эффективен в Java:
class Consumer {
ActiveMQConnectionFactory factory;
Connection connection;
Session session;
Queue queue;
MessageConsumer consumer;
public Consumer() {
try {
factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queue = session.createQueue("test::abc.filter");
consumer = session.createConsumer(queue, "tag='aaa'");
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
System.out.println("C-" tag " RECEIVING > " ((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
connection.start();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
Я хочу спросить selector
, почему не работает в stomp-websocket?
Код для отправки сообщения:
public Producer() {
try {
factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queue = session.createQueue("test::abc.filter");
producer = session.createProducer(queue);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
} catch (Exception e) {
e.printStackTrace();
}
}
public void send(String tag, String msg) {
try {
TextMessage message = session.createTextMessage(msg);
message.setStringProperty("tag", tag);
producer.send(message);
System.out.println("SENDING > " message.getText());
} catch (Exception e) {
e.printStackTrace();
}
}
Комментарии:
1. Почему вы используете FQQN? Я спрашиваю, потому что на самом деле не принято использовать FQQN amp; STOMP.
2. Ваш потребитель JMS использует очередь , которая имеет семантику anycast в брокере. Однако ваш подписчик STOMP использует долговременную подписку, которая в JMS используется для тем, которые имеют многоадресную семантику в брокере. Это кажется странным, и неясно, какой ваш желаемый вариант использования здесь. Можете ли вы уточнить конкретно, что вы пытаетесь сделать?
3. @JustinBertram Спасибо за помощь. Я новичок в MQ, я думаю, что я не использую многоадресную рассылку в STOMP subscriber? В моем сценарии у меня есть некоторые исправленные запущенные службы (например, классификация текста), которым нужны очереди сообщений для получения своих задач и результатов ответов от клиентов difference, поэтому я хочу использовать длительные очереди для выполнения этой роли. Селектор — это идентификатор клиентов. Клиенты разнообразны, поэтому мне нужно STOMP в websocket, чтобы веб-приложение могло использовать эти сервисы.
4. Код для отправки сообщения я добавил в конец сообщения выше