使用Springboot计划的websocket推送

时间:2016-05-18 18:40:16

标签: java spring websocket spring-boot push-notification

对于弹簧靴和弹簧来说,我有点新手。我被投入了一个项目和第一次"运动"为了让我的脚湿透是在前端创建一个简单的新闻提要功能,它将通过websocket推送通知自动更新。

所涉及的技术是:

  • 一般前端应用程序的角度
  • 用于创建websocket通信的SockJS
  • 踩踏webosocket以接收来自消息代理的消息
  • Springboot Websockets
  • Stomp Message Broker(与java相关的框架)

我想在前端实现的目标是:

  1. 加载视图时创建websocket连接
  2. 使用该websocket创建s stomp提供程序
  3. 让我的客户订阅
  4. 抓取服务器推送消息并更新角度视图
  5. 就服务器端代码而言:

    1. 配置websocket内容并管理连接
    2. 让服务器每隔X个时间推送一次消息(通过执行者或@Scheduled?)。
    3. 我认为除了服务器端代码的最后部分之外,我已经实现了所有目标。我以下的示例在全双工模式下使用websocket,当客户端发送内容时,服务器立即响应消息队列并且所有订阅的客户端都更新。但我想要的是服务器本身通过Stomp发送一些东西,而不是等待客户端发出任何请求。

      首先,我创建了一个弹簧@Controller,并使用@SendTo("/my/subscribed/path")注释为其添加了一个方法。但是我不知道如何触发它。此外,我尝试添加@Scheduled,但此注释仅适用于void返回类型的方法(并且我返回了一个NewsMessage对象)。

      基本上我需要的是让客户端初始化一个websocket连接,并在服务器开始按设定的时间间隔推送消息之后(或者当事件被触发时,它现在并不重要)。此外,每个新客户端都应该侦听相同的消息队列并接收相同的消息。

2 个答案:

答案 0 :(得分:37)

首先,您需要在春季启用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;
    @Autowired
    private final MessagesSupplier messagesSupplier;

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

希望以某种方式澄清概念,并采取措施让事情为你效劳。

//注意:将@Scheduler更改为@Scheduled

答案 1 :(得分:7)

首先,您无法在没有订阅的情况下向客户发送(推送)消息。

其次,要向所有订阅者发送消息,您应该查看topic抽象方。

这是STOMP的基础。

我认为你对@Scheduled没问题,但是你需要注入SimpMessagingTemplate来向STOMP经纪人发送消息以便随后推送。

另见Spring WebSockets XML configuration not providing brokerMessagingTemplate