标签: spring-websocket

使用Spring 4 Websockets声明并使用RabbitMQ

在我们当前的应用程序中,我们以这种方式使用Spring AMQP:

<rabbit:connection-factory  id="cachingConnectionFactory" 
                            username="${rabbitmq.connection.username}"
                            password="${rabbitmq.connection.password}"
                            host="${rabbitmq.connection.host}" 
                            port="${rabbitmq.connection.port}"
                            executor="rabbitmqPoolTaskExecutor"
                            requested-heartbeat="${rabbitmq.connection.requested-heartbeat}"
                            channel-cache-size="${rabbitmq.connection.channel-cache-size}"
                            virtual-host="${rabbitmq.connection.virtual-host}" />

<rabbit:admin   id="adminRabbit" 
                connection-factory="cachingConnectionFactory"
                auto-startup="true" />

<rabbit:template    id="rabbitTemplate"
                    connection-factory="cachingConnectionFactory"
                    exchange="v1.general.exchange"
                    message-converter="jsonMessageConverter" 
                    encoding="${rabbitmq.template.encoding}"
                    channel-transacted="${rabbitmq.template.channel-transacted}" />

<rabbit:queue id="v1.queue.1" name="v1.queue.1"  />
<rabbit:queue id="v1.queue.2" name="v1.queue.2" />
<rabbit:queue id="v1.queue.3" name="v1.queue.3" />

<fanout-exchange name="v1.general.exchange" xmlns="http://www.springframework.org/schema/rabbit" >
    <bindings>
        <binding queue="v1.queue.1" />
        <binding queue="v1.queue.2" />
        <binding queue="v1.queue.3" />
    </bindings>
</fanout-exchange>

<listener-container xmlns="http://www.springframework.org/schema/rabbit"
                    connection-factory="cachingConnectionFactory" 
                    message-converter="jsonMessageConverter" 
                    task-executor="rabbitmqPoolTaskExecutor"
                    auto-startup="${rabbitmq.listener-container.auto-startup}"
                    concurrency="${rabbitmq.listener-container.concurrency}"
                    channel-transacted="${rabbitmq.listener-container.channel-transacted}"
                    prefetch="${rabbitmq.listener-container.prefetch}"
                    transaction-size="${rabbitmq.listener-container.transaction-size}" >

    <listener id="v1.listener.queue.1" ref="listener1" method="handleMessage" queues="v1.queue.1" />
    <listener id="v1.listener.queue.2" ref="listener2" method="handleMessage" queues="v1.queue.2" />
    <listener id="v1.listener.queue.3" ref="listener3" …
Run Code Online (Sandbox Code Playgroud)

spring-4 spring-messaging spring-websocket

3
推荐指数
1
解决办法
5062
查看次数

Spring Boot WebSocket Rabbitmq Stomp Broker不保持连接

找不到与此特定错误相关的任何其他问题.

我似乎无法用RabbitMQ连接我的Spring Boot WebSocket演示项目.请注意,使用"简单"代理时一切正常,但是当使用Rabbit连接stomp代理时,我收到以下错误(继续尝试重新连接):

Java HotSpot(TM) Client VM warning: You have loaded library /tmp/libnetty-transport-native-epoll8916930274033685449.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
2016-03-07 22:35:13.993  INFO 4047 --- [           main] o.s.m.s.s.StompBrokerRelayMessageHandler : Started.
2016-03-07 22:35:14.045  INFO 4047 --- [eactor-tcp-io-1] r.io.net.impl.netty.tcp.NettyTcpClient   : CONNECTED: [id: 0x034a269f, /127.0.0.1:39955 => /127.0.0.1:25672]
2016-03-07 22:35:14.151  INFO 4047 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer …
Run Code Online (Sandbox Code Playgroud)

rabbitmq spring-boot spring-websocket java-websocket spring-rabbitmq

3
推荐指数
1
解决办法
2311
查看次数

添加 STOMP 标头而不在 ChannelInterceptorAdapter 上重新创建消息

我需要向 STOMP 消息添加标头,目前它的工作方式如下,但我正在重新创建消息,是否可以只添加本机标头而不必重新创建消息以提高性能。

public class MyChannelInterceptor extends ChannelInterceptorAdapter {


