带有DeferredResult的春季长轮询

我有一个Spring MVC 3.2应用程序,我需要向此Web服务添加一个Long Polling进行实时聊天。我关注了这篇文章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秒后响应,则我需要服务器当有人写新消息时立即做出响应,而不是在超时过程中做出响应。

回答:

基本上,您必须告诉Tomcat不要超时。为此,您可以编辑server.xmlTomcat文件(在conf目录中)以包含一个asyncTimeout参数。这将告诉您的Tomcat一分钟后超时:

<Connector port="8080" protocol="HTTP/1.1" asyncTimeout="60000"

connectionTimeout="20000" redirectPort="8443" />

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

以上是 带有DeferredResult的春季长轮询 的全部内容, 来源链接: utcz.com/qa/398179.html

回到顶部