问题标签 [fail-fast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - Spring Batch:OutOfMemoryError 被吞下
作为更大应用程序的一部分,我设置了一个 Spring Batch 作业,它仅由一个面向块的 tasklet 组成:读取器、处理器和写入器。该作业不在主线程中运行。
有时,tasklet 代码会抛出 OutOfMemoryError。因此,我将线程的 UncaughtExceptionHandler 设置为能够对此类错误做出反应,只需终止应用程序即可。
但是 OutOfMemoryError 永远不会到达线程的 UncaughtExceptionHandler。我会说 OutOfMemoryError 可能被 AbstractStep “吞下”,即使我不确定。RepeatTemplate 肯定有一个角色。它可以将 OutOfMemoryError 通知一些 RepeatListener,但默认情况下没有注册任何侦听器,而且似乎无法通过任务定义中的常用标记注册它们中的任何一个。
无论如何,即使在 OutOfMemoryError 之后,JVM 也会继续运行,因为 OoME 被吞噬了。这不好,因为它没有明确表明应用程序实际上已经崩溃。
那么,您对如何防止 Spring Batch 吞下此类错误并有可能处理它们有什么建议吗?
显然我们也在努力修复 OoME,但我认为如果 JVM 在出现错误时简单地崩溃是安全的。
我正在使用 Spring Batch 3.0.1。
java - Java中的快速迭代器失败
换句话说,如果将 "al.remove("d") 放在 if 构造中,则不会抛出 ConcurrentModificationException,与同一行代码一样,如果放在 if -Construct 之外,则会引发异常。请解释!
java - 为什么迭代器会快速失败,它们真的会快速失败吗?
Java 中的迭代器是快速失败的。如果迭代器值在迭代时发生变化,则会引发异常。
这纯粹是为了安全吗?我敢肯定,在某些情况下,如果值发生变化并不重要。例如,假设您每 10 秒向迭代器中的成员发送非关键警报 - 为什么要关心内容是否更改?
此外,快速失败的实现只是检查计数。这是有缺陷的,如果另一个线程添加和删除计数将是相同的,即使迭代器的内容发生了变化。使用版本号不是更好吗?
r - 在请求缺少列表元素时,我可以覆盖 `$` 或 `[[` 以抛出错误而不是 NULL 吗?
我的预感是这是对R
语言的滥用,并且有充分的理由不会发生这种情况。但我发现这是我试图调试的代码中潜在错误的永久来源:
MWE
是的,我知道这是一个愚蠢的例子,我可以在尝试访问它之前添加一个元素是否存在的检查。但我并不是要知道我能做什么,如果我一直都有完美的记忆和意识,慢慢地解决这个功能不方便并让我很头疼的事实。我试图完全避免头痛,也许是以代码速度为代价。
所以:我想知道的是...
(a) 是否有可能做到这一点。我最初的尝试失败了,我被困在试图阅读C
“$”的内部以了解如何正确处理参数
(b) 如果是这样,是否有充分的理由不(或不)这样做。
基本上,我的想法是,与其编写每个依赖于从列表访问中返回的非 null 的函数来仔细检查,我可以只编写一个函数来仔细检查并相信其余函数不会被调用未满足的先决条件 b/c 失败的列表访问将快速失败。
java - 使用 Junit 进行 Web 服务功能/集成测试
这个问题旨在找到比我更好的解决方案。
我的集成测试有以下要求:
- 每个集成测试都在单个测试类中实现。
- 测试类中的方法必须按顺序执行。
- 每种方法都是集成/功能测试的一个步骤。
- 如果测试方法失败,则必须跳过测试类中的所有其他测试方法 - 因为查找后续错误没有意义。
我的解决方案如下所示:
我只是从我的抽象测试类继承每个测试类:
有人有更好的主意吗?我的问题:我不能并行运行这样一个测试类,因为类名表示跳过......
不!它不是重复的! 我尝试编写以特定顺序使用不同(网络)服务的功能测试。问题“我如何测试 servlet?” 是完全不同的!
反正。我切换到TestNG。TestNG 支持我的所有要求,并且像魅力一样工作。我不再需要我的胶水代码了!
java - 为什么 Hashmap fail-fast 不会在 resize 函数中发生?(对于多线程竞争条件问题)
总而言之,我试图了解 Hashmap resize 函数的多线程竞争条件问题。
正如我从这里读到的。竞争条件问题将导致条目列表的无限循环链接。
我已经知道它Hashmap
具有快速故障机制来立即停止多个线程访问它。以下代码显示了这一点。
我的问题是为什么快速失败不适用于调整大小功能?我调试的代码如下。(jdk1.7)
因为for
不使用Iterator
?
更新
还是因为 resize 函数没有使用Put*
, Remove*
,Clear*
方法会导致modCount
值改变?请帮忙确认一下。(原谅我英语不好。)
谢谢。
java - 多个线程在单个集合上使用 iterator.remove() 返回快速失败的迭代器
甲骨文说
请注意, Iterator.remove 是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了基础集合,则行为未指定。
这是否意味着即使多个线程一起迭代同一个集合的快速失败实现的 ( Vector
, Hashmap
, ArrayList
, HashSet
) 对象执行iterator.remove()也不会ConcurrentModificationException
抛出?
short-circuiting - Hystrix 配置
我正在尝试使用 hystrix-javanica 为我的应用程序实现 hystrix。
我已经配置了 hystrix-configuration.properties 如下
短路模式工作正常,但我对此有疑问hystrix.command.default.circuitBreaker.requestVolumeThreshold=3
- 它是在 3 次故障后声明开路还是
- 在 3 次并发故障后打开电路。
通过文档链接
有人可以回答吗?
c# - 优雅地处理损坏的状态异常
与此问题相关,我想强制 CLR 让我的 .NET 4.5.2 应用程序捕获损坏状态异常,其唯一目的是记录它们然后终止应用程序。如果我catch (Exception ex)
在应用程序周围的几个地方都有这样做的正确方法是什么?
所以,在我指定<legacyCorruptedStateExceptionsPolicy>
属性之后,如果我理解正确,所有的catch (Exception ex)
处理程序都会像这样捕获异常AccessViolationException
并愉快地继续。
是的,我知道这catch (Exception ex)
是一个坏主意™,但如果 CLR 至少将正确的堆栈跟踪放入事件日志中,我会非常乐意向客户解释他的服务器应用程序在凌晨 1 点快速失败并离线晚上是个好东西。但不幸的是,CLR 在事件日志中记录了一个不相关的异常,然后关闭了进程,这样我就无法查明实际发生了什么。
问题是,如何在整个过程中实现这一点:
(更新)
换句话说,这可能适用于简单应用程序中的大多数异常:
但是,它不适用于:
- 未处理的应用程序域异常(即在非前台线程上抛出)
- Windows 服务应用程序(没有实际
Main
入口点)
所以这似乎<legacyCorruptedStateExceptionsPolicy>
是完成这项工作的唯一方法,在这种情况下,我不知道在登录 CSE 后如何失败?