gpt4 book ai didi

websocket - 使用 spring websockets 阻止消息等待 10000 等待 BLOCKING..

转载 作者:行者123 更新时间:2023-12-03 19:53:32 24 4
gpt4 key购买 nike

我在使用 spring websockets 时遇到以下错误:

用例:在我们的服务器端代码中,我们具有在数据库中搜索值的功能。如果数据库中不存在这些值。它将命中一个 servlet 并获取数据。第二部分,即命中servlet和获取数据是异步调用。

因此对于一个请求,我们必须在数据库中搜索多项内容..

示例:在请求中我们得到了一些参数 channel :1此 channel 映射到多个 id,比如 1 映射到 1,2,3,4,5

在 websocket 中,一旦请求到达服务器,我将提取 channel 并获取所有 id 的映射并在 id 上运行一个循环,如下所示:

for(int i=0;i<ids.length;i++)
{

SomeObject databaseRespObj=callToDatabase(i); //SomeObject contains two fields value exists and string values

if(!databaseRespObj.valuesExists)
{
AsynchronouscallToServelt(i);
//once response received it will send message immediately using session
}

}

在执行上述服务器端代码时,有时只有我会遇到以下错误。

java.lang.IllegalStateException: Blocking message pending 10000 for BLOCKING
at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.lockMsg(WebSocketRemoteEndpoint.java:130) ~[websocket-common-9.3.8.v20160314.jar:9.3.8.v20160314]
at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.sendString(WebSocketRemoteEndpoint.java:379) ~[websocket-common-9.3.8.v20160314.jar:9.3.8.v20160314]
at org.springframework.web.socket.adapter.jetty.JettyWebSocketSession.sendTextMessage(JettyWebSocketSession.java:188) ~[spring-websocket-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:105) ~[spring-websocket-4.2.4.RELEASE.jar:4.2.4.RELEASE]

很抱歉,如果问题的上述框架不清楚。spring 是否会像普通 javax websocket 那样支持发送异步消息 Session.getAsyncRemote().sendText(String text)

spring中使用websocket session发送异步消息的配置是怎样的

最佳答案

据我了解,您有多个线程在同一个 RemoteEndpoint 上发送消息当异步技术开始时。

看起来很像这个:

WebSocket async send can result in blocked send once queue filled

我不认为您必须必须使用上述帖子中描述的 Futures 或机制。我真正不明白的是:为什么对 servlet 进行异步调用?当然,几个人可以在同一个 RemoteEndPoint 上发送消息..但是,您不能简单地对相关类进行同步调用,并保持与在数据库中找到记录时使用的相同的请求-响应流程吗? :)

更新

既然您在评论中添加了您需要关注速度的事实,并且由于您当前的解决方案似乎不适用,那么让我们从不同的角度来看问题。

我不是 websocket 专家,但据我了解,您尝试通过异步 servlet 调用实现的目标是不可能的。但是,如果您更改项目的设计/配置,这应该是可以实现的。

我个人使用 Websockets 能够向任意用户发送消息,不一定发出请求 - 只要他连接,他就必须得到消息。

为此,我只需使用 Spring 在其 websocket 支持中提供的 SimpMessagingTemplate 类。要向任何我想要的用户发送消息,我会这样做:

@Autowired
SimpMessagingTemplate smt;

(.......)
smt.convertAndSendToUser(recipient.getUsername(), "/queue/notify", payload);

所以在你的情况下,你可以在你的循环中:

  • 进行类实例方法调用(而不是 servlet,没有网络传输,你不可能更快!只需调用你的业务逻辑/服务/其他)
  • 每次方法返回数据时,像上面的代码片段一样使用 SimpMessagingTemplate :)
  • 如果你愿意,你仍然可以异步进行! :)

通过这样做,您可以减少延迟(调用 servlet 会增加很多),并拥有可靠的技术。您可以根据自己的判断轻松快速地向一个用户或多个用户发送数千条消息,而不会遇到“10000 条阻塞”问题,该问题可能来自多个 servlet“回答相同的问题”;)

要从 Spring 获取 SimpMessagingTemplate,您需要使用 <websocket:message-broker>标记或等效的非 xml-java-config。

我建议查看此文档,其中包含更多信息: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

以及我在 SO 上创建的以下帖子,我正在使用它(我在帖子中遇到了另一个问题,与 spring 配置和上下文层次结构相关,但至少你有一些模板代码要看,代码是工作):

Spring Websocket : receiving nothing from SimpMessagingTemplate

Spring : how to expose SimpMessagingTemplate bean to root context ?

关于websocket - 使用 spring websockets 阻止消息等待 10000 等待 BLOCKING..,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36305830/

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