Ktor 应用程序接收 POST json 主体时卡住
我们正在使用 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论