我在示例的底部创建了一个运行在端口3000上的小型服务器。您可以通过“ htto:// localhost:3000 /
time”访问它。整个请求包含两个中间件。第一个“ cancelHandler”和第二个“ otherHandler”被调用-在4秒钟后响应一些虚拟数据。
对我的问题: 当我在浏览器中请求页面,然后取消请求时(在4秒之前)。服务器仍在后台处理goroutine
/请求。我已经花了几个小时在Google上找到解决方案,但是我无法将自己的想法笼罩在上下文中。(context.WithCancel())我得到我必须创建一个chan并聆听它,但是这如何处理请求。那已经是一个goroutine,我是否必须在请求/
goroutine中创建另一个goroutine?另外一个问题是,我应该真的使用Context还是使用cancelNotifier来解决问题?
也许有人可以为我和其他有相同理解问题的人描述它。
解决方案应该是当浏览器取消请求时,取消处理程序将停止goroutine /请求。
非常感谢您的宝贵时间!
package main
import (
"log"
"net/http"
"time"
"fmt"
)
func otherHandler(format string) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
time.Sleep(time.Duration(4)*time.Second)
tm := time.Now().Format(format)
w.Write([]byte("The time is: " + tm))
fmt.Println("response:", "The time is: "+tm)
}
return http.HandlerFunc(fn)
}
func cancelHandler(h http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
fmt.Println("start: called cancelHandler")
h.ServeHTTP(w, r)
fmt.Println("end: called cancelHandler")
}
return http.HandlerFunc(fn)
}
func main() {
mux := http.NewServeMux()
th := otherHandler(time.RFC1123)
mux.Handle("/time", cancelHandler(th))
log.Println("Listening...")
http.ListenAndServe(":3000", mux)
}
“停止”功能的唯一方法是从其返回。因此,time.Sleep无法中断。改用select语句:
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
http.ListenAndServe(":3000", otherHandler(time.RFC1123))
}
func otherHandler(format string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
select {
case <-time.After(4 * time.Second):
// time's up
case <-r.Context().Done():
// client gave up
return
}
tm := time.Now().Format(format)
w.Write([]byte("The time is: " + tm))
fmt.Println("response:", "The time is: "+tm)
}
}
通常,在战略位置检查请求上下文(或从中派生的请求上下文)。如果上下文已取消,则不要继续操作和return
。
我试图建立一个基本的网页,允许用户在数据库的mysql表中添加一行,以便打开LED灯和使用arduino。然而,当我尝试提交表单时,页面返回500状态,mysql查询没有执行。我在我的电脑上运行linux-apache-mysql-php服务器。为什么会这样?
在终端上,我得到了这个错误:$./asadmin start-domain domain1 找不到默认的域目录。此系统属性没有值:com.sun.aas.domainsroot命令启动-域失败。 在Eclipse上,我得到了这个运行时异常:在Felix平台上启动GlassFish 玻璃鱼4 拜托,你知道怎么解决这个问题吗?
如何在reactor netty服务器中读取请求正文?我想让请求主体确定响应的内容,但在示例代码中找不到这样的示例。 例外 block()/blockFirst()/blockLast()正在阻塞,这在线程reactor-http-nio-2中不受支持 调用者 卷曲http://127.0.0.1:45441/test1/test-d“12312321312”-i-H“内容类型:应用程序/json
我在第三方服务器上有一个在线表单,提交数据使用标准的HTTP POST请求发送到我的Cold融合页面。我需要在. cfm页面中检索表单数据并插入到数据库中。我使用requestcatcher.com,我可以看到下面的帖子请求数据格式: POST /testHTTP/1.1主机:mytest.requestcatcher.com连接:保持-存活内容-长度:1198内容-类型:多部分/表单-数据;边界
我只是想了解如何在Java中编写一个每请求线程的TCP服务器。我已经编写了一个每连接线程的服务器,它运行serverSocket.accept()并在每次新连接进入时创建一个新线程。 如何将其修改为每请求线程服务器?我想传入的连接可以放入某种队列中,但是您如何知道哪个连接发出了请求&准备好了服务呢? 我怀疑NIO在这里是必要的,但不确定。 多谢了。 [编辑] 明确一点--原来的“服务器”只是我编写
XMLHttpRequest 对象用于和服务器交换数据。 向服务器发送请求 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:xmlhttp.open("GET","ajax_info.txt",true); xmlhttp.send(); 方法 描述 open(method,url,async) 规定请求的类型、URL 以及是否异步处理