2017-11-03 16 views
1

저는 Spring 통합 프레임 워크를 처음 사용합니다. 스프링 통합 웹 소켓 샘플 code을 실행하는 동안 'outputChannel'또는 'outputChannelName'이 필요합니다. 예외입니다.스프링 통합 websocket "outputChannel"또는 "outputChannelName"이 필요합니다. 예외 "

내가 무엇을 놓쳤습니까? 다음

내 코드는,

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
@RestController 
public class Application { 

    public static void main(String args[]) throws Throwable { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    ServerWebSocketContainer serverWebSocketContainer() { 
     return new ServerWebSocketContainer("/names").withSockJs(); 
    } 

    @Bean 
    MessageHandler webSocketOutboundAdapter() { 
     return new WebSocketOutboundMessageHandler(serverWebSocketContainer()); 
    } 

    @Bean(name = "webSocketFlow.input") 
    MessageChannel requestChannel() { 
     return new DirectChannel(); 
    } 

    @Bean 
    IntegrationFlow webSocketFlow() { 
     return f -> { 
      Function<Message, Object> splitter = m -> serverWebSocketContainer().getSessions().keySet().stream() 
        .map(s -> MessageBuilder.fromMessage(m).setHeader(SimpMessageHeaderAccessor.SESSION_ID_HEADER, s).build()).collect(Collectors.toList()); 
      f.split(Message.class, splitter).channel(c -> c.executor(Executors.newCachedThreadPool())).handle(webSocketOutboundAdapter()); 
     }; 
    } 

    @RequestMapping("/hi/{name}") 
    public void send(@PathVariable String name) { 
     requestChannel().send(MessageBuilder.withPayload(name).build()); 
    } 
} 

예외 스택,

java.lang.IllegalStateException: 'outputChannel' or 'outputChannelName' is required 
    at org.springframework.util.Assert.state(Assert.java:70) 
    at org.springframework.integration.endpoint.MessageProducerSupport.afterSingletonsInstantiated(MessageProducerSupport.java:153) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:781) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) 

답변

1
java.lang.IllegalStateException: 'outputChannel' or 'outputChannelName' is required 
at org.springframework.util.Assert.state(Assert.java:70) 
at org.springframework.integration.endpoint.MessageProducerSupport.afterSingletonsInstantiated(MessageProducerSupport.java:153) 

에주의 - MessageProducerSupport. 코드에 어떤 내용도 표시되지 않으므로 응용 프로그램에서 무언가를 숨길 수 있습니다. setOutputChannel()로 선언해야

@Bean 
public WebSocketInboundChannelAdapter webSocketInboundChannelAdapter() { 
    ... 
} 

그리고 정확히 하나

는 그리고 난 당신이 뭔가를 할 수도 있습니다 같아요.

또는 자바 DSL - IntegrationFlows.from(webSocketInboundChannelAdapter())에서 시작점으로 사용하는 경우 - @Bean으로 선언하지 마십시오. 프레임 워크는 이후에 적절한 구성과 등록을 처리합니다.

+0

지원해 주셔서 감사합니다. WebSocketInboundChannelAdapter Bean 정의가있는 config 클래스가 있다고합니다. 클라우드 스트림 시동기를위한 소스 앱을 만들려고했는데, 매우 새로 웠습니다. 왜냐하면 websocket 소스는 github에서 사용할 수 없기 때문입니다. 소스로 websocket 서버를 시작하고 브로커 (Kafka/rabit)에게받은 메시지를 전달하고 싶습니다. 프레임 워크에 의해 처리되는 부분과 소스 부분에 작성해야 할 내용을 알고 싶습니다. 당신이 나에게 간단한 것을 줄 수 있니? – Krishas

+0

글쎄, 그건 별도로 질문을받을 가치가있어. 현재와 ​​관련이 없습니다. 그러나 적절한 GH 문제 (https://github.com/spring-cloud-stream-app-starters/websocket/issues/2)에서 논의 할 수 있습니다. 그리고 언급 된 문제가 충분하다면 여기 내 대답을 받아 들여야합니다. –

+0

물론입니다. 완료 ... – Krishas