Angular .ts
async ngOnInit(): Promise<void> {
if (this.stateStorageService.getUsuarioLogado() !== null) {
this.webSocketServer();
}
}
private webSocketServer(): void {
let stompClient = Stomp.over(() => {
return new SockJs(
environment.PES + "ws?access_token=" + this.authService.accessToken
);
});
stompClient.connect({}, () => {
stompClient.subscribe(
"/user/queue/mensagemsistema",
(notification: any) => {
let message = JSON.parse(notification.body);
this.notifications = message.count;
}
);
});
}
java
package br.com.ghnetsoft.forca_venda.pessoa.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
config.enableSimpleBroker("/queue");
config.setUserDestinationPrefix("/user");
}
@Override
public void registerStompEndpoints(final StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
}
Toda mensagem vem para este service.
package br.com.ghnetsoft.forca_venda.pessoa.service;
import static java.util.Map.of;
import static org.springframework.data.domain.Sort.Direction.DESC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import br.com.ghnetsoft.forca_venda.model.Empresa;
import br.com.ghnetsoft.forca_venda.model.Usuario;
import br.com.ghnetsoft.forca_venda.model.UsuarioEmpresa;
import br.com.ghnetsoft.forca_venda.pessoa.dto.UsuarioPesquisaEnvioDTO;
import br.com.ghnetsoft.principal.service.PrincipalService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class MensagemSistemaUsuarioAscService extends PrincipalService {
private static final long serialVersionUID = 2126849736663259385L;
@Autowired
private transient SimpMessagingTemplate simpMessagingTemplate;
@Autowired
private MensagemSistemaService mensagemSistemaService;
@Autowired
private UsuarioEmpresaService usuarioEmpresaService;
@Async("apiPessoaExecutor-")
public void processa(final Usuario usuario) {
log.info("processa - usuario: " + usuario.toString());
final Empresa empresa = buscarEmpresa(usuario);
for (final UsuarioEmpresa usuarioSalvar : usuarioEmpresaService.todosUsuariosPorTipoAndEmpresa(empresa.getId(), usuario.getTipoUsuario())) {
log.info("usuarioSalvar: " + usuarioSalvar.getId());
envia(usuarioSalvar.getUsuario(), empresa);
}
}
private void envia(final Usuario usuario, final Empresa empresa) {
log.info("envia - usuario: " + usuario.toString());
simpMessagingTemplate.convertAndSendToUser(usuario.getId(), "/queue/mensagemsistema", of("count", mensagemSistemaService.contadorMensagemUsuario(usuario.getId(), empresa.getId())));
}
private Empresa buscarEmpresa(final Usuario usuario) {
log.info("buscarEmpresa - usuario: " + usuario.toString());
final UsuarioPesquisaEnvioDTO dtoPesquisa = UsuarioPesquisaEnvioDTO.builder().build();
dtoPesquisa.setCampo("id");
dtoPesquisa.setDirecao(DESC.name());
dtoPesquisa.setPaginaAtual(0);
dtoPesquisa.setQuantidadeRegistros(1);
log.info("dtoPesquisa: " + dtoPesquisa.toString());
return usuarioEmpresaService.buscaEmpresaPorUsuarioAdministrador(dtoPesquisa, usuario.getId()).getContent().get(0);
}
}
O método envia que faz o serviço de mensageria.
Não dá erro, mas quando o usuário entra e tem mensagem para ele, o contador não fica correto. Só com o valor 0.
O que está faltando ?
Só ficar assim:
Mas deveria ficar assim: