发生异常时如何优雅地关闭Endpoint?

2024-04-26

我编写了一个小型 JAX-WS Web 服务,它在容器外部运行Endpoint.publish():

Endpoint endpoint = Endpoint.create(new MyServiceImpl());
endpoint.publish("http://localhost:4425/myService");

如果我的任何 Web 服务方法抛出异常,则端点不会正常关闭,并且该地址将继续使用,直到 Windows 最终释放它。这会导致经典错误:

com.sun.xml.internal.ws.server.ServerRtException:服务器运行时错误:java.net.BindException:地址已在使用中:绑定

我可以用 try/catch 包装所有的 Web 服务方法,但这似乎有点重复。我还尝试通过安装清理类Thread.setDefaultUncaughtExceptionHandler(),但是当我的 Web 服务方法抛出异常时,这并没有被触发。

有没有比诉诸无数的 try/catch 块更优雅的方法来解决这个问题?


根据 Waldheinz 的回答,我尝试使用 Jetty 类来支持 JDK 默认值。代码可以编译,但执行时会立即终止publish。当使用 JDK 类时,主线程将保持活动状态,直到我手动终止进程。有什么想法出了什么问题吗?我想知道是否某个地方发生了异常,但被吞没了,所以我看不到它。

Endpoint endpoint = Endpoint.create(new MyServiceImpl());

Server s = new Server(new InetSocketAddress(HOST, PORT));
ServerConnector connector = new ServerConnector(s);
connector.setReuseAddress(true);
s.setConnectors(new Connector[] { connector });
s.setHandler(new ContextHandlerCollection());

JettyHttpServer server = new JettyHttpServer(s, false);
JettyHttpContext context = (JettyHttpContext) server.createContext(PATH);
endpoint.publish(context);

端点的自定义线程池可能会有所帮助:

ThreadFactory factory = new ThreadFactory() {

  @Override
  public Thread newThread(Runnable target) {
    final Thread thread = new Thread(target);
    thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            // put error handling code here
        }

    });
    return thread;
  }


};

ExecutorService executor = Executors.newCachedThreadPool(factory);
Endpoint endpoint = Endpoint.create(new MyServiceImpl());
endpoint.setExecutor(executor);
endpoint.publish("http://localhost:4425/myService");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发生异常时如何优雅地关闭Endpoint? 的相关文章

