java - 长轮询 杀死服务器端的线程

标签 java spring jakarta-ee

早上好/晚上好,

我正在通过 ajax-java 实现客户端-服务器之间的长池化。长轮询在客户端正常工作,每 30 秒抛出一个新连接,并中止前一个连接。但问题是,在服务器端,所有这些请求/线程都保持 Activity 状态,直到我们有东西返回给客户端。但就像我说的,客户可能不再听了。这里有一些代码:

客户:

     // Long Polling (Recommened Technique - Creates An Open  Connection To Server ∴ Fast)
  (function poll(){
    var tenantName = $("#tenantName").val();
    $.ajax({
    method:"GET",
    url: "url",
    success: function(data){
        if (data === true) {
            bootbox.alert("Page has been modify <a href='javascript:void(0)' onclick='reload()'>reload</a>");
        }
     }, dataType: "json", complete: poll, timeout: 60000 });
})();

服务器:

       /**
 * @return
 */
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public Boolean getSubStepStatus(@RequestParam("subStep") String subStep,
                                @RequestParam("tenantId") String tenantId) {
    if (!isInStep(subStep, tenantId)) {
        tenantsInStep.get(subStep).add(tenantId);
    }
    while (true) {
        String modifierTenantId = stepModifyByTenant.get(subStep);
        if (modifierTenantId != null && !modifierTenantId.equals(tenantId) && !isInStep(subStep, tenantId)) {
            tenantsInStep.get(subStep).remove(tenantId);
            return true;
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

问题就像我说的所有线程在服务器端每 30 秒都在增长,我使用这种技术做错了什么?

最佳答案

Thread.sleep(1000);

这不是 Java 中进行长轮询的方法。方法是将请求踢入异步模式,注册监听器,并放弃工作线程。

关于java - 长轮询 杀死服务器端的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29339821/

相关文章:

java - 有没有类似于Android Market上的bug报告系统的bug报告库?

java - JSOUP 不支持的字符集异常

java - DDD、域实体/VO 和 JPA

java - 多模块 Spring Boot 配置

java - 在 eventStartTime 三天前发送电子邮件

java - Hibernate Persistencebag 从列表中删除元素

java - 在相册或图库中创建一个文件夹,如 WhatsApp 图像、WhatsApp 视频

java - J2EE 容器允许直接服务器套接字吗?

mysql - 如何使用hibernate实体管理器在spring boot中调用带有输出参数的MySQL存储过程

java - 在初始化静态变量期间调用 Singleton EJB