You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Spring项目中集成Vert.x实现视频流功能的方法咨询

Spring项目集成Vert.x实现视频流服务实操步骤

1. 引入核心依赖

如果是Maven项目,在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-vertx</artifactId>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web</artifactId>
</dependency>

Gradle项目对应添加同名依赖即可。

2. 注册Vert.x核心组件为Spring Bean

创建配置类,把Vertx实例、路由、HttpServer交给Spring容器管理:

@Configuration
public class VertxConfig {
    @Bean
    public Vertx vertx() {
        return Vertx.vertx();
    }

    @Bean
    public Router router(Vertx vertx) {
        return Router.router(vertx);
    }

    @Bean
    public HttpServer httpServer(Vertx vertx, Router router) {
        return vertx.createHttpServer().requestHandler(router);
    }
}

3. 实现视频流路由逻辑

可以直接复用原有项目的ResourceLoader,Vert.x原生支持Range请求处理,无需手动解析Range头:

@Component
public class VideoRouteConfig {
    private static final String FORMAT = "classpath:videos/%s.mp4";
    @Autowired
    private ResourceLoader resourceLoader;
    @Autowired
    private Router router;
    @Autowired
    private Vertx vertx;

    @PostConstruct
    public void initVideoRoute() {
        router.get("/videos/:title").produces("video/mp4").handler(ctx -> {
            String title = ctx.pathParam("title");
            Resource resource = resourceLoader.getResource(String.format(FORMAT, title));
            try {
                // 兼容jar包内资源读取,先复制到临时文件
                File videoFile;
                if (resource.isFile()) {
                    videoFile = resource.getFile();
                } else {
                    videoFile = File.createTempFile(title, ".mp4");
                    Files.copy(resource.getInputStream(), videoFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
                    videoFile.deleteOnExit();
                }
                // Vert.x自动处理Range请求、响应头设置
                ctx.response()
                   .putHeader("Content-Type", "video/mp4")
                   .sendFile(videoFile.getAbsolutePath(), ar -> {
                       if (ar.failed()) {
                           ctx.fail(404);
                       }
                   });
            } catch (Exception e) {
                ctx.fail(500);
            }
        });
    }
}

4. 绑定服务生命周期

让Vert.x服务跟随Spring Boot启动、销毁,配置监听端口(可自行修改,不和原有Spring服务端口冲突即可):

@Component
public class VertxServerLifecycle {
    @Autowired
    private HttpServer httpServer;
    @Value("${vertx.server.port:8081}")
    private int port;

    @PostConstruct
    public void startServer() {
        httpServer.listen(port);
    }

    @PreDestroy
    public void stopServer() {
        httpServer.close();
    }
}

5. 功能验证

启动Spring Boot项目后,访问http://服务地址:8081/videos/你的视频文件名即可,拖动进度条、快进快退功能均正常,性能优于原有WebFlux实现。如果不需要保留原有WebFlux的视频接口,直接删除原来的Controller和对应Service实现即可,原有业务逻辑无需额外改造。

内容的提问来源于stack exchange,提问作者zakaria daoudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:30:01