Scheduled websocket push with Springboot

First of all you can't send (push) messages to clients without their subscriptions.

Secondly to send messages to all subscribers you should take a look to the topic abstraction side.

That is a fundamentals of STOMP.

I think you are fine with @Scheduled, but you just need to inject SimpMessagingTemplate to send messages to the STOMP broker for pushing afterwards.

Also see Spring WebSockets XML configuration not providing brokerMessagingTemplate


Before starting, make sure that you have the websocket dependencies in your pom.xml. For instance, the most important one:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

Then, you need to have your configuration in place. I suggest you start with simple broker.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/portfolio").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes("/app");
        config.enableSimpleBroker("/topic", "/queue");
    }

}

Then your controller should look like this. When your AngularJs app opens a connection on /portfolio and sends a subscription to channel /topic/greeting, you will reach the controller and respond to all subscribed users.

@Controller
public class GreetingController {
    
    @MessageMapping("/greeting")
    public String handle(String greeting) {
        return "[" + getTimestamp() + ": " + greeting;
    }
}

With regard to your scheduler question, you need to enable it via configuration:

@Configuration
@EnableScheduling
public class SchedulerConfig{}

And then schedule it:

@Component
public class ScheduledUpdatesOnTopic{

    @Autowired
    private SimpMessagingTemplate template;
    @Autowired
    private final MessagesSupplier messagesSupplier;

    @Scheduled(fixedDelay=300)
    public void publishUpdates(){
        template.convertAndSend("/topic/greetings", messagesSupplier.get());
    }
}

Hope this somehow clarified the concept and steps to be taken to make things work for you.