随机推荐

  • Python在Conda环境中,但在Windows虚拟环境中尚未激活

    我创建了一个Windows 10 Python虚拟环境 env3 7 3 当我打开在虚拟环境中激活的cmd窗口时 在虚拟环境中启动Python时收到以下警告消息 env3 7 3 C Users redex OneDrive Documen
  • 我应该不断地 open() 和 close() 我的 SQL 数据库还是让它保持打开状态?

    我正在创建一个使用 SQL 数据库来存储数据的应用程序 根据应用程序的设计方式 它将每 3 分钟左右更新一次新数据 具体取决于应用程序运行时的用户操作 在我看到的教程中 他们建议您在更改数据库后关闭数据库 就资源而言 这是 昂贵的 是否最好
  • 在 Angular-UI 模式中显示谷歌地图?

    尝试在 Angular UI 模式中加载简单的谷歌地图 然而没有运气 数据传递得很好 但在地图方面没有任何作用 请帮忙 modalInstance opened then function var mapOptions center new
  • 显示mysql中存储路径的图像

    我已将图像上传到文件夹中并将路径存储到 MySQL 数据库中 路径已存储 图像已成功插入文件夹 但我的问题是当我显示存储在数据库中的路径中的图像时 它没有显示 当我回显图像路径时 它会显示图像路径 我检查了浏览器设置 一切正常 这是我的代码
  • 如何正确处理自定义MapFunction中的错误?

    我已经实施了MapFunction对于我的 Apache Flink 流程 它正在解析传入元素并将其转换为其他格式 但有时会出现错误 即传入数据无效 我看到两种可能的处理方法 忽略无效元素 但似乎我无法忽略错误 因为对于任何传入元素 我必须
  • PDO在mysql性能中的作用

    最近我在浏览一篇博客 注意到有关在mysql中使用PDO的一些要点 它改变了我对PDO的看法 要点是 本机准备好的语句无法利用查询缓存 从而导致性能降低 本机准备好的语句无法执行某些类型的查询 例如 SHOW TABLES 本机准备好的语句
  • Aptana 3 是否提供与 Aptana 1.5.1 一样好的 PHP 插件?

    有人用过 Aptana 3 吗 它的 PHP 插件是否和 2 0 一样糟糕 这里仍然运行 Aptana 1 5 1 一切都是内置的 Aptana Studio 3 是一个很棒的工具 尽管从经验来看 在处理大型项目时会出现一些问题
  • 广播接收器未调用互联网连接检查

    我正在尝试制作一个简单的应用程序 它会在互联网连接发生变化时通知是否有可用的互联网连接 我在互联网上找到了一些解决方案并尝试实施它们 但不知何故它不起作用 我在清单文件中注册的广播接收器没有调用网络连接更改 Manifest
  • 带有 std::variant 或 union 包装器的通用接口

    这个问题与使用 std variant 强制使用通用接口 无需继承 https stackoverflow com questions 72434897 enforcing a common interface with stdvarian
  • python条件运算符中“and”和“&”的奇怪行为[重复]

    这个问题在这里已经有答案了 以下是使用 和 and 条件运算符尝试的不同场景及其结果 使用Python 2 7 使用 运算符 使用 与 运算符 想知道为什么两个条件运算符表现出不同的行为 用真实场景进行解释会很有帮助 提前致谢 is not
  • 如何为批量角色扮演游戏创建保存/加载命令?

    我正在制作一个基于文本的批量角色扮演游戏 RPG 最近才开始学习 我的 RPG 没有生命值之类的东西 它更像是故事类型的 RPG 基本上 你选择你想做的选项 然后继续故事 每个选项都可以改变结局 所以 我想知道是否有办法保存 RPG 中的
  • Windows 上 Matlab 64 位版本的免费 SCM [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当 Matlab 安装为 64 位版本时 它只能使用 64 位源代码控制系统 是否有免费的源代码控制系统
  • DbContext 已被处置

    我使用 ASP NET MVC 4 和 SQL Server 2008 开发了一个 Web 应用程序 我创建了 ContextManager 类 以便在所有页面中只有一个数据库上下文 public static class ContextM
  • Python 的 super() 如何处理多重继承?

    如何super 使用多重继承 例如 给定 class First object def init self print first class Second object def init self print second class T
  • 如何从PrepareToInstall事件函数设置StatusMsg

    我的应用程序需要安装 NET Framework 因此我运行 NET 安装准备安装事件函数 当安装运行时 我想在向导上显示一些简单的消息 I found 如何在 Inno 安装脚本的 Code 部分设置状态消息 https stackove
  • 将向量或参数传递给 boost::process (boost::fusion)

    我正在尝试创建一个boost process来自字符串参数向量 void runProcess const std string exe const std vector
  • 访问模型字段内的模型实例

    我有一个模型 事件 它具有用户模型 事件的所有者 的外键 该用户可以使用以下 ManyToManyField 邀请其他用户 invites models ManyToManyField User related name invited u
  • 迭代地实现合并排序

    我正在尝试实现合并排序 以便更好地理解它是如何工作的 在下面的代码中 我尝试对数字数组进行排序 我目前拥有的代码有错误并且在无限循环中运行 我现在正在尝试以非递归方式解决这个问题 function mergeSort arr var mid
  • Wappalyzer如何检测网页技术

    Wappalyzer 如何检测站点的后端编程语言 但在某些情况下无法检测 例如 Facebook 使用 PHP 但无法检测并显示 HTTP 2 Wappalyzer 是一个开源社区驱动的平台 其所有源代码都可以在此链接中找到 https g
  • 发生异常时如何优雅地关闭Endpoint?

    我编写了一个小型 JAX WS Web 服务 它在容器外部运行Endpoint publish Endpoint endpoint Endpoint create new MyServiceImpl endpoint publish htt