从micronaut服务器WebSocket发送异步消息

从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) {

我正在尝试使用Micronaut(和Groovy)实现简单的WebSocket服务器。我是Micronaut的新手,所以边学边用,似乎需要一些RxJava。所以也要学习这一点

我可以让基本示例正常工作:

@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)