package org.springblade.websocket.config;


import org.springblade.websocket.constant.WebsocketConstant;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 * WebSocketConfig
 *
 * @author rajeevkumarsingh
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

	/**
	 * 添加这个Endpoint，这样在网页中就可以通过websocket连接上服务,也就是我们配置websocket的服务地址,并且可以指定是否使用socketjs
	 * @param registry
	 */
	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {

		/*
		 * 1. 将 /serviceName/stomp/websocketJs路径注册为STOMP的端点，
		 *    用户连接了这个端点后就可以进行websocket通讯，支持socketJs
		 * 2. setAllowedOrigins("*")表示可以跨域
		 * 3. withSockJS()表示支持socktJS访问
		 * 4. addInterceptors 添加自定义拦截器，这个拦截器是上一个demo自己定义的获取httpsession的拦截器
		 * 5. addInterceptors 添加拦截处理，这里MyPrincipalHandshakeHandler 封装的认证用户信息
		 */
//		registry.addEndpoint("/stomp/websocketJS")
//			//.setAllowedOrigins("*")
//			.addInterceptors(new WebSocketHandshakeInterceptor())
//			.setHandshakeHandler(new MyPrincipalHandshakeHandler())
//			.withSockJS();

		// 可以添加多个端点
		registry.addEndpoint("/ws")
			.setAllowedOrigins("*")		// 分布式微服务需要开启跨域
			.withSockJS();
	}

	/**
	 * 配置消息代理，哪种路径的消息会进行代理处理
	 * @param registry
	 */
	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {

		/**
		 * "/app" 为配置应用服务器的地址前缀，表示所有以 /app 开头的客户端消息或请求都会路由到带有 @MessageMapping 注解的方法中
		 */
		registry.setApplicationDestinationPrefixes("/app");


		// 自定义调度器，用于控制心跳线程
		ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
		// 线程池线程数，心跳连接开线程
		taskScheduler.setPoolSize(1);
		// 线程名前缀
		taskScheduler.setThreadNamePrefix("websocket-heartbeat-thread-");
		// 初始化
		taskScheduler.initialize();

		/**
		 * spring 内置broker对象
		 * 1、配置代理域，可以配置多个，此段代码配置代理目的地的前缀为 /topic，我们就可以在配置的域上向客户端推送消息；
		 * 2、进行心跳设置，第一值表示server最小能保证发的心跳间隔毫秒数, 第二个值代码server希望client发的心跳间隔毫秒数；
		 * 3、可以配置心跳线程调度器 setHeartbeatValue这个不能单独设置，不然不起作用，要配合setTaskScheduler才可以生效，
		 * 调度器我们可以自己写一个，也可以自己使用默认的调度器 new DefaultManagedTaskScheduler()
		 */
		registry.enableSimpleBroker(WebsocketConstant.DESTINATION_PREFIX)
//			.setHeartbeatValue(new long[]{10000, 10000})
//			.setTaskScheduler(taskScheduler)
		;

		// Use this for enabling a Full featured broker like RabbitMQ
		/*registry.enableStompBrokerRelay("/topic")
			.setRelayHost("localhost")
			.setRelayPort(61613)
			.setClientLogin("guest")
			.setClientPasscode("guest");*/
	}

	/**
	 * 配置发送与接收的消息参数，可以指定消息字节大小，缓存大小，发送超时时间
	 */
//	@Override
//	public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
//		registry.setMessageSizeLimit(500 * 1024);
//		registry.setSendBufferSizeLimit(1024 * 1024);
//		registry.setSendTimeLimit(20000);
//	}

}
