Contents
see List
필요 maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${org.springframework-version}</version>
</dependency>
//Stomp 전역 세션관리를 위한 싱글톤빈
public class StompSetBean {
private Set<CommStompSesBean> connections = new CopyOnWriteArraySet<CommStompSesBean>();
public Set<CommStompSesBean> getConnections() {
return connections;
}
}
//Stomp 접속 및 해제 핸들러
public class StompHandler extends ChannelInterceptorAdapter {
@Autowired
private CommMainService service;
@Autowired
private StompSetBean sesBean;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(message);
if (sha.getCommand() == null) {
return;
}
Set<CommStompSesBean> conns = sesBean.getConnections();
String sessionId = sha.getSessionId();
String userId = sha.getUser().getName();
CommStompSesBean commStompSesBean = new CommStompSesBean(userId,sessionId);
switch (sha.getCommand()) {
case CONNECT:
conns.add(commStompSesBean);
conns.stream().forEach(value -> logger.info(value.toString()));
break;
case DISCONNECT:
conns.remove(commStompSesBean);
break;
default:
break;
}
}
}
//Stomp 설정을 위한 config
@Configuration
@EnableWebSocketMessageBroker
public class StopmConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Value("${hdl.comm.echo.stomp.url}")
private String echoUrl;
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint(echoUrl);//서버 쪽 연결
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");//클라이언트 메세지
registry.setApplicationDestinationPrefixes("/app");//서버 전송 메세지
}
@Bean
public StompSetBean stompSetBean() {
return new StompSetBean();
}
@Bean
public StompHandler stompHandler() {
return new StompHandler();
}
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(50);
return executor;
}
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
return scheduler;
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.setInterceptors(stompHandler());
}
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
registration.taskExecutor().corePoolSize(8);
registration.setInterceptors(stompHandler());
}
}
//컨트롤러
@Controller
public class CommStompController {
@Autowired
private SimpMessagingTemplate template;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private StompSetBean sesBean;
@MessageMapping("${hdl.comm.echo.stomp.url}")
public void sendEcho(CommStompSesBean hello, Principal principal,SimpMessageHeaderAccessor headerAccessor)throws Exception {
Set<CommStompSesBean> conns = sesBean.getConnections();
hello.setWsId(principal.getName());//보내는사람
Map<String, Object> ss = headerAccessor.getMessageHeaders();
logger.info(ss.toString());
if(PhychodeUtil.isNotEmpty(hello.getUserId())){
template.convertAndSendToUser(hello.getUserId(), "/topic/echo",hello);//개인쪽지
logger.info(hello.toString());
}else{
conns.stream().forEach(ses -> {
if(!ses.getUserId().equals(hello.getWsId())){
hello.setUserId(ses.getUserId());//받는사람
logger.info(hello.toString());
template.convertAndSendToUser(ses.getUserId(), "/topic/echo",hello);//전체쪽지
}
});
}
//template.convertAndSend("/topic/echo","dd");
}
}
//client
$name = '';
$message = '지랄';
function init() {
var socket = new WebSocket('ws://'+location.host+'<c:url value="${echoUrl}"/>');
$client = Stomp.over(socket); //Stomp client 구성
$client.connect({}, function(frame) {
console.log('connected stomp over sockjs');
// subscribe message
$client.subscribe('/user/topic/echo', function(message) {
console.log('receive subscribe');
alert(message);
});
});
};
// send message
function send() {
var data = {
userId: $name,
msg: $message
};
$client.send('/app${echoUrl}', {}, JSON.stringify(data));
};
Comments ( 0 )