在使用spring时,我面临以下错误:
用例:在我们的服务器端代码中,我们有一个在数据base..if中搜索值的功能-- database..it中不存在的值会击中servlet并得到data..The第二部分--即按servlet并获取数据是异步调用。
因此,对于一个请求,我们必须在数据库中搜索多个东西。
示例:在请求中,我们得到了一个参数通道:1这个通道被映射到多个ids,比如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]对不起,如果上述问题的框架不是clear.Will spring支持发送异步消息,比如普通javax做Session.getAsyncRemote().sendText(字符串文本)
spring中使用websocket会话发送异步消息的配置是什么?
发布于 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类。若要向任何用户发送我想要的信息,请执行以下操作:
@Autowired
SimpMessagingTemplate smt;
(.......)
smt.convertAndSendToUser(recipient.getUsername(), "/queue/notify", payload);所以,在你的例子中,你可以,在你的循环:
通过这样做,可以减少延迟(调用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 ?
https://stackoverflow.com/questions/36305830
复制相似问题