如何通知Web界面变量的状态?

时间:2017-07-10 15:35:48

标签: javascript java spring spring-mvc spring-boot

我使用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");
}

每次此变量更改时,如何将带有状态变量值的信息发送到客户端?

2 个答案:

答案 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);
        });
    });
}