我有一个带有Web服务Endpoint
的Spring应用程序,它在收到调用后会将请求有效负载传递给Spring Integration MessagingGateway
以进行EIP处理。
我的应用程序部署在Tomcat 7
容器上,使用Spring 4 API构建。
我正在尝试运行性能测试,在那里我对Web服务进行多个并发调用。当我执行此测试时,每个请求都处理好,并且每个请求都成功收到响应,但Spring应用程序似乎当时只处理了两个请求。即,一旦第二请求的响应被发送回客户端,第三请求仅由应用程序处理。 (调试时我可以看到只有两个线程处理请求)
我想知道应该在哪里完成Spring应用程序的执行线程配置,以便同时支持多个Web服务客户端请求的处理(例如10个并发线程)。这应该在Tomcat容器的配置中的某个地方完成吗?在Web服务的配置中的某个地方? Spring Integration的消息传递网关配置? Spring Integration的请求集成流程配置?其中一些配置的组合?或完全在其他地方?
我的筹码是:
Tomcat 7.0.55
Spring/Integration 4 APIs
Spring Java DSL 1 API
对于我的测试,我使用的是SoapUI 4.5.0,我正在使用以下配置进行负载测试:
Threads: 10, Strategy: Thread, Start Threads: 10, End Threads: 10, Limit 1 Runs per thread.
我假设此配置可用于测试对Web服务URL的10个并发调用...
*更新包含当前配置*
端点配置:
@Endpoint
@EnableIntegration
@IntegrationComponentScan(basePackages = "com.company.test.gateway")
@ComponentScan(basePackages = "com.company.test.gateway")
public class TestServiceEndpoint {
private static final String NAMESPACE_URI = "http://www.company.com/test";
private static final Logger logger = LogManager.getLogger();
@Autowired
private TestGateway gateway;
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "test")
@ResponsePayload
public TestResponse process(
@RequestPayload TestRequest request) throws Exception {
TestResponse response = gateway.process(request);
return response;
}
}
网关配置:
@MessagingGateway
@EnableIntegration
@IntegrationComponentScan
@ComponentScan
public interface TestGateway {
@Gateway(requestChannel = "test.request.ch", replyChannel = "test.response.ch")
TestResponse process(TestRequest request);
}
集成配置:
@Configuration
public class IntegrationConfig {
@Bean(name = "test.request.ch")
public DirectChannel testRequestCh() {
return new DirectChannel();
}
@Bean(name = "test.response.ch")
public DirectChannel testResponseCh() {
return new DirectChannel();
}
@Bean
public Executor taskExecutor() {
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors
.newFixedThreadPool(10);
return executor;
}
@Bean
public IntegrationFlow requestFlow() {
return IntegrationFlows
.from("test.request.ch")
.enrichHeaders(
m -> {
m.header(MessageHeaders.ERROR_CHANNEL,
"test.error.ch", true);
})
.handle("testSplitter", "split")
.channel(MessageChannels.executor("requestSplitterFlowExecutor",
this.taskExecutor()))
.route("testRouter", "route")
.get();
}
...
}
干杯, PM
答案 0 :(得分:1)
应用程序当时只处理两个消息(有时甚至只是一次!)的原因不是因为Spring配置或Tomcat配置存在问题,而是因为测试工具SoapUI中存在错误4.5.0。请参阅limited threads in soapUI free version。
更新SoapUI并重新运行后,现在可以看到许多线程一次处理消息。