我已经使用springboot2.2.6.release实现了一个rest控制器
一开始,网络上的许多应用程序向我的控制器的一个运行示例发出请求。
我相信我看到来自多个应用程序的参数在一次对控制器的调用中被组合在一起
例如,我的控制器中的业务逻辑在收到以下url时抛出异常,我在调用控制器时立即记录该url:
2021-02-19 06:31:05.551 [http-nio-9000-exec-6] [ERROR] [RefDataServerController]: http://tbaquaappc-u2:9000/refdata/exec/text/getParticipantBitCross?instance=LINEDATA&cert=0dk7lc0vyeVEPptGwVyUXc%3DNbc0FW3IujbPTF7e&cert=Hzj%2Fqu9tIw865CMmsEP076N9mgLI3J6oFwovyt1
在这个url中有两个没有应用程序发送的'&cert'参数。
两个不同的应用程序(大约同时)发送以下独立请求
http://tbaquaappc-u2:9000/refdata/exec/text/getParticipantBitCross?instance=LINEDATA&cert=Hzj%2Fqu9tIw865CMmsEP076N9mgLI3J6oFwovyt1
http://tbaquaappc-u2:9000/refdata/exec/text/getParticipantBitCross?instance=JOHN2&cert=0dk7lc0vyeVEPptGwVyUXc%3DNbc0FW3IujbPTF7e
看起来第二个电话的&cert与第一个电话混淆了。
1条答案
按热度按时间roejwanj1#
多亏了“roddy of the Frozed peas”,问题似乎确实出在了spring boot应用程序和调用者之间的web代理上。代理在原始服务器套接字上侦听来自调用者的自定义协议请求(这是一个不幸的遗留问题),并将它们传送到
JAX-RS
对应用程序的请求。代理侦听器是标准的javaserversocket代码,它阻塞/等待请求,然后在新线程上调用输入处理器,该线程将请求转发给应用程序。在输入处理器中,我有一个org.apache.cxf.jaxrs.client.WebClient
只是做了一个reset()
每次通话前run()
方法。我删除了共享示例,并通过让每个线程创建一个WebClient
内部run()
方法将http请求转发到应用程序。这似乎解决了这个问题。可能WebClient
不是线程安全的。