Как правильно отправить сообщение jms в activeMQ и правильно декодировать его в javascript с помощью mqttJS - PullRequest
5 голосов
/ 24 мая 2019

У меня есть Java-бэкэнд, где я могу отправлять сообщения по темам через

jmsTemplate.convertAndSend("topic", "Hello World!");

В моем интерфейсе javascript я использую mqttJS для подключения к activeMQ и получения массажа:

    let mqtt = require('mqtt')
    let options ={
        clientId:"test",
        username:"username",
        useSSL: true,
        password:"password",
        clean:true};
    let client  = mqtt.connect(
        'wss://someUrl.com:61619',
        options);

    client.on('connect', function () {
        client.subscribe('myTopic', function (err) {
            if (!err) {
                console.log("successfully connected to myTopic'");
            }
        })
    });

    client.on('message', function (topic, message) {
        console.log(message.toString());
    });

Сообщение, которое я получаю от бэкэнда, выглядит примерно так:

S�A S�)�x-opt-jms-destQ�x-opt-jms-msg-typeQ Ss�   f    
�/ID:myID@�topic://myTopic@@@@�  j��< St�
e Sw�  Hello World!

Мое сообщение "Hello World!" есть. Но и куча нечитаемых в, я бы догадался из шапки.

Я пробовал разные MessageConverters на стороне сервера и разные парсеры на стороне интерфейса. Ничего не работает.

Что мне нужно сделать, чтобы получить просто "Hello World!" как сообщение? Или есть лучший способ отправить сообщение, используя jms, который требуется.

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Обновление:

После перехода на ActiveMQ Artemis с поддержкой JMS 2 он прекрасно работает без каких-либо регулярных выражений.

Старый пост:

Так как я этого не делалнайти любое решение, чтобы отфильтровать тело сообщения или отправить сообщение без заголовка (связанный, неотвеченный вопрос здесь: Как отправить простой текст JmsMessage с пустым заголовком ), решение было отправить объект JSON и фильтрв синтаксисе JSON во внешнем интерфейсе с регулярным выражением.

Внутренний интерфейс:

private void sendHelloWorld() {
    Map<String, String> subPayload = new HashMap<>();
    subPayload.put("test1", "value2");
    subPayload.put("test2", "value3");
    Map<String, Object> payload = new HashMap<>();
    payload.put("message", "Hello World!");
    payload.put("context", "Something");
    payload.put("map", subPayload);
    jmsTemplate.setMessageConverter(new MappingJackson2MessageConverter());
    jmsTemplate.convertAndSend( "notification/prediction", payload );
}

Внешний интерфейс:

client.on('message', function (topic, message, packet) {
    const regex = /\{(.*)\}$/g;
    const match = message.toString().match(regex);
    if(null === match) {
        console.error("Could not parse message");
        console.log('message', message.toString());
    }
    const json = JSON.parse(match[0]);
    console.log('message', json);
});

Результат будет:

{
  "message":"Hello World!", 
  "context":"Something",
  "map": {
     "test1":"value2",
     "test2":"value3"
   }
}
0 голосов
/ 28 мая 2019

Если вы используете mqtt 3.0.0 , вы должны добавить дополнительные параметры:

Если вы подключаетесь к брокеру, который поддерживает только MQTT 3.1 (не совместим с 3.1.1), вы должны передать следующие дополнительные параметры:

{
   protocolId: 'MQIsdp',
   protocolVersion: 3
 }
...