簡體   English   中英

如何將jms消息發送到activeMQ並使用mqttJS正確解碼javascript

[英]How to send a jms message to activeMQ and decode it in javascript with mqttJS properly

我有一個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,這是必需的。

如果tou正在使用mqtt 3.0.0,你應該添加額外的參數:

如果要連接到僅支持MQTT 3.1(不符合3.1.1)的代理,則應傳遞以下附加選項:

 { protocolId: 'MQIsdp', protocolVersion: 3 } 

更新:

切換到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"
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM