客户端发送请求, java后端有耗时任务,web服务器如nginx返回服务端超时信息,会中断后端请求处理吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了客户端发送请求, java后端有耗时任务,web服务器如nginx返回服务端超时信息,会中断后端请求处理吗相关的知识,希望对你有一定的参考价值。

比如前端发送一个合并大文件的请求,java接收到进行处理,但是nginx设置的请求超时时间小于java对请求的处理时间,从而返回给客户端服务端处理超时的状态码,这样会中断java对这个请求的处理吗?
个人觉得应该不会, 但是求有经验的给个肯定或者答案

不会终止。
超过nginx超时时间,那么请求断开,但是未超过java处理超时时间,所以会等到java执行超时后处理结束。
参考技术A 后端的处理并不会因为nginx超时而结束的
nginx的超时是断开了客户端和nginx之间的链接,并不会告知后端的服务,再者nginx也没有那个能力去中断后端正在执行的任务,它就是个中转代理,只是个"传话的"

有没有办法在没有客户端/前端帮助的情况下在后端有一个带有 setInterval 的 GET 请求?

【中文标题】有没有办法在没有客户端/前端帮助的情况下在后端有一个带有 setInterval 的 GET 请求?【英文标题】:Is there a way to have a GET request with setInterval on the backend without the help of the client side/frontend? 【发布时间】:2020-06-28 08:31:58 【问题描述】:

我有这个从第三方 api 获取数据的 GET 请求。我想每隔 5-10 分钟左右检查一次是否有新数据。现在我的后端有这个设置。

exports.get_alerts = async (req, res) => 
  const alertsUrl = `https://www.g2smart.com/g2smart/api/alert?cpo=$req.params.cpo&status=Opened&limit=10&page=1`;
  const axios = require("axios");
  const auth = await refreshToken;
  const currTime = moment().subtract(1, "days").format("X");
  const newAlertsData = [];

  const availableUsers = await axios.get(
    "http://localhost:5000/api/schedule/available"
  ) ....

在前端我有这个代码来向我的警报 api 端点发送一个获取请求。

 getAlerts = async () => 
    axios
      .get("/api/alerts/total_fr_hpc")
      .then((response) => console.log(response.data))
      .catch((err) => console.log(err));
  ;

  timer = (time) => 
    const date = new Date(time);
    return `$date.getHours():$date.getMinutes():$date.getSeconds()`;
  ;

  componentDidMount() 
    this.alertsInterval = setInterval(this.getAlerts, 900000);
  

  componentWillUnmount() 
    clearInterval(this.alertsInterval);

我的问题是我可以只在后端完成所有这些吗?我读了一些关于 websockets 的文章,但这似乎只是为了后端和前端之间的连续 2way 连接。

我想在节点/快递服务器上对我的第三方 api 有类似的东西,要么以设定的时间间隔获取数据,要么连续连接检查新数据,而不必从我的前端发出 GET 请求。即使没有人登录到客户端,我也希望能够获取新数据并将其存储到 MongoDB。

我希望用户获得的数据始终是最新的,而无需至少一个人登录来触发 GET 请求。

这就是我的 node/express 服务器当前的设置方式

const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const passport = require("passport");
const cors = require("cors");
const path = require("path");


const indexRouter = require("./routes/index");
const apiRouter = require("./routes/api"); //Import routes for "api" area of site

const app = express();

// CORS Middleware

app.use(cors());
app.options("*", cors());
// Bodyparser middleware
app.use(
  bodyParser.urlencoded(
    extended: false,
  )
);
app.use(bodyParser.json());

// DB Config
const db = require("./config/keys").mongoURI;

// Connect to MongoDB
mongoose
  .connect(db, 
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  )
  .then(() => console.log("MongoDB successfully connected"))
  .catch((err) => console.log(err));

// Passport middleware
app.use(passport.initialize());

// Passport config
require("./config/passport")(passport);

// Routes
// Add api routes to middleware chain.
app.use("/", indexRouter);
app.use("/api", apiRouter);

// Serve static assets (build folder) if in production
if (process.env.NODE_ENV === "production") 
  // Set static folder
  app.use(express.static("client/build"));

  app.get("*", (req, res) => 
    res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
  );


const port = process.env.PORT || 5000;

app.listen(port, "0.0.0.0", () =>
  console.log(`Server up and running on port $port !`)
);

【问题讨论】:

【参考方案1】:

我不熟悉 axios,因为我总是使用原生 fetch API。也许the isomorphic fetch 可以提供帮助。

【讨论】:

fetch 和 axios 做同样的事情。那不是我的问题。我想从后端在 setInterval 处执行这些请求,而不是从前端触发它。 要在节点而不是浏览器中使用 fetch,请使用 node-fetch。当浏览器代码和节点代码都存在于同一个项目中时,我建议使用isomorphic unfetch。

以上是关于客户端发送请求, java后端有耗时任务,web服务器如nginx返回服务端超时信息,会中断后端请求处理吗的主要内容,如果未能解决你的问题,请参考以下文章

java web基础

java web基础

Spring Boot - 异步任务

Web开发之旅--Flask使用Celery执行异步任务

客户端发送的请求在语法上不正确 Java ZonedDateTime 后端

有没有办法在没有客户端/前端帮助的情况下在后端有一个带有 setInterval 的 GET 请求?