对于弹簧靴和弹簧来说,我有点新手。我被投入了一个项目和第一次"运动"为了让我的脚湿透是在前端创建一个简单的新闻提要功能,它将通过websocket推送通知自动更新。
所涉及的技术是:
我想在前端实现的目标是:
就服务器端代码而言:
@Scheduled
?)。我认为除了服务器端代码的最后部分之外,我已经实现了所有目标。我以下的示例在全双工模式下使用websocket,当客户端发送内容时,服务器立即响应消息队列并且所有订阅的客户端都更新。但我想要的是服务器本身通过Stomp
发送一些东西,而不是等待客户端发出任何请求。
首先,我创建了一个弹簧@Controller
,并使用@SendTo("/my/subscribed/path")
注释为其添加了一个方法。但是我不知道如何触发它。此外,我尝试添加@Scheduled
,但此注释仅适用于void
返回类型的方法(并且我返回了一个NewsMessage对象)。
基本上我需要的是让客户端初始化一个websocket连接,并在服务器开始按设定的时间间隔推送消息之后(或者当事件被触发时,它现在并不重要)。此外,每个新客户端都应该侦听相同的消息队列并接收相同的消息。
答案 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