2016-09-24 34 views
0

我正在嘗試將XML集成流從XML重寫爲Java。我想發送的通過信道路徑數據:輸出通道路由

@Bean(name = "sendData") 
public MessageChannel getSendData() { 
    return MessageChannels.direct() 
          .get(); 
} 

到其它兩個通道:這取決於它們的可用性

@Bean(name = "sendDataA") 
public MessageChannel getSendDataA() { 
    return MessageChannels.direct() 
          .get(); 
} 

@Bean(name = "sendDataB") 
public MessageChannel getSendDataB() { 
    return MessageChannels.direct() 
          .get(); 
} 

我有一個RoundRobinRouter類,它確定使用哪個輸出通道。它有一個方法route返回輸出通道的名稱,如:

@Component 
class RoundRobinRouter { 
    public String route(Object payload) { 
     /* implementation */ 
    } 
} 

注意route方法實現不實際使用​​對象。這是以前放在XML配置:

<int:router method="route" input-channel="sendData" 
      default-output-channel="sendDataA"> 
    <bean 
      class="com.example.RoundRobinRouter"/> 
</int:router> 

我已經使用Java DSL IntegrationFlow嘗試:

@Bean 
@ServiceActivator(inputChannel = "sendData", 
        outputChannel = "sendDataA") 
public IntegrationFlow routeRoundRobin() { 
    return router -> router.route(roundRobinRouter, "route"); 
} 

但我得到一個錯誤「調度員沒有訂戶」上sendData.send(payload)通話,顯然是造成:

org.springframework.expression.spel.SpelEvaluationException: EL1004E:(位置8):方法調用:方法配置(com.example.D ataType) 不能在com.example.Integration $$ LAMBDA $1018103616分之1發現型

路由器是我的集成類唯一的拉姆達。

回答

0

好的,我得到它的工作。我不知道這種改變固定我的問題,但在這裏是正確的路由器實現:

@Bean 
public IntegrationFlow routeRoundRobin() { 
    return IntegrationFlows.from(getSendData()) 
          .route(roundRobinRouter, "route", 
            r -> r.channelMapping("sendDataA", 
                 "sendDataA") 
             .channelMapping("sendDataB", 
                 "sendDataB")) 
          .get(); 
} 

@Bean(name = "sendData") 
public MessageChannel getSendData() { 
    return MessageChannels.direct() 
          .get(); 
} 

@Bean(name = "sendDataA") 
public MessageChannel getSendDataA() { 
    return MessageChannels.direct() 
          .get(); 
} 

@Bean(name = "sendDataB") 
public MessageChannel getSendDataB() { 
    return MessageChannels.direct() 
          .get(); 
} 

我改變@ServiceActivatorIntegrationFlowsendData,並且還增加了通道映射到路由器。