此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

从版本 4.1 开始,Spring Integration 支持 WebSocket。 它基于 Spring Framework 模块中的架构、基础架构和 API。 因此,Spring WebSocket的许多组件(如或)和配置选项(如)都可以在Spring Integration中重用。 有关更多信息,请参见 Spring Framework 参考手册中的 Spring Framework WebSocket 支持一章。web-socketSubProtocolHandlerWebSocketClient@EnableWebSocketMessageBrokerSpring中文文档

您需要将此依赖项包含在项目中:Spring中文文档

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-websocket</artifactId>
    <version>6.3.2-SNAPSHOT</version>
</dependency>
compile "org.springframework.integration:spring-integration-websocket:6.3.2-SNAPSHOT"

对于服务器端,必须显式包含依赖项。org.springframework:spring-webmvcSpring中文文档

Spring Framework WebSocket 基础结构基于 Spring 消息传递基础,并提供了一个基于 Spring Integration 使用的相同实现和实现(以及一些 POJO 方法注释映射)的基本消息传递框架。 因此,即使没有 WebSocket 适配器,Spring Integration 也可以直接参与到 WebSocket 流中。 为此,您可以使用适当的注解配置 Spring Integration,如以下示例所示:MessageChannelMessageHandler@MessagingGatewaySpring中文文档

@MessagingGateway
@Controller
public interface WebSocketGateway {

    @MessageMapping("/greeting")
    @SendToUser("/queue/answer")
    @Gateway(requestChannel = "greetingChannel")
    String greeting(String payload);

}

概述

由于 WebSocket 协议根据定义是流式传输的,并且我们可以同时向 WebSocket 发送和接收消息,因此我们可以处理适当的 ,无论是在客户端还是在服务器端。 为了封装连接管理和注册表,提供了 和 实现。 由于 WebSocket API 及其在 Spring Framework 中的实现(具有许多扩展),在服务器端和客户端(当然,从 Java 的角度来看)都使用了相同的类。 因此,大多数连接和注册表选项在两端都是相同的。 这使我们能够重用许多配置项和基础结构挂钩,以在服务器端和客户端构建 WebSocket 应用程序。 以下示例演示组件如何同时满足这两个目的:WebSocketSessionWebSocketSessionIntegrationWebSocketContainerClientWebSocketContainerServerWebSocketContainerWebSocketSessionSpring中文文档

//Client side
@Bean
public WebSocketClient webSocketClient() {
    return new SockJsClient(Collections.singletonList(new WebSocketTransport(new JettyWebSocketClient())));
}

@Bean
public IntegrationWebSocketContainer clientWebSocketContainer() {
    return new ClientWebSocketContainer(webSocketClient(), "ws://my.server.com/endpoint");
}

//Server side
@Bean
public IntegrationWebSocketContainer serverWebSocketContainer() {
    return new ServerWebSocketContainer("/endpoint").withSockJs();
}

它旨在实现双向消息传递,并且可以在入站和出站通道适配器之间共享(见下文),在使用单向(发送或接收)WebSocket 消息传递时,只能从其中一个适配器引用。 它可以在没有任何通道适配器的情况下使用,但在这种情况下,它仅充当注册表的角色。IntegrationWebSocketContainerIntegrationWebSocketContainerWebSocketSessionSpring中文文档

将内部注册为 . 它在目标供应商 WebSocket 容器中提供的其他服务器 WebSocket 选项(例如 或)下执行此操作。 这种配准是通过基础设施组件实现的,其作用与注释相同。 这意味着,通过使用(或应用程序上下文中的任何 Spring Integration 命名空间),您可以省略声明,因为 Spring Integration 基础结构会检测所有 WebSocket 端点。ServerWebSocketContainerWebSocketConfigurerIntegrationWebSocketContainer.IntegrationWebSocketHandlerEndpointpathsHandshakeHandlerSockJS fallbackServletWebSocketHandlerRegistryWebSocketIntegrationConfigurationInitializer@EnableWebSocket@EnableIntegration@EnableWebSocket

从版本 6.1 开始,可以使用 provided 而不是 和 组合进行配置。 这在需要对 uri 的某些部分进行自定义编码的情况下非常有用。 为方便起见,请参阅 API。ClientWebSocketContainerURIuriTemplateuriVariablesUriComponentsBuilderSpring中文文档

将内部注册为 . 它在目标供应商 WebSocket 容器中提供的其他服务器 WebSocket 选项(例如 或)下执行此操作。 这种配准是通过基础设施组件实现的,其作用与注释相同。 这意味着,通过使用(或应用程序上下文中的任何 Spring Integration 命名空间),您可以省略声明,因为 Spring Integration 基础结构会检测所有 WebSocket 端点。ServerWebSocketContainerWebSocketConfigurerIntegrationWebSocketContainer.IntegrationWebSocketHandlerEndpointpathsHandshakeHandlerSockJS fallbackServletWebSocketHandlerRegistryWebSocketIntegrationConfigurationInitializer@EnableWebSocket@EnableIntegration@EnableWebSocket

WebSocket 入站通道适配器

实现交互的接收部分。 您必须为其提供 ,并且适配器将自身注册为 a 以处理传入消息和事件。WebSocketInboundChannelAdapterWebSocketSessionIntegrationWebSocketContainerWebSocketListenerWebSocketSessionSpring中文文档

在 中只能注册一个。WebSocketListenerIntegrationWebSocketContainer

对于 WebSocket 子协议,可以配置为第二个构造函数参数。 适配器委托给 以确定适合接受的,并根据子协议实现将 a 转换为 a。WebSocketInboundChannelAdapterSubProtocolHandlerRegistrySubProtocolHandlerRegistrySubProtocolHandlerWebSocketSessionWebSocketMessageMessageSpring中文文档

默认情况下,仅依赖于原始实现,这会将 转换为 .WebSocketInboundChannelAdapterPassThruSubProtocolHandlerWebSocketMessageMessage

仅接受并发送到具有或空标头的实例的基础集成流。 所有其他类型都通过从实现发出的实例(如 )进行处理。WebSocketInboundChannelAdapterMessageSimpMessageType.MESSAGEsimpMessageTypeMessageApplicationEventSubProtocolHandlerStompSubProtocolHandlerSpring中文文档

在服务器端,如果存在配置,则可以使用该选项进行配置。 在这种情况下,所有类型都委托给提供的 . 此外,如果代理中继配置了目标前缀,那么与代理目标匹配的消息将路由到 而不是 的 。@EnableWebSocketMessageBrokerWebSocketInboundChannelAdapteruseBroker = truenon-MESSAGEMessageAbstractBrokerMessageHandlerAbstractBrokerMessageHandleroutputChannelWebSocketInboundChannelAdapterSpring中文文档

如果 和 接收到的消息属于该类型,则立即向 发送消息,而不将其发送到通道。useBroker = falseSimpMessageType.CONNECTWebSocketInboundChannelAdapterSimpMessageType.CONNECT_ACKWebSocketSessionSpring中文文档

Spring 的 WebSocket 支持只允许配置一个代理中继。 因此,我们不需要参考。 在应用程序上下文中检测到它。AbstractBrokerMessageHandler

有关更多配置选项,请参阅 WebSockets 命名空间支持Spring中文文档

在 中只能注册一个。WebSocketListenerIntegrationWebSocketContainer
默认情况下,仅依赖于原始实现,这会将 转换为 .WebSocketInboundChannelAdapterPassThruSubProtocolHandlerWebSocketMessageMessage
Spring 的 WebSocket 支持只允许配置一个代理中继。 因此,我们不需要参考。 在应用程序上下文中检测到它。AbstractBrokerMessageHandler

WebSocket 出站通道适配器

