All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.vyukov.stomp.StompClientBootstrapConfiguration Maven / Gradle / Ivy

The newest version!
package ru.vyukov.stomp;

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Role;
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.stomp.StompSessionHandler;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.messaging.WebSocketStompClient;

import java.util.List;

import static ru.vyukov.stomp.StompClientConfigUtils.STOMP_SUBSCRIBE_ANNOTATION_BEAN_POST_PROCESSOR_BEAN_NAME;
import static ru.vyukov.stomp.StompClientConfigUtils.STOMP_SUBSCRIBE_ENDPOINT_REGISTRY_BEAN_NAME;

/**
 * @author Oleg Vyukov
 */
@Configuration
@ConditionalOnProperty(value = "stomp.client.enabled", matchIfMissing = true)
public class StompClientBootstrapConfiguration {


    @Autowired
    private ApplicationEventPublisher eventPublisher;


    @Bean(STOMP_SUBSCRIBE_ANNOTATION_BEAN_POST_PROCESSOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public StompSubscribeAnnotationBeanPostProcessor stompListenerAnnotationBeanPostProcessor() {
        return new StompSubscribeAnnotationBeanPostProcessor();
    }

    @Bean(STOMP_SUBSCRIBE_ENDPOINT_REGISTRY_BEAN_NAME)
    public SubscribeEndpointRegistry subscribeEndpointRegistry() {
        return new SubscribeEndpointRegistry();
    }


    @Bean
    @ConfigurationProperties("stomp.client")
    public StompClientProperties wsConfig() {
        return new StompClientProperties();
    }

    @Bean
    SimpMessagingTemplate simpMessagingTemplate() {
        SimpMessagingTemplate simpMessagingTemplate = new SimpMessagingTemplate(stompMessageChannel());
        simpMessagingTemplate.setMessageConverter(messageConverter());
        return simpMessagingTemplate;
    }


    @Bean
    @ConditionalOnMissingBean
    WebSocketStompClient webSocketStompClient() {
        WebSocketStompClient webSocketStompClient = new WebSocketStompClient(new StandardWebSocketClient());
        webSocketStompClient.setTaskScheduler(taskScheduler());
        webSocketStompClient.setMessageConverter(messageConverter());
        return webSocketStompClient;
    }


    @Bean(destroyMethod = "stop")
    @DependsOn(STOMP_SUBSCRIBE_ANNOTATION_BEAN_POST_PROCESSOR_BEAN_NAME)
    StompMessageChannel stompMessageChannel() {

        ConnectConfig config = new ConnectConfig(wsConfig(), sessionHandler());
        StompMessageChannel stompMessageChannel = new StompMessageChannel(webSocketStompClient(), config, taskScheduler());

        return stompMessageChannel;
    }

    @Bean
    StompSessionHandler sessionHandler() {
        StompSessionHandler sessionHandler = new SubscribeMethodsInvokerSessionHandler(subscribeEndpointRegistry(), eventPublisher);
        return sessionHandler;
    }

    @Bean
    TaskScheduler taskScheduler() {
        return new ConcurrentTaskScheduler();
    }




    @Bean
    @ConditionalOnMissingBean
    MessageConverter messageConverter() {
        MappingJackson2MessageConverter mappingJackson2MessageConverter = new MappingJackson2MessageConverter();

        List modules = ObjectMapper.findModules(getClass().getClassLoader());

        mappingJackson2MessageConverter.getObjectMapper().registerModules(modules);
        return mappingJackson2MessageConverter;
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy