当前位置: 首页 > 知识库问答 >
问题:

阻止消息挂起10000以阻止..使用spring websockets

傅自明
2023-03-14

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

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

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

示例:在request中,我们得到了一个参数channel:1这个channel映射到多个ID,比如1映射到1,2,3,4,5

在websocket中,一旦请求到达服务器,我将提取通道,映射所有的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中使用websocket会话发送异步消息的配置是什么

共有1个答案

宰父保臣
2023-03-14

根据我的理解,当异步技术开始使用时,您有多个线程在同一remoteEndpoint上发送消息。

似乎和这个很相似:

WebSocket异步发送可能导致队列填充后阻塞发送

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

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

为此,我只需使用Spring在websocket支持中提供的SimpMessagingTemplate类。要向所需的任何用户发送消息,请执行以下操作:

@Autowired
SimpMessagingTemplate smt;

(.......)
smt.convertAndSendToUser(recipient.getUsername(), "/queue/notify", payload);
  • 进行类实例方法调用(而不是servlet,没有网络传输,您不能更快!只是调用您的业务逻辑/服务/什么)
  • 每次方法返回数据时,请使用上面代码段中的SimpMessagingTemplate:)
  • 如果您愿意,您仍然可以异步地执行此操作!:)

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

要从Spring获得SimpMessagingTemplate,您需要使用 标记或等效的非xml-java-config。

我建议查看这个文档,它有更多的信息:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

下面是我在上面创建的一篇文章(我在文章中遇到了另一个问题,与spring配置和上下文层次结构有关,但至少您有一些模板代码可以查看,这些代码是正常的):

Spring Websocket:未从SimpMessagingTemplate接收任何信息

Spring:如何向根上下文公开SimpMessagingTemplate bean?

 类似资料:
  • 问题内容: 我对Go如何处理非阻塞IO感到困惑。API在我看来基本上是同步的,并且在Go上观看演示时,听到诸如“和调用块”之类的注释并不罕见。 从文件或网络读取时,Go是否使用阻塞IO?还是当在Go Routine中使用某种魔术来重写代码? 来自C#背景,这感觉非常不直观,在C#中,当使用异步API时我们使用了关键字。这清楚地表明,API可以产生当前线程,并在以后的延续中继续。 因此,TLDR;当

  • 有什么方法可以阻止Kafka的消费者在一段时间内消费信息吗?我希望消费者停止一段时间,然后开始消费最后一条未消费的消息。

  • 问题内容: 我正在尝试使用Java学习套接字,并且成功地将数据发送到了在我自己的计算机上运行的ServerSocket。当我尝试使用readline从此套接字读取消息(以便仅回显自己发送的消息)时,程序将挂起并且不会返回。 这是代码: TCPClient是我定义的类,因此在我的家庭作业中使用swing之前,我可以在更简单的界面上测试程序。这是代码: 我的服务器很简单。建立连接后,它将进入此循环并停

  • 问题内容: 这个问题是面向jQuery的,但不一定是排他的。 简短的问题: 同步ajax调用会阻止正常按钮被单击吗? 我的测试表明这没有发生,但也许其他浏览器出了问题。 长的问题: 在我询问的另一个问题中,如何阻止ajax调用(我希望它阻止),这些家伙说浏览器在某些情况下会阻止。 实际上,甚至jQuery 的文档都说: 我正在尝试: 1.了解发生这种情况的方式/原因。 2.评估发生这种情况的可能性

  • 问题内容: Ajax使用回调,因为它是同步的。 我希望对远程URL块的调用直到出现一些答案为止 ,就像在Ajax中一样,但是没有异步部分,或者我要说要进行JAX调用。 是否有任何技术可以使以下事情发生(使用JQuery)(…使用JQuery或其他解决方案): 我只是想知道-想学习。 实际上,有时会阻塞直到回复合适为止。我并不是说要浏览器阻止,而只是脚本运行时。 问题答案: 您可以在使用jQuery