首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻止消息挂起10000用于BLOCKING..using spring

阻止消息挂起10000用于BLOCKING..using spring
EN

Stack Overflow用户
提问于 2016-03-30 10:14:37
回答 1查看 6.6K关注 0票数 3

在使用spring时,我面临以下错误:

用例:在我们的服务器端代码中,我们有一个在数据base..if中搜索值的功能-- database..it中不存在的值会击中servlet并得到data..The第二部分--即按servlet并获取数据是异步调用。

因此,对于一个请求,我们必须在数据库中搜索多个东西。

示例:在请求中,我们得到了一个参数通道:1这个通道被映射到多个ids,比如1被映射到1,2,3,4,5

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

代码语言:javascript
复制
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
}

}

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

代码语言:javascript
复制
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]

对不起,如果上述问题的框架不是clear.Will spring支持发送异步消息,比如普通javax做Session.getAsyncRemote().sendText(字符串文本)

spring中使用websocket会话发送异步消息的配置是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 11:48:39

据我所知,当异步技术启动时,有多个线程在同一个RemoteEndpoint上发送消息。

似乎与此非常相似:

WebSocket async send can result in blocked send once queue filled

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

更新

由于您添加了注释,您需要关注速度,而且由于您当前的解决方案似乎不适用,让我们从不同的角度来看看这个问题。

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

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

要做到这一点,我只需在websocket支持中使用Spring提供的SimpMessagingTemplate类。若要向任何用户发送我想要的信息,请执行以下操作:

代码语言:javascript
复制
@Autowired
SimpMessagingTemplate smt;

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

所以,在你的例子中,你可以,在你的循环

  • 进行类实例方法调用(而不是servlet,没有网络传输,您不能更快!)只是给你的业务打个电话--逻辑/服务/什么的)
  • 每次方法返回数据时,都使用SimpMessagingTemplate,如上面的代码片段中所示:)
  • 如果您想要的话,仍然可以异步完成!:)

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

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

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

下面是我创建的帖子--在我使用它的地方--(我在文章中有另一个问题,与spring配置和上下文层次结构有关,但至少您有一些模板代码可以查看,代码正在工作):

Spring Websocket : receiving nothing from SimpMessagingTemplate

Spring : how to expose SimpMessagingTemplate bean to root context ?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36305830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档