首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring使用http请求处理消息网关以异步处理方式发送即时响应

Spring使用http请求处理消息网关以异步处理方式发送即时响应
EN

Stack Overflow用户
提问于 2016-09-28 07:52:00
回答 1查看 1.3K关注 0票数 2

我们有一个需求,当客户机调用我们的spring集成http入站网关之一时,提供给API的输入是.csv格式,一旦验证并找到正确的立即响应,就应该发送状态200 OK。如果出现错误,则发送适当的错误消息。我们使用直接和执行器通道的组合来进行异步处理。这在使用spring父版本1.2.5时工作得很好,但是当升级到1.4.0时,version.We总是会得到500个内部服务器错误,原因就像从日志中发现的MessageTimeoutException一样。

我们使用基于java的配置,配置如下。

pom.xml

代码语言:javascript
复制
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>

            <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-http</artifactId>
            <version>4.3.1.RELEASE</version>
        </dependency>

@Configuration
public class ApplicationIntegrationConfig {    

    @Bean
    public HttpRequestHandlingMessagingGateway httpMessageGateway(){
        HttpRequestHandlingMessagingGateway gateway
                = new HttpRequestHandlingMessagingGateway(Boolean.TRUE);
        RequestMapping requestMapping = new RequestMapping();
        requestMapping.setMethods(HttpMethod.POST);
        requestMapping.setPathPatterns("/org/{orgId}/users");
        requestMapping.setHeaders("Content-Type=text/csv");
        gateway.setRequestMapping(requestMapping);
        gateway.setRequestChannel(onBoardUserRequestChannel());
        Map<String, Expression> customHeaderExpressions = new HashMap<>();
        customHeaderExpressions.put("orgId", new SpelExpressionParser().
                parseExpression("#pathVariables.orgId"));
        gateway.setHeaderExpressions(customHeaderExpressions);
        gateway.setErrorChannel(errorChannel());
        gateway.setReplyTimeout(0);
        return gateway;
    }    

    @Bean
    public MessageChannel processUserRequestChannel() {
        DirectChannel channel =new DirectChannel();
        channel.addInterceptor(new AuthenticationInterceptor());
        return channel;
    }

    @Bean
    public MessageChannel routeChannel() {
        return new ExecutorChannel(Executors.newCachedThreadPool());
    }

    @Bean
    public MessageChannel addUserChannel() {
        return new ExecutorChannel(Executors.newCachedThreadPool());
    }

    @Bean
    public MessageChannel removeUserChannel() {
        return new ExecutorChannel(Executors.newCachedThreadPool());
    }

    @Bean
    public MessageChannel errorChannel() {
        return new DirectChannel();
    }    
}

分离器

代码语言:javascript
复制
@MessageEndpoint
public class PartnerUserOnBoardSplitter {     

    @Splitter(inputChannel= "processUserRequestChannel", outputChannel="routeChannel")
    public List<UserDTO> split(Message message) throws ApplicationException {
        List<UserDTO> userList = null;
        try {
            userList = validateAndCreateDTO(message);
        } 
        } catch(Exception ex) {
            throw new ApplicationException("<Message>");
        }
        return userList;
    }    
}

路由器

代码语言:javascript
复制
@MessageEndpoint
public class CustomRouter {

    @Router(inputChannel="routeChannel")
    public String resolveRoute(UserDTO dto) {
        return (Operation.ADD.equals(dto.getOperation())) ? "addUserChannel" : "removeUserChannel";
    }    
}

public class ServiceActivator{

@ServiceActivator(inputChannel = "addUserChannel")
public addUser(UserDto dto){
//process add
}

@ServiceActivator(inputChannel = "removeUserChannel")
public removeUser(UserDto dto){
//process remove
}    
}
EN

回答 1

Stack Overflow用户

发布于 2016-09-28 14:24:32

这是对SpringIntegration4.2JIRA在这里的增强/改进。

以前,如果期望应答并超时,用户将错误地获得200 OK。现在他得到了500分,但有一个超时例外。

由于您正在配置网关以期望得到答复,这将触发此功能。

只需将网关配置为不期望收到答复.

代码语言:javascript
复制
HttpRequestHandlingMessagingGateway gateway
            = new HttpRequestHandlingMessagingGateway(false);

您还将看到更快的响应,因为容器线程不会等待永远不会出现的答复(默认超时为1秒)。

编辑

如果有时希望发送答复,而不是在其他时间发送答复,请将expectReply设置为true并添加以下配置:

代码语言:javascript
复制
gateway.setStatusCodeExpression(new SpelExpressionParser().parseExpression("200"));
gateway.setReplyTimeout(0);

添加了一些javadocs -希望这能帮上忙。

对于那些使用XML配置的人来说,这是.

代码语言:javascript
复制
<int-http:inbound-gateway request-channel="receiveChannel"
                      path="/receiveGateway"
                      reply-timeout="0"
                      reply-timeout-status-code-expression="200"
                      supported-methods="POST"/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39741251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档