首页 > 其他分享 >【Quarkus】使用Buffer直接操作响应流

【Quarkus】使用Buffer直接操作响应流

时间:2023-11-23 16:24:32浏览次数:34  
标签:core rs Buffer 响应 buffer Quarkus io import response


import io.vertx.core.buffer.Buffer;
import io.vertx.core.buffer.impl.BufferImpl;
import io.vertx.core.http.HttpHeaders;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.ext.web.RoutingContext;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

@Path("/api")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class StreamResource {

    private static final Logger log = LoggerFactory.getLogger(StreamResource.class);

    @GET
    @Path("/log")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public void getLog(@Context RoutingContext routingContext) throws IOException {
        HttpServerResponse response = routingContext.response();
        Buffer buffer = Buffer.buffer();
        buffer.getByteBuf().clear();
        OutputStream os = new OutputStream() {
            @Override
            public void write(int b) {
                checkShouldWriteToResponse();
                buffer.appendInt(b);
            }

            @Override
            public void write(byte[] b) {
                checkShouldWriteToResponse();
                buffer.appendBytes(b);
            }

            @Override
            public void close() {
                response.send(buffer);
            }

            private void checkShouldWriteToResponse() {
                if (buffer.length() < 10240) {
                    return;
                }
                log.debug("缓冲区满,输出");
                response.write(buffer);
                log.debug("输出完成,剩余: {}", buffer.length());
                ((BufferImpl) buffer).byteBuf().clear();
                log.debug("清理完成,剩余: {}", buffer.length());
            }
        };


        if (!response.headWritten()) {
            log.debug("填充响应头");
            response.putHeader(HttpHeaders.CONNECTION, HttpHeaders.CLOSE);
            response.putHeader(HttpHeaders.TRANSFER_ENCODING, HttpHeaders.CHUNKED);
        }

        List<String> size = routingContext.queryParam("size");
        var count = size.isEmpty() ? 10L : Long.valueOf(size.get(0));
        try {
            for (int i = 0; i < count; i++) {
                byte[] bytes = ("hello" + i + "\n").getBytes(StandardCharsets.UTF_8);
                os.write(bytes);
            }
        } finally {
            os.close();
        }

    }

}

标签:core,rs,Buffer,响应,buffer,Quarkus,io,import,response
From: https://www.cnblogs.com/xiaojiluben/p/17851833.html

相关文章

  • 深入理解Python爬虫中的HTTP请求与响应过程
    在Python爬虫开发中,了解HTTP请求与响应的过程是非常重要的。HTTP(HypertextTransferProtocol)是一种用于传输超文本的应用层协议,通过HTTP协议,我们可以在网络上获取各种资源。本文将深入探讨Python爬虫中的HTTP请求与响应过程,帮助您更好地理解和应用Python爬虫技术。1.了解HTTP协议H......
  • Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和
    本文根据文章:https://blog.csdn.net/wjp0000/article/details/117771752进行修改一、Java读取和存储文件数据流Java读取文件,实际是将文件中的字节流转换成字符流输出到屏幕的过程这里面涉及到两个类:InputStreamReader和OutputStreamWriterInputStreamReader:将字节流转换成字......
  • FTP客户端提示「响应: 530 Valid hostname is expected.」可尝试的解决方案
    响应:  530Validhostnameisexpected.该响应的意思是“需要有效的主机名”,通常在FTP登录时出现。这个响应表示FTP服务器要求客户端提供一个有效的主机名,以便服务器能够识别它。如果出现该响应,可能是因为输入的主机名错误或服务器无法识别它。解决方案用户名前加「......
  • COMP 340 操作系统 Bounded Buffer问题解决
    这里有3个发生器,每个发生器独立地产生一种独特的材料。所有这些材料在被转发给操作员之前被存储在大小为10的输入缓冲器中。我们有三个具有相同优先级的运营商,他们负责生产基于这些材料。每种产品需要2种不同的材料。每次操作员需要2个用于此目的的工具。总共为这些操作员提供了3......
  • 使用Python协程并发测试cdn响应速度
    代码干净清爽才能看着赏心悦目:#!/usr/bin/envpython3.11importtimefromcontextlibimportcontextmanagerfromenumimportStrEnumimportanyioimporthttpx@contextmanagerdeftimeit(msg:str):start=time.time()yieldcost=time.time()-sta......
  • dns推荐(提升网络响应速度)
    1.阿里云ipv4233.5.5.5、233.6.6.6IPv6:2400:3200::1和2400:3200:baba::1腾讯云Ipv4119.29.29.29ipv62402:4e00::......
  • Vue公共loading升级版(处理并发异步差时响应)
    公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤:1.通过全局状态管理定义状态值(vuex、pinia等)。2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画。3.在请求和相应拦截器中变更状态值。第一二步骤处理大同小异,但在第三步中,网上很多博文分享的方法是:在请求......
  • 05.请求与响应 处理响应信息
    请求与响应-处理响应信息针对于后端服务,需要针对请求返回对应的响应信息。响应信息可以响应很多类型的信息类型。常见的比如文本类型,还有非常通用的JSON数据。在Flask中,可以使用视图函数来处理接口请求并生成相应的响应。而且Flask提供了多种方式来构建和返回接口响应......
  • HTTP 响应字段 strict-origin-when-cross-origin 的含义介绍
    ReferrerPolicy是一个HTTP响应头部字段,用于控制浏览器在发送跳转请求时,将当前页面的URL信息如何包含在Referer首部字段中。ReferrerPolicy的值可以设置为不同的策略,其中"strict-origin-when-cross-origin"是一种常见的策略,它具体的含义是:当请求源(origin)和目标源(orig......
  • 什么是 HTTP 响应字段里的 Referrer Policy
    如下图所示,我在HTTP请求的响应头部里看到ReferrerPolicy字段为strict-origin-when-cross-origin,这个字段的含义如下。HTTP头部中的ReferrerPolicy字段用于定义浏览器在跨站请求时应如何处理HTTPReferer头部。这是一个重要的字段,因为它可以帮助网站所有者控制他们......