如何通过管道将 OutputStream 传输到 StreamingDataHandler?

2024-04-08

我在 JAX-WS 中有一个 Java Web 服务,它从另一个方法返回一个 OutputStream。我似乎无法弄清楚如何将 OutputStream 流式传输到返回的 DataHandler 中,除了创建一个临时文件,写入它,然后再次将其作为 InputStream 打开。这是一个例子:

@MTOM
@WebService
class Example {
    @WebMethod
    public @XmlMimeType("application/octet-stream") DataHandler service() {
        // Create a temporary file to write to
        File fTemp = File.createTempFile("my", "tmp");
        OutputStream out = new FileOutputStream(fTemp);

        // Method takes an output stream and writes to it
        writeToOut(out);
        out.close();

        // Create a data source and data handler based on that temporary file
        DataSource ds = new FileDataSource(fTemp);
        DataHandler dh = new DataHandler(ds);
        return dh;
    }
}

主要问题是 writeToOut() 方法可以返回远远大于计算机内存的数据。这就是该方法首先使用 MTOM 来传输数据的原因。我似乎无法理解如何直接从 OutputStream 传输数据,我需要将数据提供给返回的 DataHandler(最终是接收 StreamingDataHandler 的客户端)。

我尝试过使用 PipedInputStream 和 PipedOutputStream,但这些似乎并不是我所需要的,因为在写入 PipedOutputStream 后需要返回 DataHandler。

有任何想法吗?


我按照 Christian 所说的思路找到了答案(创建一个新线程来执行 writeToOut()):

@MTOM
@WebService
class Example {
    @WebMethod
    public @XmlMimeType("application/octet-stream") DataHandler service() {
        // Create piped output stream, wrap it in a final array so that the
        // OutputStream doesn't need to be finalized before sending to new Thread.
        PipedOutputStream out = new PipedOutputStream();
        InputStream in = new PipedInputStream(out);
        final Object[] args = { out };

        // Create a new thread which writes to out.
        new Thread(
            new Runnable(){
                public void run() {
                    writeToOut(args);
                    ((OutputStream)args[0]).close();
                }
            }
        ).start();

        // Return the InputStream to the client.
        DataSource ds = new ByteArrayDataSource(in, "application/octet-stream");
        DataHandler dh = new DataHandler(ds);
        return dh;
    }
}

