Запланированное сетевое подключение с помощью Springboot

Я новичок в весенней загрузке и весне в целом. Меня бросили в проект, и мое первое "упражнение", чтобы намочить ноги, - это создать простую функцию подачи новостей на передней панели, которая будет автоматически обновляться через уведомления о переносе через веб-узел.

Применяемые технологии:

  • Угловая для общего внешнего применения
  • SockJS для создания веб-рассылки
  • Stomp над webosocket для получения сообщений от брокера сообщений
  • Стержни
  • Stomp Message Broker (инфраструктура, связанная с Java)

Чего я хочу достичь на лицевой стороне:

  1. Создайте соединение с веб-сокетом при загрузке представления
  2. Создайте поставщика stomp, используя этот websocket
  3. Подпишитесь на мой клиент
  4. Catch-сервер пересылает сообщения и обновляет угловой вид

Что касается кода на стороне сервера:

  1. Настройте материал websocket и управляйте соединением
  2. @Scheduled ли сервер сообщения каждые X раз (через исполнителя или @Scheduled?).

Я думаю, что до сих пор я достиг всего, кроме последней части кода на стороне сервера. В следующем примере я использовал websocket в полнодуплексном режиме, и когда клиент отправляет что-то, сервер немедленно отвечает на очередь сообщений и обновляется все подписываемые клиенты. Но я хочу, чтобы сервер сам отправлял что-то поверх Stomp БЕЗ ожидания клиента, чтобы делать какие-либо запросы.

Сначала я создал @Controller и добавил к нему метод с @SendTo("/my/subscribed/path"). Однако я не знаю, как его запустить. Также я попытался добавить @Scheduled но эта аннотация работает только с методами с возвращаемым типом void (и я возвращаю объект NewsMessage).

По сути, мне нужно, чтобы клиент инициализировал соединение с websocket, и после того, как сервер начал нажимать на него сообщения через заданный интервал (или всякий раз, когда событие запускается, это не имеет значения сейчас). Кроме того, каждый новый клиент должен прослушивать одну и ту же очередь сообщений и получать те же сообщения.

Ответ 1

Прежде всего, вам нужно, чтобы ваш websocket включен весной, прежде чем убедитесь, что у вас есть зависимости от вашего pom.xml

Например, наиболее важный:

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

Затем вам нужно иметь свою конфигурацию. Я предлагаю вам начать с простого брокера.

@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");
    }

}

Тогда ваш контроллер должен выглядеть так. Когда ваше приложение AngularJs откроет соединение в '/portfolio' и отправит подписку на этот канал /topic/greeeting вы получите это в контроллере и ответите всем подписчикам.

@Controller
public class GreetingController {

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

Что касается вопроса о планировщике, вам необходимо включить его через конфигурацию:

@Configuration
@EnableScheduling
public class SchedulerConfig{}

А затем планируйте это:

@Component
public class ScheduledUpdatesOnTopic{

    @Autowired
    private SimpMessagingTemplate template;

    @Scheduler(fixedDelay=300)
    public void publishUpdates(String text){
        template.convertAndSend("/topic/greetings", text);
    }
}

Надеюсь, что это как-то прояснило концепцию и шаги, которые необходимо предпринять, чтобы заставить вас работать на вас.

Ответ 2

В первую очередь вы не можете отправлять (push) сообщения клиентам без их подписки.

Во-вторых, чтобы отправлять сообщения всем подписчикам, вы должны взглянуть на topic абстракции.

Это основа STOMP.

Я думаю, что вы в порядке с @Scheduled, но вам просто нужно ввести SimpMessagingTemplate для отправки сообщений брокеру STOMP для последующего нажатия.

Также см. Конфигурацию XML Spring WebSockets, не предоставляющую brokerMessagingTemplate