    @Override
      public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);

        StompCommand command = accessor.getCommand();
        if(command != null) {
            log.debug("Receiving msg {} from {}",command,accessor.getUser().getName());
            if(command == StompCommand.SEND) {
                log.debug("Adding expires header to  msg {} from {}",command,accessor.getUser().getName());
                String ttlString = accessor.getFirstNativeHeader("ttl");
                long ttl = 30000;
                try {
                    ttl = Long.parseLong(ttlString);
                } 
                catch(Exception ex) {
                    log.error("TTL header received but not in correct format {}",ttlString);
                }
                accessor.addNativeHeader("expires", Long.toString(System.currentTimeMillis() + ttl));

                return MessageBuilder.createMessage(message.getPayload(), accessor.getMessageHeaders()); …
Run Code Online (Sandbox Code Playgroud)

spring-messaging spring-websocket

3
推荐指数
1
解决办法
1888
查看次数

Spring Stomp over Websocket:流式传输大文件

我在网页中的 SockJs 客户端发送帧大小为 16K 的消息。消息大小限制决定了我可以传输的文件的最大大小。

以下是我在文档中找到的内容。

/**
 * Configure the maximum size for an incoming sub-protocol message.
 * For example a STOMP message may be received as multiple WebSocket messages
 * or multiple HTTP POST requests when SockJS fallback options are in use.
 *
 * <p>In theory a WebSocket message can be almost unlimited in size.
 * In practice WebSocket servers impose limits on incoming message size.
 * STOMP clients for example tend to split large messages around 16K
 * …
Run Code Online (Sandbox Code Playgroud)

java spring stomp sockjs spring-websocket

3
推荐指数
1
解决办法
6895
查看次数

Spring websocket STOMP取消订阅eventHandler

我有一个Spring Websocket Stomp应用程序,它接受SUBSCRIBE请求.

在应用程序中,我有一个SUBSCRIBE的处理程序,即

 @Component
 public class SubscribeStompEventHandler implements ApplicationListener<SessionSubscribeEvent> {

    @Override
    public void onApplicationEvent(SessionSubscribeEvent event) {}
 }
Run Code Online (Sandbox Code Playgroud)

我用来验证订阅.

如果订阅无效,例如,当前用户看不到该订阅,我希望Broker(我使用SimpleMessagingBroker)"忘记"该订阅,或者最好不要注册它.

我的问题是:

  • 如果我将订阅请求的处理移动到传入的消息拦截器并停止消息传播,我可以让Broker不注册订阅吗?

  • 还有什么可以从这个事件处理程序中取消订阅?

java spring stomp spring-websocket

3
推荐指数
1
解决办法
2278
查看次数

在运行时从后端 java 类连接到 Web-Socket-Server

我已经使用 spring 实现了以下 Web-Socket-Server。我们不想使用 STOMP 和 JSocks。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(new WebSocketServerHandler(), "/websocket/user/{userId}");
  }

}




@Service
public class WebSocketServerHandler extends TextWebSocketHandler {

   private List<WebSocketSession> sessions = new ArrayList<WebSocketSession>();

   @Override
   public void handleTextMessage(WebSocketSession session, TextMessage message)
        throws Exception {

        session.sendMessage(message);           
   }

   @Override
   public void afterConnectionEstablished(WebSocketSession session) throws Exception {
     sessions.add(session);
   }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
      sessions = null;
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我可以从前端客户端(浏览器)成功连接到该 Web-Socket-Server。现在我想在运行时从我的一些 java 类连接到那个 Web-Socket-Server,然后想向那个 …

java spring-websocket java-websocket

3
推荐指数
1
解决办法
2255
查看次数

@MessageMapping 不适用于 Spring Security 和 MVC

我有一个使用 Spring MVC 和 Security 的应用程序。我尝试向其中添加 Websocket。我已经成功连接,但是,当我尝试向后端发送消息时 - 什么也没发生。在调试模式下用@MessageMapping 注释的方法根本达不到!我不知道为什么。我已经尝试了很多谷歌解决方案,所以现在所有的配置都是下一个:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    public WebSocketConfig() {
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/hello1").withSockJS();
    }
}
Run Code Online (Sandbox Code Playgroud)

我还为 websockets 添加了安全配置

@Configuration
public class SecuritySocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    protected boolean sameOriginDisabled() {
        return true;
    }

    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.simpDestMatchers("/hello1").authenticated().simpDestMatchers("/app/hello1").authenticated();//permitAll();

    }
} 
Run Code Online (Sandbox Code Playgroud)

控制器类

@Controller
public class WebsocketController {

    @MessageMapping("/hello1")
    public void send(Message message) {
        String name = …
Run Code Online (Sandbox Code Playgroud)

java spring-mvc spring-security websocket spring-websocket

3
推荐指数
1
解决办法
1754
查看次数

使用 Spring 公开有关当前 Websocket 连接的指标

对于我的仪表板应用程序,我想使用内部 Spring 指标监控基于 Spring Boot 的应用程序。因此,我使用了spring-boot-actuator暴露许多内部指标的依赖项。有很多基于 HTTP 的指标和 Tomcat 指标,例如当前会话、状态 X 的 HTTP 调用量等。我找不到有关我的 Websocket 连接的任何信息。

是否有任何内置的现成指标公开工具用于当前的 Websocket 与 Spring 或我是否必须创建自己的指标(例如,用于使用 Prometheus 在 Grafana 中显示数据)并且必须手动注册例如一个计数器当我收到SessionConnectEventSessionConnectEvent?

提前致谢!

java spring metrics spring-boot spring-websocket

3
推荐指数
2
解决办法
3333
查看次数

Spring WebSocket简单示例 - java.lang.IllegalStateException:意外使用调度程序

我正在尝试在不使用STOMP的情况下在Spring中实现WebSocket服务器,请阅读以下文章:http://www.devglan.com/spring-boot/spring-websocket-integration-example-without-stomp

WebSocketConfig.java

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired private WebSocketHandler webSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler, "/app");
    }

}
Run Code Online (Sandbox Code Playgroud)

WebSocketHandler

@Component
public class WebSocketHandler extends TextWebSocketHandler {

    private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        sessions.add(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
        // ...
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,我在启动时遇到此异常:

java.lang.IllegalStateException: Unexpected use of scheduler.
at org.springframework.web.socket.config.annotation.WebSocketConfigurationSupport$NoOpScheduler.schedule(WebSocketConfigurationSupport.java:108) ~[spring-websocket-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.scheduling.config.ScheduledTaskRegistrar.scheduleCronTask(ScheduledTaskRegistrar.java:414) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.scheduling.config.ScheduledTaskRegistrar.scheduleTasks(ScheduledTaskRegistrar.java:352) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:332) …
Run Code Online (Sandbox Code Playgroud)

spring websocket spring-boot spring-websocket

3
推荐指数
1
解决办法
1912
查看次数

如何在 fiddler 中解码 websocket 消息?

我使用 Fiddler 记录 websockets,但消息编码。我已将屏幕截图与消息示例附加到此问题。

如果有任何解决方法如何解码它?

感谢您的关注。

消息

https fiddler network-traffic websocket spring-websocket

3
推荐指数
1
解决办法
1252
查看次数