从micronaut服务器WebSocket发送异步消息
我正在尝试使用Micronaut(和Groovy)实现简单的WebSocket服务器。我是Micronaut的新手,所以边学边用,似乎需要一些RxJava。所以也要学习这一点 我可以让基本示例正常工作:从micronaut服务器WebSocket发送异步消息,websocket,rx-java,micronaut,Websocket,Rx Java,Micronaut,我正在尝试使用Micronaut(和Groovy)实现简单的WebSocket服务器。我是Micronaut的新手,所以边学边用,似乎需要一些RxJava。所以也要学习这一点 我可以让基本示例正常工作: @CompileStatic @ServerWebSocket("/ws") class TimeseriesWebSocket { @OnOpen public Publisher<String> onOpen(WebSocketSession session) {
@CompileStatic
@ServerWebSocket("/ws")
class TimeseriesWebSocket {
@OnOpen
public Publisher<String> onOpen(WebSocketSession session) {
println("opening connection")
return session.send("Hello")
}
@OnMessage
public Publisher<String> onMessage(String message, WebSocketSession session) {
println("message received")
return session.send("Thanks for the message")
}
@OnClose
public Publisher<String> onClose(WebSocketSession session) {
println("Closing")
//this seems not to be delivered, I guess due to session being closed already
return session.send("OK")
}
}
反压力和值/请求指的是什么,以及处理异步发送消息的实际方式是什么?我希望它只发送我试图发送的单个项目
文档中提到了javax.websocket API,但是
仅仅提供一个聆听的未来似乎更有意义
因此,简短的问题是,如何使用Micronaut Websocket API在Micronaut提供的函数之外以异步模式发送消息?还是我做错了
似乎我对这个API做了一些一般性的错误假设,但无法从文档中找到答案,也找不到示例。我在micronaut v1.3.2中也遇到了同样的问题 我设法让它使用sendAsync/sendSync而不是send 我看过NettyRxWebSocketSession的实现,看起来send的实现与sendAsync有些不同。不清楚这是由于配置问题还是由于send的实现问题
我希望这能有所帮助。是的,我注意到了同样的情况,并使用sendAsync发送消息。这很有效。文档只是有点短,所以我也提交了一些小的更新。我认为send()适用于从Micronaut注释的方法返回它的情况
@CompileStatic
@ServerWebSocket("/ws")
class MyWebSocket {
@OnOpen
public Publisher<String> onOpen(WebSocketSession session) {
println("opening connection")
startPing()
return session.send("Hello")
}
//...(same as above)
public void startPing(WebSocketSession session) {
PingPing ping = new PingPing(session)
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(ping, 0, 1, TimeUnit.SECONDS);
}
}
class PingPing {
WebSocketSession session
public PingPing(WebSocketSession session) {
this.session = session
}
@Override
void run() {
println("pinging..")
try {
session.send("Ping...")
} catch (Exception e) {
e.printStackTrace()
}
}
}
default <T> Publisher<T> send(T message)
def publisher = session.send("Ping...")
publisher.subscribe(new Subscriber<GString>() {
@Override
void onSubscribe(Subscription s) {
println("subscription")
}
@Override
void onNext(GString gString) {
println("next")
}
@Override
void onError(Throwable t) {
println("error")
t.printStackTrace()
}
@Override
void onComplete() {
println("complete")
}
})
println("publisher: ${publisher}")
error
io.reactivex.exceptions.MissingBackpressureException: create: could not emit value due to lack of requests
at io.reactivex.internal.operators.flowable.FlowableCreate$ErrorAsyncEmitter.onOverflow(FlowableCreate.java:438)
at io.reactivex.internal.operators.flowable.FlowableCreate$NoOverflowBaseAsyncEmitter.onNext(FlowableCreate.java:406)
at io.micronaut.http.netty.websocket.NettyRxWebSocketSession.lambda$null$2(NettyRxWebSocketSession.java:191)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:577)