gpt4 book ai didi

java - 使用 HttpServletRequest 对象检查客户端是否处于 Activity 状态

转载 作者:行者123 更新时间:2023-12-01 12:12:44 24 4
gpt4 key购买 nike

我正在编写一个 Spring Web 应用程序,并将“/do”URL 路径映射到以下 Controller 的方法

@Controller
public class MyController
{
@RequestMapping(value="/do", method=RequestMethod.GET)
public String do()
{
File f = new File("otherMethodEnded.tmp");
while (!f.exists())
{
try {

Thread.sleep(5000);

} catch (InterruptedException e) {

}
}

// ok, let's continue
}
}

otherMethodEnded.tmp文件是由另一个 Controller 的方法编写的,因此当客户端调用第二个 URL 时,我希望第一个方法退出 while 循环。

一切正常,除非客户端调用“/do”URL,然后在收到响应之前关闭连接。问题是服务器仍然在 while (!f.exists())即使客户端已关闭并且无法调用第二个 URL 来解锁 while 循环,也会循环。

我会尝试检索“/do”URL 的连接状态,并在客户端关闭连接时退出循环,但我找不到任何方法来执行此操作。

我尝试过 HttpServletRequest.getSession(false) 方法但返回 HttpSession对象始终不为空,因此 HttpServletRequest如果客户端连接关闭,对象不会更新。

如何检查客户端是否仍在等待响应?

最佳答案

验证某些内容不正确的最简单方法是定义一个超时值,然后在循环测试期间等待的时间是否超过了超时。

类似于:

@Controller
public class MyController
{
private static final long MAX_LOOP_TIME = 1000 * 60 * 5; // 5 minutes? choose a value

@RequestMapping(value="/do", method=RequestMethod.GET)
public String do()
{
File f = new File("otherMethodEnded.tmp");
long startedAt = System.currentTimeMillis()
boolean forcedExit = false;
while (!forcedExit && !f.exists())
{
try {
Thread.sleep(5000);
if (System.currentTimeMillis() - startedAt > MAX_LOOP_TIME) {
forcedExit = true;
}
} catch (InterruptedException e) {
forcedExit = true;
}
}

// ok, let's continue

// if forcedExit , handle error scenario?
}
}

此外:InterruptedException 不是盲目捕获和忽略的东西。请参阅this discussion

就你而言,如果你被打断,我真的会退出 while 循环。

只有当您注意到写入的输出流(response.outputstream)已关闭时,您才知道客户端是否不再等待您的连接。但没有办法检测到它。(详情请参阅this question)

鉴于您已表示您的客户端偶尔会进行回调,因此您可以在客户端轮询是否已完成其他调用。如果其他调用已完成,则执行该操作,否则直接返回并让客户端再次执行调用。 (假设您正在发送 json,但根据需要进行调整)

类似的东西

public class MyController
{
@RequestMapping(value="/do", method=RequestMethod.GET)
public String do()
{
File f = new File("otherMethodEnded.tmp");
if (f.exists()) {
// do what you set out to do
// ok, let's continue


// and return with a response that indicates the call did what it did
// view that returns json { "result" : "success" }
return "viewThatSIgnalsToClientThatOperationSucceeded";
} else {
// view that returns json: { "result" : "retry" }
return "viewThatSignalsToClientToRetryIn5Seconds";
}
}
}

然后客户端会运行如下内容:(pseudojavascript,因为已经有一段时间了)

val callinterval = setInterval(function() { checkServer() }, 5000);

function checkServer() {
$.ajax({
// ...
success: successFunction
});
}

function successFunction(response) {
// connection succeeded
var json = $.parseJSON(response);
if (json.result === "retry") {
// interval will call this again
} else {
clearInterval(callinterval);
if (json.result === "success") {
// do the good stuff
} else if (json.result === "failure") {
// report that the server reported an error
}
}
}

当然,这只是半严肃的代码,但如果我有依赖性,这大致是我尝试的方式。如果这是关于文件上传,请记住该文件可能尚未包含所有字节。文件存在!=文件=完全上传,除非您使用移动它。 cp/scp/等不是原子的。

关于java - 使用 HttpServletRequest 对象检查客户端是否处于 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27187418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com