这:WebSocketOutboundChannelAdapterSpring中文文档

  1. 接受来自其的 Spring Integration 消息MessageChannelSpring中文文档

  2. 确定从WebSocketSessionidMessageHeadersSpring中文文档

  3. 从提供的WebSocketSessionIntegrationWebSocketContainerSpring中文文档

  4. 将工作的转换和发送委托给相应的人。WebSocketMessageSubProtocolHandlerSubProtocolHandlerRegistrySpring中文文档

在客户端,消息头不是必需的,因为仅处理单个连接及其各自。WebSocketSessionidClientWebSocketContainerWebSocketSessionSpring中文文档

要使用 STOMP 子协议,应使用 . 然后,可以使用 和 a 或仅使用 a(请参阅标头扩充器)将任何 STOMP 消息类型发送到此适配器。StompSubProtocolHandlerStompHeaderAccessor.create(StompCommand…​)MessageBuilderHeaderEnricherSpring中文文档

本章的其余部分主要介绍其他配置选项。Spring中文文档

WebSockets 命名空间支持

Spring Integration WebSocket 命名空间包括本章其余部分描述的几个组件。 若要将其包含在配置中,请在应用程序上下文配置文件中使用以下命名空间声明:Spring中文文档

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:int="http://www.springframework.org/schema/integration"
  xmlns:int-websocket="http://www.springframework.org/schema/integration/websocket"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/integration
    https://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/websocket
    https://www.springframework.org/schema/integration/websocket/spring-integration-websocket.xsd">
    ...
</beans>

<int-websocket:client-container>属性

以下列表显示了该元素的可用属性:<int-websocket:client-container>Spring中文文档

<int-websocket:client-container
                  id=""                             (1)
                  client=""                         (2)
                  uri=""                            (3)
                  uri-variables=""                  (4)
                  origin=""                         (5)
                  send-time-limit=""                (6)
                  send-buffer-size-limit=""         (7)
                  send-buffer-overflow-strategy=""  (8)
                  auto-startup=""                   (9)
                  phase="">                        (10)
                <int-websocket:http-headers>
                  <entry key="" value=""/>
                </int-websocket:http-headers>      (11)
</int-websocket:client-container>
1 组件 Bean 名称。
2 Bean 引用。WebSocketClient
3 或到目标 WebSocket 服务。 如果将其用作带有 URI 变量占位符的占位符,则该属性是必需的。uriuriTemplateuriTemplateuri-variables
4 属性值中 URI 变量占位符的逗号分隔值。 这些值将根据它们在 中的顺序替换到占位符中。 请参阅 UriComponents.expand(Object...uriVariableValues)。uriuri
5 握手 HTTP 标头值。Origin
6 WebSocket 会话“发送”超时限制。 默认值为 。10000
7 WebSocket 会话“发送”消息大小限制。 默认值为 。524288
8 WebSocket 会话发送缓冲区溢出策略 确定会话的出站消息缓冲区到达 . 有关可能的值和更多详细信息,请参阅。send-buffer-size-limitConcurrentWebSocketSessionDecorator.OverflowStrategy
9 指示此终结点是否应自动启动的布尔值。 默认值为 ,假定此容器是从 WebSocket 入站适配器启动的。false
10 此终结点应启动和停止的生命周期阶段。 该值越低,此终结点开始得越早,停止得越晚。 默认值为 。 值可以是负数。 请参阅 SmartLifeCycleInteger.MAX_VALUE
11 用于握手请求的 A。MapHttpHeaders

<int-websocket:server-container>属性

以下列表显示了该元素的可用属性:<int-websocket:server-container>Spring中文文档

<int-websocket:server-container
          id=""                             (1)
          path=""                           (2)
          handshake-handler=""              (3)
          handshake-interceptors=""         (4)
          decorator-factories=""            (5)
          send-time-limit=""                (6)
          send-buffer-size-limit=""         (7)
          send-buffer-overflow-strategy=""  (8)
          allowed-origins="">               (9)
          <int-websocket:sockjs
            client-library-url=""          (10)
            stream-bytes-limit=""          (11)
            session-cookie-needed=""       (12)
            heartbeat-time=""              (13)
            disconnect-delay=""            (14)
            message-cache-size=""          (15)
            websocket-enabled=""           (16)
            scheduler=""                   (17)
            message-codec=""               (18)
            transport-handlers=""          (19)
            suppress-cors="true" />        (20)
