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

Spring长轮询与延迟结果

柳英资
2023-03-14

我有一个Spring MVC 3.2应用程序,我需要在此Web服务中添加一个长轮询以进行实时聊天。我关注了这篇文章Spring MVC 3.2 Preview: Chat Sample。

TopicRestController:

 private final Map<DeferredResult<String>, Long> chatRequests =
            new ConcurrentHashMap<DeferredResult<String>, Long>();

 @RequestMapping(value="/{topicId}/updates" , method=RequestMethod.POST)
public @ResponseBody DeferredResult<String> isNewTopic(
        @PathVariable Long topicId,
        Model model, HttpSession session,
        @RequestParam(required = true) String data) throws InterruptedException, CircularDefinitionException{
    logger.info("New long polling request "+topicId);
    final DeferredResult<String> result = new DeferredResult<String>();
    this.chatRequests.put(result, topicId);

    result.onCompletion(new Runnable() {
        @Override
        public void run() {
            chatRequests.remove(result);
            logger.info("Remove request from queue!");
        }
      });

        Timestamp timestamp = new Timestamp(Long.valueOf(data)*1000L);
        String updates = talkService.findNewTopicResponce(topicId,timestamp);
        if (!updates.isEmpty()) {
            result.setResult(updates);
        }

    return result;
}

@RequestMapping(value= "/{categoryId}" + "/addAnswer", method=POST) 
public @ResponseBody Map respTopic(
        @PathVariable Long categoryId,
        @RequestParam String msg,
        @RequestParam(required = false) String imageUrl,
        @RequestParam(required = false) String title,
        @RequestParam long talkId,
        HttpServletRequest request
        ) throws CircularDefinitionException, MessagingException,TalkNotExistException{
     ........................
    for (Entry<DeferredResult<String>, Long> entry :  this.chatRequests.entrySet()){
                            if(entry.getValue().equals(talkId)){        
                                entry.getKey().setResult(""+talkId);
                            }
                        }

    }

现在的问题是:

当我调用“/{topicId}/updates”时,如果在30秒后没有任何答案,服务器返回错误500,如果有人写了一条消息,服务器返回正确的消息,但服务器总是在30秒后响应,我需要服务器在有人写新消息时立即响应,而不是在超时过程中。

共有1个答案

陈飞语
2023-03-14

我只是遇到了同样的问题,我遇到了这个类似的问题:长轮询时10秒后Tomcat 7服务器错误

基本上,你必须告诉Tomcat不要超时。您可以通过编辑<code>服务器来完成此操作。xmlTomcat文件(在<code>conf参数。这会告诉Tomcat在一分钟后超时:

使用值-1告诉Tomcat永远不要超时。

 类似资料:
  • 在我的控制器中,我返回由另一个线程填充的延迟结果: FooController.java 页面准备者.java 显然,再次调用所有筛选器以“完成”请求。我的一个过滤器,需要访问 豆,这是请求范围的。该调用引发异常 查看我配置的异常: 但是没有区别。我该怎么解决这个问题?

  • 问题内容: 我们需要编写一个Node.js函数,该函数轮询某个API端点以获取先前请求的计算结果。结果需要一个随机的时间才能生成,而可能根本不生成。我们希望尽快得到它,但是我也不想等待太久,这意味着在一定数量的API调用之后,我们希望函数失败(拒绝Promise)。 我们的代码和API之间存在一种通信方式。 这是正确的方法吗? 问题答案: 否。这是构造函数antipattern的async/awa

  • 我想测量和比较长轮询和WebSocket之间的服务器性能。我用ratchet(PHP websockets)构建了一个简单的PHP应用程序,它只在控制台中输出数据(指南:http://socketo.me/docs/hello-world)。长轮询应用程序也是PHP,只生成随机数并将其记录在控制台中(本文:如何实现基本的“长轮询”?)。 有没有办法在不使用数据库的情况下对这些应用程序进行公平的比较

  • 我想在Spring Boot中遇到下面的用例。 我有一个第三方REST API,如果有任何东西要返回,它会尽快返回响应,或者花10秒钟发送空白响应。 我需要连续调用这个API,这意味着如果API返回响应,将该响应发送到进程,然后再次调用该API,这意味着我需要长时间轮询该API,但没有时间间隔,一旦我得到响应,就再次轮询。 我要独立线程处理响应。 这不是web应用程序。我只想用纯java(spri

  • 问题内容: 我最近在StackOverflow上问了一个有关我的功能的问题,人们建议我使用Ajax Long Polling。我花了几天的时间研究该主题,并尝试编写基本的长轮询代码,但是这些代码都没有起作用,而且我什么也做不了。 这是我的基本功能: 有人能够告诉我如何将其转变为基本的长轮询功能,或者甚至直接指向我需要到达的路径。很感谢任何形式的帮助。谢谢! 问题答案: 通常(即,当不使用长时间轮询

  • 长轮询在GCP PubSub JS SDK上可用吗? 我希望能够同时处理多个PubSub消息,例如: 这是它将如何在AWS上工作的一个示例: SQS队列包含超过5条消息。 侦听器将在单个中一次获得5条消息。事件