Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于需要长时间工作的spring响应,是否有任何库或解决方案_Spring_Spring Mvc_Spring Boot_Long Polling_Spring Web - Fatal编程技术网

对于需要长时间工作的spring响应,是否有任何库或解决方案

对于需要长时间工作的spring响应,是否有任何库或解决方案,spring,spring-mvc,spring-boot,long-polling,spring-web,Spring,Spring Mvc,Spring Boot,Long Polling,Spring Web,我的项目中的一些过程需要几分钟(1~10分钟)。我使用SpringBootWeb提供了这个过程的结果。因此,我的API必须返回状态为(排队/运行/完成/失败)的响应。所以我通过ResponseEntity类实现了这种属性 我的请求流是 用户请求 javascript使用参数调用API 服务器使用请求的属性(参数、用户信息)生成作业 检查作业是否已存在。如果没有,则将作业放入队列。如果存在,则返回now作业状态(已完成作业具有流程的结果) QueueExecutor将新作业运行到处理组件,然后使线

我的项目中的一些过程需要几分钟(1~10分钟)。我使用SpringBootWeb提供了这个过程的结果。因此,我的API必须返回状态为(排队/运行/完成/失败)的响应。所以我通过ResponseEntity类实现了这种属性

我的请求流是

  • 用户请求
  • javascript使用参数调用API
  • 服务器使用请求的属性(参数、用户信息)生成作业
  • 检查作业是否已存在。如果没有,则将作业放入队列。如果存在,则返回now作业状态(已完成作业具有流程的结果)
  • QueueExecutor将新作业运行到处理组件,然后使线程定期检查

  • 用户的客户端请求会定期更新。并获取正在排队/正在运行/已使用的作业。如果没有完成,请通过。否则,运行UI进程

  • 在我的流程中,我有很多小问题,所以我想知道是否有任何通用或有用的库或解决方案。请给我一些建议。谢谢。

    我建议使用推送技术比传统的轮询方法更好

    首先,您需要在Spring中创建一个消息处理控制器:

    @Controller
    public class GreetingController {
        @MessageMapping("/hello")
        @SendTo("/topic/greetings")
        public Greeting greeting(HelloMessage message) throws Exception {
            Thread.sleep(1000); // simulated delay
            return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
        }
    }
    
    然后为STOMP消息配置Spring:

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
        @Override
        public void configureMessageBroker(MessageBrokerRegistry config) {
            config.enableSimpleBroker("/topic");
            config.setApplicationDestinationPrefixes("/app");
        }
    
        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            registry.addEndpoint("/gs-guide-websocket").withSockJS();
        }
    }
    
    在客户端,您应该根据哪个JS库注册/订阅消息

    看看这些使用弹簧推动的示例: