Ktor 应用程序接收 POST json 主体时卡住

发布于 2025-01-12 11:47:33 字数 3184 浏览 3 评论 0原文

我们正在使用 Ktor 开发后端应用程序。该应用程序部署在 Tomcat 服务器版本 9.0.38 上。

该应用程序有一个 POST 路由,用于处理 HTTP POST 请求。在内部,它尝试接收 json 正文并将其映射到 RouteSignalNotificationResponse 数据类。经过一些测试,我们发现在这一行请求被卡住并且之后没有执行任何内容。

post("/createSignalNotification") {
    val signalResponse = call.receive<RouteSignalNotificationResponse>()
    ...
}

RouteSignalNotificationResponse 类如下所示:

@Serializable
data class RouteSignalNotificationResponse(
    @SerialName("p1")
    val title: String,
    @SerialName("p2")
    val message: String,
    @SerialName("p3")
    val firstParameter: Int,
    @SerialName("p4")
    val secondParameter: Int
)

请求标头中的 Content-Type 为“application/json”。

如果我们删除“call.receive”行并模拟 RouteSignalNotificationResponse 数据,那么之后的一切都会正常。

我们使用以下版本:

ktor_version=1.6.7
kotlin_version=1.5.31
logback_version=1.2.9
koin_version=3.1.4
oracle jdk 17

在服务器端,加载库后我们没有任何错误消息,但日志显示以下问题:

----------> Parent Classloader:
java.net.URLClassLoader@45283ce2

08-Mar-2022 15:47:41.945 FINE [pool-7-thread-1] 
org.apache.catalina.loader.WebappClassLoaderBase.loadClass   Loading class from local 
repository
08-Mar-2022 15:47:44.648 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.getResource getResource()
08-Mar-2022 15:47:44.649 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.findResource     findResource()
08-Mar-2022 15:47:44.649 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.findResource     --> Returning 
'file:/opt/tomcat/apache-tomcat-9.0.58/webapps/com.zohoinvest.api-0.0.1/WEB- 
INF/classes/'
08-Mar-2022 15:47:44.649 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.getResource   --> Returning 
'file:/opt/tomcat/apache-tomcat-9.0.58/webapps/com.zohoinvest.api-0.0.1/WEB- 
INF/classes/'
08-Mar-2022 15:47:49.352 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.getResource getResource()
08-Mar-2022 15:47:49.352 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.findResource     findResource()
08-Mar-2022 15:47:49.352 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.findResource     --> Returning 
'file:/opt/tomcat/apache-tomcat-9.0.58/webapps/com.zohoinvest.api-0.0.1/WEB- 
INF/classes/'
08-Mar-2022 15:47:49.352 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.getResource   --> Returning 
'file:/opt/tomcat/apache-tomcat-9.0.58/webapps/com.zohoinvest.api-0.0.1/WEB- 
INF/classes/'
08-Mar-2022 15:47:51.038 FINE [Catalina-utility-2] 
org.apache.catalina.startup.HostConfig.checkResources Checking context[] redeploy 
resource /opt/tomcat/apache-tomcat-9.0.58/webapps/ROOT.war
08-Mar-2022 15:47:51.039 FINE [Catalina-utility-2] 
org.apache.catalina.startup.HostConfig.checkResources Checking context[] redeploy 
resource /opt/tomcat/apache-tomcat-9.0.58/webapps/ROOT

这种行为的原因可能是什么?

We are working on a backend app using Ktor. The app is deployed on a Tomcat server version 9.0.38.

The app has a POST route used for processing HTTP POST requests. Inside, it tries to receive the json body and map it to RouteSignalNotificationResponse data class. After some tests we found out that at this line the request gets stuck and nothing is executed after it.

post("/createSignalNotification") {
    val signalResponse = call.receive<RouteSignalNotificationResponse>()
    ...
}

The RouteSignalNotificationResponse class looks like this:

@Serializable
data class RouteSignalNotificationResponse(
    @SerialName("p1")
    val title: String,
    @SerialName("p2")
    val message: String,
    @SerialName("p3")
    val firstParameter: Int,
    @SerialName("p4")
    val secondParameter: Int
)

The Content-Type in the header of the request is "application/json".

If we remove the "call.receive" line and mock the RouteSignalNotificationResponse data, everything afterwards works.

We are using the following versions:

ktor_version=1.6.7
kotlin_version=1.5.31
logback_version=1.2.9
koin_version=3.1.4
oracle jdk 17

On the server side, after loading the libraries we don't have any error messages, but the logs show the following problem:

----------> Parent Classloader:
java.net.URLClassLoader@45283ce2

08-Mar-2022 15:47:41.945 FINE [pool-7-thread-1] 
org.apache.catalina.loader.WebappClassLoaderBase.loadClass   Loading class from local 
repository
08-Mar-2022 15:47:44.648 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.getResource getResource()
08-Mar-2022 15:47:44.649 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.findResource     findResource()
08-Mar-2022 15:47:44.649 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.findResource     --> Returning 
'file:/opt/tomcat/apache-tomcat-9.0.58/webapps/com.zohoinvest.api-0.0.1/WEB- 
INF/classes/'
08-Mar-2022 15:47:44.649 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.getResource   --> Returning 
'file:/opt/tomcat/apache-tomcat-9.0.58/webapps/com.zohoinvest.api-0.0.1/WEB- 
INF/classes/'
08-Mar-2022 15:47:49.352 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.getResource getResource()
08-Mar-2022 15:47:49.352 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.findResource     findResource()
08-Mar-2022 15:47:49.352 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.findResource     --> Returning 
'file:/opt/tomcat/apache-tomcat-9.0.58/webapps/com.zohoinvest.api-0.0.1/WEB- 
INF/classes/'
08-Mar-2022 15:47:49.352 FINE [Abandoned connection cleanup thread] 
org.apache.catalina.loader.WebappClassLoaderBase.getResource   --> Returning 
'file:/opt/tomcat/apache-tomcat-9.0.58/webapps/com.zohoinvest.api-0.0.1/WEB- 
INF/classes/'
08-Mar-2022 15:47:51.038 FINE [Catalina-utility-2] 
org.apache.catalina.startup.HostConfig.checkResources Checking context[] redeploy 
resource /opt/tomcat/apache-tomcat-9.0.58/webapps/ROOT.war
08-Mar-2022 15:47:51.039 FINE [Catalina-utility-2] 
org.apache.catalina.startup.HostConfig.checkResources Checking context[] redeploy 
resource /opt/tomcat/apache-tomcat-9.0.58/webapps/ROOT

What could be the reason of such behavior?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文