Tomcat上的Spring Web服务端点 - 并发调用配置

时间:2014-12-02 16:22:24

标签: multithreading spring-mvc tomcat7 spring-integration

我有一个带有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

1 个答案:

答案 0 :(得分:1)

应用程序当时只处理两个消息(有时甚至只是一次!)的原因不是因为Spring配置或Tomcat配置存在问题,而是因为测试工具SoapUI中存在错误4.5.0。请参阅limited threads in soapUI free version

更新SoapUI并重新运行后,现在可以看到许多线程一次处理消息。