为spring-xd创建自定义websocket接收器

时间:2015-03-24 22:48:50

标签: spring-xd

我是spring-xd的新手,需要一些建议来创建自定义接收器。具体来说,我想创建一个注册Websocket的接收器。一般的想法是

module upload --file "websocket-sink-0.0.1-SNAPSHOT.jar" --type "sink" --name "websocket-sink"
stream create --name "websocket-sink-test" --definition "http --port=9191 | websocket-sink --port=9292" --deploy

应该安装接收器模块并创建一个接受端口9191上的http输入的流,并将有效负载发送到websocket接收器,客户端可以连接(通过端口9292)并使用该数据。 / p>

我几乎遵循了文档中的指导原则,并使用了Josh Long的techtips(https://github.com/joshlong/techtips/tree/master/examples/spring-integration-4.1-websockets-example)中的spring integration websocket教程。所以这就是我想出来的

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.dsl.support.Function;
import org.springframework.integration.websocket.ServerWebSocketContainer;
import org.springframework.integration.websocket.outbound.WebSocketOutboundMessageHandler;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.Executors;
import java.util.stream.Collectors;


@Configuration
@EnableIntegration
@ComponentScan
@EnableAutoConfiguration
@RestController
public class WebsocketSink {

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

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

    @Bean
    MessageChannel input() {
        return new DirectChannel();
    }

    @Bean
    IntegrationFlow webSocketFlow() {
        Function<Message, Object> splitter = m -> serverWebSocketContainer()
                .getSessions()
                .keySet()
                .stream()
                .map(s -> MessageBuilder.fromMessage(m)
                        .setHeader(SimpMessageHeaderAccessor.SESSION_ID_HEADER, s)
                        .build())
                .collect(Collectors.toList());

        return IntegrationFlows
                .from(input())
                .split(Message.class, splitter)
                .channel(c -> c.executor(Executors.newCachedThreadPool()))
                .handle(webSocketOutboundAdapter()).get();
    }

}

我猜可能不需要某些类级别注释(例如@ComponentScan@RestController)。但是我缺少的(概念上)是websocket客户端连接到接收器暴露的websocket的位置和方式(也就是说,我如何指定应该用于在接收器实现中承载Websocket的容器​​的端口,例如,来自上面的流定义中的9292

我有点迷失在这里,所以我会感激任何建议。

1 个答案:

答案 0 :(得分:1)

Josh技术提示中的Spring Integration WebSocket适配器需要在Web容器(tomcat等)中运行。因此,XD目前不支持开箱即用。

http源使用基于netty的自定义HTTP通道适配器,因此它没有相同的问题(标准的Spring Integration http入站端点也需要在容器中运行)。

随意打开新功能JIRA issue