如果客户端关闭浏览器选项卡,如何停止 spring MVC 控制器的执行?

How to stop the spring MVC controller execution if client close the browser tab?

我正在开发一个网络应用程序,它使用 spring 网络套接字连接向特定用户发送多条消息。 我有一个 spring mvc 控制器,当从客户端接收到 STOMP 时,它开始向用户发送消息。是这样的:

@Controller
public class Controller{
     @Autowired
     private SimpMessagingTemplate template;

     @MessageMapping("/")
     @SendToUser("/queue/user")
     public void myMethod(ClientMessage msg, Principal principal){
          Object myObject = new Object();
          //stuff
          while(true){
               //more stuff
               this.template.convertAndSendToUser(principal.getName(), "/queue/user", myObject);
          }
     }
}

现在我的问题是:有没有办法知道客户端何时关闭(或重新加载)浏览器选项卡? 当客户端关闭选项卡以终止控制器执行时,我想退出 while 循环。 我想通过检查一些东西来停止 while 循环,比如:while(!session.isClose()) 谁能帮我解决这个问题?

如果有人需要,我post我的解决方案。

我真的不知道我做的事情是否正确,但我将 SessionDisconnectEvent 侦听器从特定 class 移到了我的控制器。因此,现在控制器实现了 ApplicationListener 并覆盖了 onApplicationEvent。当用户关闭选项卡时,布尔值设置为 true 并且控制器停止执行。 现在我有这样的东西:

@Controller
public class Controller implements ApplicationListener<SessionDisconnectEvent>{

     @Autowired
     private SimpMessagingTemplate template;

     private boolean disconnected;

     @MessageMapping("/")
     @SendToUser("/queue/user")
     public void myMethod(ClientMessage msg, Principal principal){
          Object myObject = new Object();
          //stuff
          while(!disconnected){
               //more stuff
               this.template.convertAndSendToUser(principal.getName(), "/queue/user", myObject);
          }
     }

     @EventListener
     @Override
     public void onApplicationEvent(SessionDisconnectEvent  applicationEvent) {
          System.out.println("SESSION " + applicationEvent.getSessionId() + " DISCONNECTED");
          this.graphService.setDisconnect(true);
     }
}