我使用Spring MVC作为Web应用程序(使用JQuery作为前端)。我有一个服务,其状态变量会根据某种方法的进度而变化。
代码如下所示:
@Service
public class PatchGenerationService {
private String status;
public String getStatus() {
return status;
}
public void generatePatch(){
status = STATUS_PREPARE;
//some code
status = STATUS_LOOKUP;
//and so on
status = STATUS_FINISHED;
}
}
有几个异步线程同时运行此服务,由不同的客户端创建。我希望能够告知每个客户端为他创建的线程的状态。
以下是创建PatchGenerationService
的服务:
@Async
public static void createPatchFromSelectedCommits(String branch, String tagName, List<Commit> commits) {
log.info("generating a new patch");
PatchGenerationService patchGenerationService = new PatchGenerationService();
patchGenerationService.generatePatch(/*attributes*/);
log.info("patch generation ended");
}
每次此变量更改时,如何将带有状态变量值的信息发送到客户端?
答案 0 :(得分:1)
您应该查看此文档:Using WebSocket to build an interactive web application
使用WebSocket构建交互式Web应用程序
本指南将引导您完成创建“hello world”的过程 在浏览器和之间来回发送消息的应用程序 服务器。 WebSocket是一个非常薄,轻量级的TCP层。它 使它非常适合使用“子协议”来嵌入消息。在 本指南我们将深入介绍并使用Spring创建STOMP消息 交互式Web应用程序。
简单来说,您的后端会向您的前端发送一条消息,通知他状态的变化。
答案 1 :(得分:0)
我终于在这个项目中找到了答案:Github Link
事实上,检索特定的PatchGenerationService
对象会非常困难。因此我修改了类,以便它实现Runnable
。
我现在覆盖PatchGenerationService
中的run方法:
@Override
public void run() {
generatePatch( patchName, branchName, tagName, version, author, applierRelease, selectedCommits);
}
我正在使用STOMP和SockJS,以便每次statuts变量发生变化时向客户端发送消息:
public void sendProgress(String exception){
logger.info("status:" +status);
Status statusWithException=new Status(status,exception);
template.convertAndSend("/generationStatus/status", statusWithException);
}
public void generatePatch(String patchName, String branchName, String tagName, String version, String author, String applierRelease, List<Commit> selectedCommits) {
//String status;
status = STATUS_PREPARE;
sendProgress("");
}
连接由经纪人管理:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/generationStatus");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/status").withSockJS();
}
}
客户端的connect方法订阅generationStatus/status
url:
function connect() {
console.log('connecting to generation status');
var socket = new SockJS('/status');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/generationStatus/status', function (data) {
console.log(data);
});
});
}