簡體   English   中英

如何使用 ActiveMQ-Artemis 從 Java 程序向 Javascript STOMP 客戶端發送消息?

[英]How do I send messages from Java program to a Javascript STOMP client using ActiveMQ-Artemis?

我正在嘗試在 Java 進程和瀏覽器 UI 之間來回通信。 為此,我在 Artemis 中配置了一個多播地址。 來自 Java 進程的消息不會發送到使用 StompJS 實現的瀏覽器訂閱者。

為了測試,我用 Java 和 Javascript 編寫了一個 Hello World 類型的程序,以盡可能簡化問題。 兩個程序都會在該地址上啟動消費者,然后向該地址發送 100 條消息。 消費者只是記錄他們收到了消息。

Java 程序接收它產生的所有消息和 Javascript 程序產生的所有消息。 Javascript 程序接收它產生的所有消息,但沒有接收 Java 程序產生的任何消息。

當我使用 Artemis 控制台查看 STOMP 客戶端創建的隊列時,它顯示添加了 200 條消息,100 條已確認,100 條卡在傳遞中。 在此處輸入圖像描述 在此處輸入圖像描述

如果我使用 Artemis 控制台向該地址發送消息,Java 和 Javascript 程序都會收到該消息。

有什么想法我在這里做錯了嗎?

Javascript程序

import { Client } from "@stomp/stompjs"

let client;

export function testStomp() {
    client = new Client();
    client.brokerURL = "ws://messaging-host:7961";
    client.onConnect = handleConnected;
    client.activate();
}

function handleConnected() {
    client.subscribe("broadcastMessage", message => console.log(message.body));
    const message = { destination: "broadcastMessage" };
    for (let i = 0; i < 100; i++) {
        message.body = "Message from javascript " + i;
        client.publish(message);
    }
}

Java程序

package com.whatever;

import org.apache.activemq.artemis.api.core.*;
import org.apache.activemq.artemis.api.core.client.*;
import java.util.UUID;

public class TestArtemis {
    public static void main(String[] args) throws Exception {
        String url = "tcp://messaging-host:7961";
        ServerLocator serverLocator = ActiveMQClient.createServerLocator(url);
        ClientSession session = serverLocator.createSessionFactory().createSession();
        startConsumer(session);
        ClientProducer producer = session.createProducer();
        for (int i = 0; i < 100; i++) {
            String payload = "Message from java " + i;
            ClientMessage message = session.createMessage(false);
            message.getBodyBuffer().writeBytes(payload.getBytes());
            producer.send("broadcastMessage", message);
            Thread.sleep(1000);
        }
    }

    private static void startConsumer(ClientSession session) throws Exception{
        session.start();
        String queueName = UUID.randomUUID().toString();
        session.createQueue(new QueueConfiguration(queueName)
                .setAddress("broadcastMessage")
                .setDurable(false)
                .setRoutingType(RoutingType.MULTICAST)
                .setTemporary(true));
        ClientConsumer consumer = session.createConsumer(queueName);
        consumer.setMessageHandler(message -> {
            byte[] bytes = new byte[message.getBodyBuffer().readableBytes()];
            message.getDataBuffer().readBytes(bytes);
            System.out.println("Received " + new String(bytes));
        });
    }
}

ActiveMQ Artemis 使用content-length標頭來檢測 STOMP 消息類型是二進制還是文本。

要使用文本 STOMP 消息類型,Javascript 程序必須跳過content-length標頭,Java 程序必須生成文本類型的消息,即

Javascript 程序更改:

const message = { destination: "broadcastMessage", skipContentLengthHeader: true };

Java程序:

ClientMessage message = session.createMessage(Message.TEXT_TYPE, false);
message.getBodyBuffer().writeNullableSimpleString(SimpleString.toSimpleString(payload));

要使用二進制 STOMP 消息類型,Java 程序必須生成帶有content-length標頭的消息,即

String payload = "Message from java " + i;
byte[] payloadBytes = payload.getBytes();
ClientMessage message = session.createMessage(false);
message.putIntProperty("content-length", payloadBytes.length);
message.getBodyBuffer().writeBytes(payloadBytes);

暫無
暫無

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

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