当前位置: 首页 > 知识库问答 >
问题:

通过Apache Camel将SQL数据库中的二进制文件流式传输回endpoint

公孙棋
2023-03-14

我试图从SQL数据库中获取一些varbinary数据,这时对我的Camel服务进行了REST调用。我可以以字节数组的形式获取数据,并将其设置为Camel的主体Exchange,然后Servlet将其作为原始字节返回给调用者(web浏览器、应用程序等)。

我现在想用流来做这件事,而不是保存内存中的所有字节。如果我使用JdbcTemboard,当. Query方法完成时,我可以从结果集获得的连接和流都将关闭,即使我试图返回一个InputStream并将其设置为Exchange主体。这阻止了我从DB直接流式传输数据,通过Camel,然后返回给调用者。

如果我自己编写jdbc的东西,我可以在它打开时将流设置为exchange主体,但我认为我没有机会关闭我打开的连接和流,最终会因此耗尽资源。

我查看了onCompletion,但我不知道如何使用它来关闭我没有参考的流和连接,我不确定在所有数据流回到调用方后是否一定会执行。

我正在使用Camel 2.14.1中的REST DSL和Servlet组件。有没有什么方法可以在不写入文件的情况下完成这项工作?我稍后会在某个地方用定时任务来清理该文件?我希望避免这种情况,否则,在哑计时器清除数据之前,您会有一个争用条件来流回数据。

共有1个答案

冯育
2023-03-14

这样做的方法是,在您查询数据库的bean中,从Connectionpool获取Connection,创建Preared语句以获取您的数据的任何列,并使用ResultSet.getBinaryStream执行它来请求您的二进制数据。

这将为您提供一个InputStream,您可以将其设置为CamelExchangebody,如果您使用的是REST DSL,则必须设置RestBindingMode。关闭RESTendpoint上的

将其设置为exchange主体后,使用setProperty(“此处为您的名字”,closeableresource)将流、连接和结果集作为属性附加到exchange上。

请注意,将它们设置为标头可能会导致Servlet将它们绑定到响应中,此外,通常有一个最大标头大小,这些大小将不适合。

在错误情况下,bean中的错误处理应该处理清除连接等问题。

然后在RESTendpoint调用的路由上,有一个onCompletion子句,它只在REST调用的使用者完成时执行。在该子句中,调用一个处理器,它提取您之前为需要关闭的资源设置的属性,对它们进行空检查,然后关闭它们。

很抱歉缺少代码片段,希望我有时间回到这里,但以上应该足够了。

tl;dr:onCompletion将在所有流通过连接传回后执行,至少对于使用Apache Camel的Servlet

 类似资料:
  • 我正试图通过我的服务器将一个二进制文件从客户端请求流到谷歌云存储。 我使用Tornado框架将数据从请求流到服务器,并使用Google Cloud Storage API将文件流到Google-方法。 我是Tornado的新手,我正在使用装饰器,这样我就可以从请求中获取数据块,并将每个块上传到Google。 我试着打开一个类似文件的对象,我可以在将文件本身上传到谷歌的同时编写每一个块。 问题是,我

  • 我正在Quarkus中实现一个方法,它应该向客户端发送大量数据。使用JPA/Hibernate从数据库中读取数据,序列化为JSON,然后发送到客户端。如果没有整个数据在内存中,如何有效地完成此操作?我尝试了以下三种可能性,但都没有成功: 使用JPA中的getResultList,返回一个以列表为主体的响应。MessageBodyWriter将负责将列表序列化为JSON。然而,这会将所有数据拉入内存

  • 问题内容: 我正在尝试将附件上传到通过rest API输入到网页的HTML文件中。API文档指出,该帖子是HTTP请求正文的纯二进制内容,而不是表单文件上载。 我的代码如下: 我需要使用它来处理许多不同的mimeType,因此我没有在上面的代码中声明它。但是,我尝试为.doc文件声明contentType:’application / msword’,还尝试了processData:false和c

  • 问题内容: 我正在尝试将数据以二进制格式写入文件以进行压缩。数据完全由浮点组成,因此我决定将数据量化为0到65535之间的整数,以便可以将数据写入两位无符号整数并最终节省空间。但是,我需要将量化数据以二进制而不是人类可读的Ascii输出到文件中。 目前这就是我在做什么 @param outputFile包含已量化数据的文件作为.txt文件中的字符串 但是,这会以人类可读的字符串形式写入文件。我需要

  • 问题内容: 我正在构建一个Web应用程序,该服务器应从服务器 http://lscube.org/projects/feng 播放RTSP / RTP流。 HTML5视频/音频标签是否支持rtsp或rtp?如果没有,最简单的解决方案是什么?也许是VLC插件之类的东西。 问题答案: 从技术上讲“是” (但不是真的) HTML 5的标签与协议无关-不在乎。您将协议作为URL的一部分放在属性中。例如:

  • 我想在远程机器上添加一个手表,用于新添加的CSV文件或未读文件。一旦文件被识别,根据文件名中的时间戳读取。文件将使用流媒体而不是本地机器读取。读取文件时,将读取附加到文件名,并在读取文件后附加读取。该文件将通过SFTP协议读取,我计划使用spring集成SFTP。如果读取文件时出错或文件中的数据不符合预期,我想将该文件移动到子目录中。 我尝试轮询远程目录并读取一次CSV文件。一旦读取,我将从目录中