由于它有点复杂final变量,但据我所知这是正确的。当线程启动时,它在第一次尝试调用时会阻塞out.write();同时,输入流返回给客户端,客户端通过读取数据来解除写入阻塞。 (我以前实现此解决方案的问题是我没有正确关闭流,因此遇到了错误。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过管道将 OutputStream 传输到 StreamingDataHandler? 的相关文章

  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • Maven 2:如何将当前项目版本打包在WAR文件中?

    我正在使用 Maven 2 构建我的 Java 项目 并且正在寻找一种向用户呈现 pom xml 当前版本号的方法 例如使用 Servlet 或 JSP 据我所知 最好的方法是 Maven 将版本号作为文本文件打包到 WAR 中 这使我能够
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 手动编辑 Jar 以更改包名称

    我有一个来自外部源的 jar 文件 jar 中的所有类都位于 com xyz 包中 我想将所有类移动到 com xyzold 包中 这是否像解压缩 jar 将 xzy 文件夹重命名为 xyzold 并重新压缩它一样简单 或者我还需要修改每个
  • Spring3/Hibernate3/TestNG:有些测试给出 LazyInitializationException,有些则没有

    前言 我在单元测试中遇到了 LazyInitializationException 的问题 而且我很难理解它 正如你从我的问题中看到的那样Spring 中的数据库会话 https stackoverflow com questions 13
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 如何在 Eclipse 中使用其他外部 jar 依赖项创建不可运行/不可执行的 jar

    我无法通过 Eclipse 导出向导创建普通的 jar 不可运行 不可执行 它仅创建 jar 文件 但不会导出依赖的 jar 从而在从其他类调用导出的 jar 的方法时出现错误 请帮助 非常感谢 kurellajunior的建议 它是通过使
  • 从 @JsonProperty 值获取枚举常量

    我有一个标有 JsonProperty 的枚举 用于使用 Jackson 进行 JSON 序列化 反序列化 并且希望获取给定字符串 JsonProperty 的枚举值 public enum TimeBucket JsonProperty
  • 如何将 Observable>> 转换为 Observable>

    我陷入了如何将以下可观察类型转换 转换为我的目标类型的困境 我有以下类型的可观察值 Observable
  • Java:java.util.ConcurrentModificationException

    我正在制作 2D 目前正在研究用子弹射击 子弹是一个单独的类 所有项目符号都存储在称为项目符号的数组列表中 当它超出屏幕一侧 Exception in thread main java util ConcurrentModification
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 为什么我的代码会产生错误:该语句没有返回结果集[重复]

    这个问题在这里已经有答案了 我正在从 Microsoft SQL Server Studio 执行以下查询 该查询工作正常并显示结果 SELECT INTO temp table FROM md criteria join WHERE us
  • Java:使用 Graph API 在线更新 Sharepoint 上的 docx 文件

    我在使用 Java 在线更新 Sharepoint 上的 docx 文件时遇到问题 首先 我检查了构建 PUT 请求的 URL 此处 并使用此请求 PUT drives drive id items item id content 我首先使

随机推荐

  • 如何使用 PHP 将 JSON 解析为 html 表?

    我必须在我的网站上找到一张桌子 并且必须从以下位置获取该表的数据 我已经尝试了很多东西但没有任何作用
  • 在 C# 中实现接口与显式实现接口 [重复]

    这个问题在这里已经有答案了 我在 VS2010 中有两个用于实现接口的选项 当我有 IHelper cs 界面如下 public interface IHelper IEnumerable
  • 无法加载 python gstreamer 元素

    我正在跟随指南https mathieuduponchelle github io 2018 02 01 Python Elements html gi language undefined https mathieuduponchelle
  • Xcode:内存使用情况比较

    在 xcode 中模拟 iOS 时 丢失 3 4 的内存给 其他进程 正常吗 是的 这是正常的 其他进程 实际上包括 Mac 上当前运行的所有其他程序 这个数字与模拟器无关 它不测量模拟器中运行的进程 如果您运行 iOS Simulator
  • 使用地理编码将多个 addListener 事件添加到 Google 地图表单

    我创建了一个 Google 地图表单 允许用户在文本字段中输入地址并对条目进行地理编码 然后这会在地图上放置一个标记 这工作正常 但我想添加一个额外的 addListener 这样当用户单击地图时 它将在他们单击的位置添加另一个图钉 由于某
  • 完整更新 pip 包时出错

    当 pip 使用命令更新所有包时 pip freeze local grep v e cut d f 1 xargs pip install U 点打印错误vboxapi Downloading unpacking vboxapi Coul
  • NativeScript radlist 视图按需加载的工作原理

    这可能不是问题 但这是从头开始学习本机脚本时出现的一系列疑问 我有一个 1000 或更多的数据列表存储在数据表中 知道我想将其显示在列表视图上 但我不想立即读取所有数据 因为我有图像存储在其他目录中并且也想读取它 因此 对于 20 到 30
  • 获取过滤值的对象键

    情况很简单 我有一个以下对象 Object 1 false 2 true 3 false 4 false 5 false 6 false 7 false 8 true 12 false 13 false 14 false 15 false
  • .NET 日期时间.Parse

    当尝试使用解析方法时DateTime类中 我抛出异常 字符串未被识别为有效的日期时间 该字符串读作 26 10 2009 8 47 39 AM 输出时 该字符串是从正则表达式的匹配组中获取的 从该匹配组获得的任何字符串都不会解析为日期时间
  • 如何在 ASP.NET 中将对象保存到会话并在视图中访问它

    我正在编写 Asp Net MVC 4 应用程序 我想将模型对象保存到会话中 然后从另一个页面访问它 但不知道该怎么做 是否可以 例如一些代码 HttpPost public ActionResult Index EventDetails
  • 通过网络登录从 Windows 服务创建 GUI

    我读了很多关于从 Windows 服务执行 GUI 应用程序的文章 当服务以系统用户身份运行时 我使用的是 Windows XP 允许服务与桌面交互 复选框对我有用 现在我需要该服务作为域中定义的用户 来自网络 运行 一切工作正常 即使没有
  • 在 Safari/WebView 中禁用 XSS 过滤器

    我正在开发一个用于 XSS 检查的工具 使用 Webkit WebView 和 Macruby 这非常有效 只是 Safari 的 XSS 过滤器偶尔会捕获我的 URL 并拒绝执行恶意脚本 有没有办法禁用此功能 最好以编程方式禁用 经过一番
  • 在 Web API 应用程序中,我可以在什么时候拦截 URI 参数并相应地路由调用?

    注 这个问题确实有点类似于this one https stackoverflow com questions 21388655 can i programmatically determine the database context t
  • 如何通过网络访问Raspberry PI QEMU VM

    我已通过 QEMU 在 Mac OS X 上成功设置了 Raspberry PI VM 现在我想从我的 Mac 访问该虚拟机的文件系统 When I call ifconfig on my VM I get this And here th
  • 如何确保子元素不会遮盖插入阴影?

    我有一个div带有一些子元素的元素 我试图应用一个插入框阴影 子元素似乎覆盖了框阴影 这是一个 jfiddle 示例 jsFiddle 演示 http jsfiddle net sightofnick wdYpv 如果你拿走backgrou
  • 通过视图中的按钮调用控制器的操作,而不重定向到任何视图

    我想向 ASP NET MVC WebApplication 的视图添加一个按钮 该按钮将调用一个方法 public void UpdateDatabase int personId int surveyId updating modify
  • Spotify API:有没有办法确定歌曲何时播放完毕?

    我正在尝试构建一个应用程序 利用 Spotify 的 API 来构建播放列表 我想知道是否有办法确定歌曲何时完成播放 我检查了他们的 API 似乎找不到任何可以 ping 或设置完成后回调的内容 我看过这个问题 如何判断歌曲是否已结束或使用
  • 如何找到树的分支因子

    特定的搜索树在第 3 层有 6 个节点 在下一层有 24 个节点 第 3 级的分支因子是多少 答案是4 但有人能告诉我为什么吗 我以为是2 来自维基百科 在计算 树数据结构和博弈论中 分支因子是每个节点的子节点数量 即出度 如果该值不均匀
  • 如何在c#中成功从Stripe Events of Charge中获取客户ID

    我想要来自 StripeEvents 的 CustomerID 我从 strip webhook 检索了 json 我已经完成了一些代码 但自从 customerID 得到 NULL var bodyStream new StreamRea
  • 如何通过管道将 OutputStream 传输到 StreamingDataHandler?

    我在 JAX WS 中有一个 Java Web 服务 它从另一个方法返回一个 OutputStream 我似乎无法弄清楚如何将 OutputStream 流式传输到返回的 DataHandler 中 除了创建一个临时文件 写入它 然后再次将