【问题标题】:Spring Controller, how to break out of a loop based on a new HttpRequest?Spring Controller,如何根据新的HttpRequest跳出循环?
【发布时间】:2011-11-07 08:04:40
【问题描述】:

我有一个 Spring @Controller。在控制器内部有一个方法,在特定请求进入while循环后,它会检查新数据并仅在找到数据时才中断:

while(System.currentTimeMillis() < end && controllersDataStore.getAutoupdate() == eventAutoUpdate ) {

        gridData = (GenericGrid) dsEventLogService.retrieveNewEventGridRows(gridHelper);
        if(gridData.getAaData().size()==0){
            try {
                Thread.sleep(POLLING_INTERVAL);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        else{
            break;
        }
    }

在某些情况下,即使在特定用户操作后未找到数据,我也需要跳出循环。所以我需要从一个新的 HttpRequest 中,来打破之前的 while 循环。

我还需要这个是每个用户的,所以一个用户不能与另一个用户的操作进行交互。

控制器是单例的,因此它在所有会话中都有共同的属性。这意味着我们不能将状态存储在全局属性中,然后在循环内部检查更改以使其中断,因为这不是每个会话的属性。

除了让控制器拥有会话范围之外,还有什么方法可以做到这一点? (我什至不确定它是否会起作用)。

提前谢谢你,如果有任何提示,我将不胜感激。

【问题讨论】:

  • 会话范围的控制器是解决这个问题的最简单方法,你为什么不愿意尝试?
  • 我很不情愿,因为控制器不应该是会话范围的。我想知道是否有“更好”的解决方案。
  • 谁说的?作用域控制器是一件非常有效的事情。
  • 因为servlet(控制器)由容器管理,容器只实例化一个servlet实例来处理所有用户的请求。将其设置为会话范围违反了整个概念,不是吗?
  • 另外,我找不到关于会话范围控制器的任何信息,这让我相信一定有其他方法可以做到这一点。但话又说回来,也许没有。

标签: java spring controller while-loop session-scope


【解决方案1】:

在数据库配置表中存储一个 keepRunning 值,并在 n 秒后检查它。

不同控制器中的单独请求可以独立于该控制器更新状态变量。

【讨论】:

  • 嗨,我需要每个会话一个变量,我将如何区分用户?
  • 使用 HttpSession 来存储这个 keepRunning 标志。每个用户,内存中,线程安全,并且在集群环境中工作。
  • 对不起,我不明白。如果我将它存储在 HttpSession 中,我将无法从 while 循环内部访问它。因为变量会在不同的请求中被修改,从而在不同的会话实例中。我错了吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多