使用 spring-integration-dsl 的动态 http 入站网关

Posted

技术标签:

【中文标题】使用 spring-integration-dsl 的动态 http 入站网关【英文标题】:Dynamic http inbound gateway using spring-integration-dsl 【发布时间】:2018-09-27 15:39:36 【问题描述】:

我正在尝试使用 Java DSL 为 HTTP 入站网关创建和注册运行时集成流,如下所示

@Autowired
private IntegrationFlowContext flowContext;

public static void main(String[] args) 
    SpringApplication.run(RestClientDemoApplication.class, args);


@ServiceActivator(inputChannel="httpRequest")
public String upCase(String in) 
    System.out.println("message received" + in);
    return in.toUpperCase();


@Bean
public MessageChannel directChannel()
    return MessageChannels.direct().get();


/*@Bean
public IntegrationFlow inbound() 
    return IntegrationFlows.from(Http.inboundGateway("/foo")
            .requestMapping(m -> m.methods(HttpMethod.POST))
            .requestPayloadType(String.class).replyChannel(directChannel()))
        .channel("httpRequest")
        .get();

*/


@Override
public void run(String... args) throws Exception 
     IntegrationFlow flow;
     IntegrationFlowRegistration theFlow;
    flow = IntegrationFlows.from(Http.inboundGateway("/foo")
                .requestMapping(m -> m.methods(HttpMethod.POST))
                .requestPayloadType(String.class).replyChannel(directChannel()))
            .channel("httpRequest")
            .get();

      theFlow = this.flowContext.registration(flow).register();

在这种情况下,我的请求 url ("/foo") 没有与服务器映射,因为当我从 HTTP 客户端发送消息时,服务器端没有收到任何消息。 但是当我取消注释上述 bean(入站)即 为集成流创建 Bean 并在运行方法中注释流创建和注册代码(删除运行时集成流代码) 如下它工作正常

@Autowired
private IntegrationFlowContext flowContext;

public static void main(String[] args) 
    SpringApplication.run(RestClientDemoApplication.class, args);


@ServiceActivator(inputChannel="httpRequest")
public String upCase(String in) 
    System.out.println("message received" + in);
    return in.toUpperCase();


@Bean
public MessageChannel directChannel()
    return MessageChannels.direct().get();


@Bean
public IntegrationFlow inbound() 
    return IntegrationFlows.from(Http.inboundGateway("/foo")
            .requestMapping(m -> m.methods(HttpMethod.POST))
            .requestPayloadType(String.class).replyChannel(directChannel()))
        .channel("httpRequest")
        .get();




@Override
public void run(String... args) throws Exception 


     /*IntegrationFlow flow;
     IntegrationFlowRegistration theFlow;

     flow = IntegrationFlows.from(Http.inboundGateway("/foo")
                .requestMapping(m -> m.methods(HttpMethod.POST))
                .requestPayloadType(String.class).replyChannel(directChannel()))
            .channel("httpRequest")
            .get();

      theFlow = this.flowContext.registration(flow).register();*/ 

我的 HTTP 出站网关代码如下

    flow = IntegrationFlows.from(directChannel()).handle(Http.outboundGateway("https://localhost:8448/foo")
            .httpMethod(HttpMethod.POST).expectedResponseType(String.class)).channel("httpReply").get();

    theFlow = this.flowContext.registration(flow).register();

如果此方法不合适,请帮助我解决上述问题或提供在运行时创建 Http 入站网关的解决方案。

【问题讨论】:

【参考方案1】:

这还不可能:https://jira.spring.io/browse/INT-4436。

不幸的是,没有简单的解决方法可供您继续,除非您只能公开一个 REST 端点并根据接受的 HTTP 请求在 IntegrationFlow 内进行路由。

【讨论】:

以上是关于使用 spring-integration-dsl 的动态 http 入站网关的主要内容,如果未能解决你的问题,请参考以下文章

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”