gpt4 book ai didi

java - jax-rs 流式输出并读取服务器上的数据,为什么会这样?

转载 作者:行者123 更新时间:2023-12-01 12:29:23 24 4
gpt4 key购买 nike

我两次发布了关于这个主题的问题(here和这里here,但从未得到令人满意的答案,感觉我无法很好地表达这个问题。我已经弄清楚了,但我对它的理解是弱。这是一个偶然的机会,让我找到了这个解决方案。我正在做的是在由我的网络服务器生成的单独进程上生成结果。生成这些结果时,我想使用 Jersey 将字节流式传输到网络服务器,最终将传回我的客户端(稍后)。我最难弄清楚如何使我的数据流从我的进程返回到我的网络服务器。我猜对我的实体使用 StreamingOuput 类型会起作用。没有网络上有这样的例子,谁能解释一下 Jersey 发生了什么。我很惊讶我能够将网络服务器上的数据作为输入流读取出来。

在服务器上的 servlet 容器中运行

@PUT
@Path("groups/{myUuid:" + Regex.UUID + "}")
public void updateSpectraData(@PathParam("myUuid") UUID myUuid, InputStream inputStream)
{
float[] floatHolder = new float[512];
byte[] bytes = ByteStreams.toByteArray(inputStream);
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
byteBuffer.asFloatBuffer().get(floatHolder);
System.out.println(Arrays.toString(floatHolder));
}

下面的代码在服务器生成的单独进程中运行。

private void doPut(byte[] data, Object ctx)
{
final Client client = ClientBuilder.newClient();
ObjectMapper objectMapper = new ObjectMapper();
MyTask myTask = objectMapper.readValue(data, MyTask.class);
MyConifguration config = getConfig();
WebTarget createTaskTarget = client.target(myTask.getURI());
Builder request = createTaskTarget.request(MediaType.APPLICATION_OCTET_STREAM);
request.put(Entity.entity(createData(config), MediaType.APPLICATION_OCTET_STREAM), InputStream.class);
}

这是创建数据的函数,返回类型很重要:

private StreamingOutput createData(MyConfiguration config)
{
return new StreamingOutput()
{
...code...
}
}

最佳答案

Jersey 将尝试根据请求的内容类型为您提供您作为输入参数提供的任何内容。您也可以使用 byte[] 而不是 InputStream。如果内容类型是 application/octet-stream 并且您的输入参数是可序列化对象,则 Jersey 会假设传入数据使用 Java 序列化,application/xml 也是如此(它将使用 JAXB )。如果您想让这一点更明确,您可以将 @Consumes@Produces 放在您的 servlet 方法上。

关于java - jax-rs 流式输出并读取服务器上的数据,为什么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26066452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com