</int-websocket:server-container>
1 组件 Bean 名称。
2 将特定请求映射到 . 支持精确的路径映射 URI(如 )和 ant 样式的路径模式(如 )。WebSocketHandler/myPath/myPath/**
3 Bean 引用。 默认值为 。HandshakeHandlerDefaultHandshakeHandler
4 Bean 引用列表。HandshakeInterceptor
5 装饰用于处理 WebSocket 消息的处理程序的一个或多个工厂 () 的列表。 这对于某些高级用例(例如,允许 Spring Security 强制关闭)可能很有用 当相应的 HTTP 会话过期时的 WebSocket 会话)。 有关更多信息,请参阅Spring Session项目WebSocketHandlerDecoratorFactory
6 请参阅 <int-websocket:client-container> 上的相同选项。
7 请参阅 <int-websocket:client-container> 上的相同选项。
8 WebSocket 会话发送缓冲区溢出策略 确定会话的出站消息缓冲区到达 . 有关可能的值和更多详细信息,请参阅。send-buffer-size-limitConcurrentWebSocketSessionDecorator.OverflowStrategy
9 允许的源标头值。 您可以将多个源指定为逗号分隔列表。 此检查主要针对浏览器客户端设计。 没有什么可以阻止其他类型的客户端修改源标头值。 启用 SockJS 并限制允许的源时,将禁用不对跨源请求(、、 和 )使用源标头的传输类型。 因此,不支持 IE6 和 IE7,并且仅支持 IE8 和 IE9 而不使用 cookie。 默认情况下,允许所有源。jsonp-pollingiframe-xhr-pollingiframe-eventsourceiframe-htmlfile
10 没有本机跨域通信(如 和 )的传输必须从不可见的 iframe 中的“外部”域获取一个简单的页面,以便 iframe 中的代码可以从 SockJS 服务器的本地域运行。 由于 iframe 需要加载 SockJS javascript 客户端库,因此此属性允许您指定从中加载它的位置。 默认情况下,它指向 . 但是,您也可以将其设置为指向应用程序提供的 URL。 请注意,可以指定相对 URL,在这种情况下,该 URL 必须相对于 iframe URL。 例如,假设映射到 的 SockJS 端点和生成的 iframe URL 为 ,相对 URL 必须以“../../“向上遍历到 SockJS 映射上方的位置。 对于基于前缀的 servlet 映射,可能需要再进行一次遍历。eventsourcehtmlfiled1fxtkz8shb9d2.cloudfront.net/sockjs-0.3.4.min.js/sockjs/sockjs/iframe.html
11 在关闭单个 HTTP 流式处理请求之前,可以通过该请求发送的最小字节数。 默认值为(即 128*1024 或 131072 字节)。128K
12 来自 SockJs 终结点的响应中的值。 此属性指示应用程序是否需要 cookie 才能正常运行(例如,用于负载平衡或在 Java Servlet 容器中使用 HTTP 会话)。cookie_needed/infoJSESSIONID
13 服务器未发送任何消息的时间量(以毫秒为单位),在此之后服务器应发送任何消息 向客户端发送检测信号帧,以防止连接中断。 默认值为 (25 秒)。25,000
14 在没有接收连接(即服务器可以通过其向客户端发送数据的活动连接)后,客户端被视为断开连接之前的时间量(以毫秒为单位)。 默认值为 。5000
15 会话在等待来自客户端的下一个 HTTP 轮询请求时可以缓存的服务器到客户端消息数。 默认大小为 。100
16 某些负载均衡器不支持 WebSocket。 将此选项设置为在服务器端禁用 WebSocket 传输。 默认值为 。falsetrue
17 Bean 引用。 如果未提供任何值,则创建一个新实例。 此调度程序实例用于调度检测信号消息。TaskSchedulerThreadPoolTaskScheduler
18 用于编码和解码 SockJS 消息的 Bean 引用。 默认情况下,是 使用,它要求类路径上存在 Jackson 库。SockJsMessageCodecJackson2SockJsMessageCodec
19 Bean 引用列表。TransportHandler
20 是否禁用 SockJS 请求的 CORS 标头自动添加。 默认值为 。false

<int-websocket:outbound-channel-adapter>属性

以下列表显示了该元素的可用属性:<int-websocket:outbound-channel-adapter>Spring中文文档

<int-websocket:outbound-channel-adapter
                          id=""                             (1)
                          channel=""                        (2)
                          container=""                      (3)
                          default-protocol-handler=""       (4)
                          protocol-handlers=""              (5)
                          message-converters=""             (6)
                          merge-with-default-converters=""  (7)
                          auto-startup=""                   (8)
                          phase=""/>                        (9)
1 组件 Bean 名称。 如果未提供该属性,那么将在应用程序上下文中创建并注册此属性作为 Bean 名称。 在本例中,终端节点是使用 Bean name plus 注册的。 并且 是用 bean 别名 plus 注册的。channelDirectChannelidid.adapterMessageHandlerid.handler
2 标识连接到此适配器的通道。
3 对 Bean 的引用,它封装了低级连接和处理操作。 必填。IntegrationWebSocketContainerWebSocketSession
4 对实例的可选引用。 当客户端未请求子协议或它是单个协议处理程序时,使用它。 如果未提供此引用或列表,则默认使用 。SubProtocolHandlerprotocol-handlersPassThruSubProtocolHandler
5 此通道适配器的 Bean 引用列表。 如果只提供单个 Bean 引用,而不提供 ,则该 Bean 引用用作 . 如果未设置此属性或 ,则默认使用 。SubProtocolHandlerdefault-protocol-handlerSubProtocolHandlerdefault-protocol-handlerdefault-protocol-handlerPassThruSubProtocolHandler
6 此通道适配器的 Bean 引用列表。MessageConverter
7 布尔值,指示是否应在任何自定义转换器之后注册默认转换器。 仅当提供此标志时才使用。 否则,将注册所有默认转换器。 默认值为 。 默认转换器为(按顺序):、 和 (如果类路径上存在 Jackson 库)。message-convertersfalseStringMessageConverterByteArrayMessageConverterMappingJackson2MessageConverter
8 指示此终结点是否应自动启动的布尔值。 默认值为 。true
9 此终结点应启动和停止的生命周期阶段。 该值越低,此终结点开始得越早,停止得越晚。 默认值为 。 值可以是负数。 请参阅 SmartLifeCycleInteger.MIN_VALUE

<int-websocket:inbound-channel-adapter>属性

以下列表显示了该元素的可用属性:<int-websocket:outbound-channel-adapter>Spring中文文档

<int-websocket:inbound-channel-adapter
                            id=""  (1)
                            channel=""  (2)
                            error-channel=""  (3)
                            container=""  (4)
                            default-protocol-handler=""  (5)
                            protocol-handlers=""  (6)
                            message-converters=""  (7)
                            merge-with-default-converters=""  (8)
                            send-timeout=""  (9)
                            payload-type=""  (10)
                            use-broker=""  (11)
                            auto-startup=""  (12)
                            phase=""/>  (13)
1 组件 Bean 名称。 如果未设置该属性,那么将在应用程序上下文中创建并注册 a,并将此属性作为 Bean 名称。 在本例中,终端节点是使用 Bean name plus 注册的。channelDirectChannelidid.adapter
2 标识连接到此适配器的通道。
3 应将实例发送到的 Bean 引用。MessageChannelErrorMessage
4 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
5 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
6 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
7 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
8 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
9 如果通道可以阻塞,则向通道发送消息时等待的最长时间(以毫秒为单位)。 例如,如果已达到最大容量,则可以阻止,直到空间可用。QueueChannel
10 要从传入 . 转换的目标的 Java 类型的完全限定名称。 默认值为 。payloadWebSocketMessagejava.lang.String
11 指示此适配器是否将具有代理目标的实例和消息从应用程序上下文发送到 。 当此属性为 时,配置是必需的。 此属性仅在服务器端使用。 在客户端,它被忽略。 默认值为 。non-MESSAGEWebSocketMessageAbstractBrokerMessageHandlertrueBroker Relayfalse
12 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
13 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
1 组件 Bean 名称。
2 Bean 引用。WebSocketClient
3 或到目标 WebSocket 服务。 如果将其用作带有 URI 变量占位符的占位符,则该属性是必需的。uriuriTemplateuriTemplateuri-variables
4 属性值中 URI 变量占位符的逗号分隔值。 这些值将根据它们在 中的顺序替换到占位符中。 请参阅 UriComponents.expand(Object...uriVariableValues)。uriuri
5 握手 HTTP 标头值。Origin
6 WebSocket 会话“发送”超时限制。 默认值为 。10000
7 WebSocket 会话“发送”消息大小限制。 默认值为 。524288
8 WebSocket 会话发送缓冲区溢出策略 确定会话的出站消息缓冲区到达 . 有关可能的值和更多详细信息,请参阅。send-buffer-size-limitConcurrentWebSocketSessionDecorator.OverflowStrategy
9 指示此终结点是否应自动启动的布尔值。 默认值为 ,假定此容器是从 WebSocket 入站适配器启动的。false
10 此终结点应启动和停止的生命周期阶段。 该值越低,此终结点开始得越早,停止得越晚。 默认值为 。 值可以是负数。 请参阅 SmartLifeCycleInteger.MAX_VALUE
11 用于握手请求的 A。MapHttpHeaders
1 组件 Bean 名称。
2 将特定请求映射到 . 支持精确的路径映射 URI(如 )和 ant 样式的路径模式(如 )。WebSocketHandler/myPath/myPath/**
3 Bean 引用。 默认值为 。HandshakeHandlerDefaultHandshakeHandler
4 Bean 引用列表。HandshakeInterceptor
5 装饰用于处理 WebSocket 消息的处理程序的一个或多个工厂 () 的列表。 这对于某些高级用例(例如,允许 Spring Security 强制关闭)可能很有用 当相应的 HTTP 会话过期时的 WebSocket 会话)。 有关更多信息,请参阅Spring Session项目WebSocketHandlerDecoratorFactory
6 请参阅 <int-websocket:client-container> 上的相同选项。
7 请参阅 <int-websocket:client-container> 上的相同选项。
8 WebSocket 会话发送缓冲区溢出策略 确定会话的出站消息缓冲区到达 . 有关可能的值和更多详细信息,请参阅。send-buffer-size-limitConcurrentWebSocketSessionDecorator.OverflowStrategy
9 允许的源标头值。 您可以将多个源指定为逗号分隔列表。 此检查主要针对浏览器客户端设计。 没有什么可以阻止其他类型的客户端修改源标头值。 启用 SockJS 并限制允许的源时,将禁用不对跨源请求(、、 和 )使用源标头的传输类型。 因此,不支持 IE6 和 IE7,并且仅支持 IE8 和 IE9 而不使用 cookie。 默认情况下,允许所有源。jsonp-pollingiframe-xhr-pollingiframe-eventsourceiframe-htmlfile
10 没有本机跨域通信(如 和 )的传输必须从不可见的 iframe 中的“外部”域获取一个简单的页面,以便 iframe 中的代码可以从 SockJS 服务器的本地域运行。 由于 iframe 需要加载 SockJS javascript 客户端库,因此此属性允许您指定从中加载它的位置。 默认情况下,它指向 . 但是,您也可以将其设置为指向应用程序提供的 URL。 请注意,可以指定相对 URL,在这种情况下,该 URL 必须相对于 iframe URL。 例如,假设映射到 的 SockJS 端点和生成的 iframe URL 为 ,相对 URL 必须以“../../“向上遍历到 SockJS 映射上方的位置。 对于基于前缀的 servlet 映射,可能需要再进行一次遍历。eventsourcehtmlfiled1fxtkz8shb9d2.cloudfront.net/sockjs-0.3.4.min.js/sockjs/sockjs/iframe.html
11 在关闭单个 HTTP 流式处理请求之前,可以通过该请求发送的最小字节数。 默认值为(即 128*1024 或 131072 字节)。128K
12 来自 SockJs 终结点的响应中的值。 此属性指示应用程序是否需要 cookie 才能正常运行(例如,用于负载平衡或在 Java Servlet 容器中使用 HTTP 会话)。cookie_needed/infoJSESSIONID
13 服务器未发送任何消息的时间量(以毫秒为单位),在此之后服务器应发送任何消息 向客户端发送检测信号帧,以防止连接中断。 默认值为 (25 秒)。25,000
14 在没有接收连接(即服务器可以通过其向客户端发送数据的活动连接)后,客户端被视为断开连接之前的时间量(以毫秒为单位)。 默认值为 。5000
15 会话在等待来自客户端的下一个 HTTP 轮询请求时可以缓存的服务器到客户端消息数。 默认大小为 。100
16 某些负载均衡器不支持 WebSocket。 将此选项设置为在服务器端禁用 WebSocket 传输。 默认值为 。falsetrue
17 Bean 引用。 如果未提供任何值,则创建一个新实例。 此调度程序实例用于调度检测信号消息。TaskSchedulerThreadPoolTaskScheduler
18 用于编码和解码 SockJS 消息的 Bean 引用。 默认情况下,是 使用,它要求类路径上存在 Jackson 库。SockJsMessageCodecJackson2SockJsMessageCodec
19 Bean 引用列表。TransportHandler
20 是否禁用 SockJS 请求的 CORS 标头自动添加。 默认值为 。false
1 组件 Bean 名称。 如果未提供该属性,那么将在应用程序上下文中创建并注册此属性作为 Bean 名称。 在本例中,终端节点是使用 Bean name plus 注册的。 并且 是用 bean 别名 plus 注册的。channelDirectChannelidid.adapterMessageHandlerid.handler
2 标识连接到此适配器的通道。
3 对 Bean 的引用,它封装了低级连接和处理操作。 必填。IntegrationWebSocketContainerWebSocketSession
4 对实例的可选引用。 当客户端未请求子协议或它是单个协议处理程序时,使用它。 如果未提供此引用或列表,则默认使用 。SubProtocolHandlerprotocol-handlersPassThruSubProtocolHandler
5 此通道适配器的 Bean 引用列表。 如果只提供单个 Bean 引用,而不提供 ,则该 Bean 引用用作 . 如果未设置此属性或 ,则默认使用 。SubProtocolHandlerdefault-protocol-handlerSubProtocolHandlerdefault-protocol-handlerdefault-protocol-handlerPassThruSubProtocolHandler
6 此通道适配器的 Bean 引用列表。MessageConverter
7 布尔值,指示是否应在任何自定义转换器之后注册默认转换器。 仅当提供此标志时才使用。 否则,将注册所有默认转换器。 默认值为 。 默认转换器为(按顺序):、 和 (如果类路径上存在 Jackson 库)。message-convertersfalseStringMessageConverterByteArrayMessageConverterMappingJackson2MessageConverter
8 指示此终结点是否应自动启动的布尔值。 默认值为 。true
9 此终结点应启动和停止的生命周期阶段。 该值越低,此终结点开始得越早,停止得越晚。 默认值为 。 值可以是负数。 请参阅 SmartLifeCycleInteger.MIN_VALUE
1 组件 Bean 名称。 如果未设置该属性,那么将在应用程序上下文中创建并注册 a,并将此属性作为 Bean 名称。 在本例中,终端节点是使用 Bean name plus 注册的。channelDirectChannelidid.adapter
2 标识连接到此适配器的通道。
3 应将实例发送到的 Bean 引用。MessageChannelErrorMessage
4 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
5 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
6 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
7 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
8 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
9 如果通道可以阻塞,则向通道发送消息时等待的最长时间(以毫秒为单位)。 例如,如果已达到最大容量,则可以阻止,直到空间可用。QueueChannel
10 要从传入 . 转换的目标的 Java 类型的完全限定名称。 默认值为 。payloadWebSocketMessagejava.lang.String
11 指示此适配器是否将具有代理目标的实例和消息从应用程序上下文发送到 。 当此属性为 时,配置是必需的。 此属性仅在服务器端使用。 在客户端,它被忽略。 默认值为 。non-MESSAGEWebSocketMessageAbstractBrokerMessageHandlertrueBroker Relayfalse
12 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。
13 请参阅 <int-websocket:outbound-channel-adapter> 上的相同选项。

ClientStompEncoder

从版本 4.3.13 开始,Spring Integration 提供(作为标准的扩展)用于 WebSocket 通道适配器的客户端。 为了正确准备客户端消息,必须将 的实例注入 . 默认值的一个问题是它是为服务器端设计的,因此它将标头更新为 (根据服务器端的 STOMP 协议的要求)。 如果客户端未在正确的 Web 套接字框架中发送其消息,则某些 STOMP 代理不接受它们。 在本例中,的用途是重写标头并将其设置为值,然后再将消息编码为 .ClientStompEncoderStompEncoderClientStompEncoderStompSubProtocolHandlerStompSubProtocolHandlerSENDstompCommandMESSAGESENDClientStompEncoderstompCommandSENDbyte[]Spring中文文档

动态 WebSocket 端点注册

从版本 5.5 开始,现在可以在运行时注册(和删除)WebSocket 服务器端点(基于 的通道适配器)——映射的 a 通过 a 公开并可供 WebSocket 客户端访问。 动态和运行时集成流支持有助于以透明的方式注册这些端点:ServerWebSocketContainerpathsServerWebSocketContainerHandlerMappingDispatcherServletSpring中文文档

@Autowired
IntegrationFlowContext integrationFlowContext;

@Autowired
HandshakeHandler handshakeHandler;
...
ServerWebSocketContainer serverWebSocketContainer =
       new ServerWebSocketContainer("/dynamic")
               .setHandshakeHandler(this.handshakeHandler);

WebSocketInboundChannelAdapter webSocketInboundChannelAdapter =
       new WebSocketInboundChannelAdapter(serverWebSocketContainer);

QueueChannel dynamicRequestsChannel = new QueueChannel();

IntegrationFlow serverFlow =
       IntegrationFlow.from(webSocketInboundChannelAdapter)
               .channel(dynamicRequestsChannel)
               .get();

IntegrationFlowContext.IntegrationFlowRegistration dynamicServerFlow =
       this.integrationFlowContext.registration(serverFlow)
               .addBean(serverWebSocketContainer)
               .register();
...
dynamicServerFlow.destroy();
调用动态流注册以将 的实例添加到 for 终结点注册中非常重要。 当动态流注册被销毁时,关联的实例以及相应的端点注册(包括 URL 路径映射)也会被销毁。.addBean(serverWebSocketContainer)ServerWebSocketContainerApplicationContextServerWebSocketContainer
动态 Websocket 端点只能通过 Spring Integration 机制注册:当使用常规 Spring 时,Spring Integration 配置会回退,并且不会注册动态端点的基础设施。@EnableWebsocket
调用动态流注册以将 的实例添加到 for 终结点注册中非常重要。 当动态流注册被销毁时,关联的实例以及相应的端点注册(包括 URL 路径映射)也会被销毁。.addBean(serverWebSocketContainer)ServerWebSocketContainerApplicationContextServerWebSocketContainer
动态 Websocket 端点只能通过 Spring Integration 机制注册:当使用常规 Spring 时,Spring Integration 配置会回退,并且不会注册动态端点的基础设施。@EnableWebsocket