gpt4 book ai didi

通过 Eventbus 的 Java Vert.x 和 SockJS

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:59 24 4
gpt4 key购买 nike

我想将 Vert.x 3.3.2 和 socketJS 与 eventbus 代理一起使用,一劳永逸地忘记 URL,而只是在消息中进行对话,而不创建 REST 接口(interface) - Java 平台上多年来最好的事情!。但是,我的 hello world 无法正常工作。

我的测试如下:在客户端和服务器端的每个连接和断开连接事件上,它都会打印在控制台上。并且,当客户端连接时,客户端会发送一条消息,服务器会对此进行响应,并且服务器也会向每个人发送通知。发生的情况是,只有第一个客户端发送消息并从服务器获得正确的响应。

Java:

public class App extends AbstractVerticle {

public static void main(String[] args) throws InterruptedException {
Vertx.vertx().deployVerticle(MethodHandles.lookup().lookupClass().getName());
}

@Override
public void start() throws IOException {
Router router = Router.router(vertx);
BridgeOptions options = new BridgeOptions();
PermittedOptions address = new PermittedOptions().setAddress("some-address");
options.addInboundPermitted(address);
options.addOutboundPermitted(address);
SockJSHandler sockJSHandler = SockJSHandler.create(vertx).bridge(options, be -> {
if (be.type() == BridgeEventType.REGISTER) {
System.out.println("sockJs: connected");
vertx.eventBus().publish("some-address", "hey all, we have a new subscriber ");
}
be.complete(true);
});
router.route("/sockjs/*").handler(sockJSHandler);
router.route("/web/*").handler(StaticHandler.create("doc/clientSocketJS"));
vertx.createHttpServer().requestHandler(router::accept).listen(8020, listenHandler -> {
if (listenHandler.failed()) {
LOGGER.log(Level.SEVERE, "Startup error", listenHandler.cause());
System.exit(0); // stop on startup error
}
});
vertx.eventBus().consumer("some-address", message -> {
System.out.println("sockJs: received: " + message.body());
message.reply("I received so I reply");
});

}

}

在文件夹doc/clientSocketJS中有一个index.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js"></script>
<script src="js/vertx-eventbus.js"></script>
<script>
var eb = new EventBus('http://localhost:8020/sockjs');
eb.onopen = function() {
console.log('connected');
eb.registerHandler('some-address', function(error, message) {
console.log('received: ' + JSON.stringify(message));
});
eb.send('some-address', {
name : 'from ' + navigator.product
}, null, function(a, message) {
if (message == null) {
console.log("ERROR: response null");
} else {
console.log('response: ', message.body);
}
});
}
eb.onclose = function() {
console.log("disconnected");
eb = null;
};
</script>
</head>
</html>

回复如下:

第一个浏览器客户端已加载:服务器:

sockJs: connected
sockJs: received: hey all, we have a new subscriber
sockJs: received: {"name":"from Gecko"}

客户 1:

connected
response: I received so I reply

这符合预期。然后我加载第二个客户端(相同或其他浏览器):

服务器

sockJs: connected
sockJs: received: hey all, we have a new subscriber
(expecting a 'name' just like first time, but it doesn't appear)

客户端2:

connected
(after a while) ERROR: response null @ index.html::18

出了什么问题?

最佳答案

你的Java代码看起来完全没问题。但 JavaScript 代码看起来像是取自旧示例。
registerHandler 回调的第一个参数是消息本身,而不是错误。
我还使用了托管的 VertxEventBus,而不是提供的,以防万一。

这应该有效:

var eb = new vertx.EventBus('http://localhost:8020/sockjs');
eb.onopen = function() {
console.log('connected');
eb.registerHandler('some-address', function(message) {
console.log('received: ' + JSON.stringify(message));
});
eb.send('some-address', {
name : 'from ' + navigator.product
}, null, function(a, message) {
if (message == null) {
console.log("ERROR: response null");
} else {
console.log('response: ', message.body);
}
});
};
eb.onclose = function() {
console.log("disconnected");
eb = null;
};
    <script src="http://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vertx/2.0.0/vertxbus.min.js"></script>

关于通过 Eventbus 的 Java Vert.x 和 SockJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40707856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com