[英]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.