필요 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));
};