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

阻止消息挂起10000以阻止..使用spring WebSocket,websocket,spring-websocket,asynchttpclient,java-websocket,Websocket,Spring Websocket,Asynchttpclient,Java Websocket,使用spring WebSocket时,我遇到以下错误: 用例:在我们的服务器端代码中,我们有一个在数据库中搜索值的功能。如果值在数据库中不存在。它将命中servlet并获取数据。第二部分,即命中servlet并获取数据是异步调用 因此,对于一个请求,我们必须在数据库中搜索多个内容 示例:在请求中,我们得到一个参数通道:1 此通道映射到多个ID,例如1映射到1,2,3,4,5 在websocket中,一旦请求到达服务器,我将提取通道并获得所有id的映射,并在id上运行循环,如下所示: for(i

使用spring WebSocket时,我遇到以下错误:

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

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

示例:在请求中,我们得到一个参数通道:1 此通道映射到多个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
}

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


spring中使用websocket会话发送异步消息的配置是什么?据我所知,当异步技术开始使用时,您有多个线程在同一个远程端点上发送消息

似乎与此非常相似:

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

更新

由于您在评论中添加了一个事实,即您需要关注速度,而且您当前的解决方案似乎不适用,因此让我们从不同的角度来看待这个问题

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

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

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

@Autowired
SimpMessagingTemplate smt;

(.......)
smt.convertAndSendToUser(recipient.getUsername(), "/queue/notify", payload);
因此,在您的情况下,您可以,在循环中

  • 进行类实例方法调用(而不是servlet,没有网络传输,你不能更快!只需调用你的业务逻辑/服务/任何东西)
  • 每次方法返回数据时,请使用SimpMessageTemplate,如上面的代码段所示:)
  • 如果愿意,您仍然可以异步执行此操作!:)
通过这样做,您可以减少延迟(调用servlet会增加很多),并拥有可靠的技术。 您可以根据自己的判断轻松、快速地向一个用户或多个用户发送数千条消息,而不会遇到“10000 for BLOCKING”问题,该问题可能来自多个servlet“回答相同的问题”;)

要从Spring获取SimpMessageTemplate,需要使用
标记或等效的非xml java配置

我建议查看此文档,其中包含更多信息:

下面是我在上面创建的文章,我正在使用它(我在文章中遇到了另一个问题,与spring配置和上下文层次结构有关,但至少您有一些模板代码需要查看,代码正在运行):


我们需要更快的响应时间,因为每秒将有多达2000个请求…因此我们不进行同步Servlet调用…因此我们无法进行同步Servlet调用calls@niilzone..I我已经发布了另一个完整细节的问题。。代码已经在使用(live-in-prod),我们没有使用stom/socket js,还有其他选择吗?使用mininmal配置更改/提取远程端点?嘿@svsteja,我看了你的另一个问题,但我不能完全自信地回答:(我不使用相同的集成类等。我对它进行了投票,因为它看起来是一个好问题,希望这将有助于吸引其他贡献者的注意!如果你“卡住了”针对您的问题,我建议尝试一个只有WebSocket和模拟服务的小项目(或者尝试messagebroker?),以分离关注点并找出问题所在
@Autowired
SimpMessagingTemplate smt;

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