Storm:ERROR o.a.s.util - Halting process: ("Worker died")

本文详细解析了Apache Storm中PVSumBolt组件遇到的类型转换异常问题,强调了spout层与bolt层数据类型一致性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8216 [Thread-26-PVSumBolt-executor[6 6]] ERROR o.a.s.util - Async loop died!
java.lang.RuntimeException: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:485) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:451) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:73) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.daemon.executor$fn__5044$fn__5057$fn__5110.invoke(executor.clj:846) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.util$async_loop$fn__557.invoke(util.clj:484) [storm-core-1.1.0.jar:1.1.0]
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_161]
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    at org.apache.storm.tuple.TupleImpl.getInteger(TupleImpl.java:116) ~[storm-core-1.1.0.jar:1.1.0]
    at com.agg.storm.pv.PVSumBolt.execute(PVSumBolt.java:32) ~[storm/:?]
    at org.apache.storm.daemon.executor$fn__5044$tuple_action_fn__5046.invoke(executor.clj:727) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.daemon.executor$mk_task_receiver$fn__4965.invoke(executor.clj:459) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.disruptor$clojure_handler$reify__4480.onEvent(disruptor.clj:40) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:472) ~[storm-core-1.1.0.jar:1.1.0]
    ... 6 more
8224 [Thread-26-PVSumBolt-executor[6 6]] ERROR o.a.s.d.executor - 
java.lang.RuntimeException: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:485) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:451) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:73) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.daemon.executor$fn__5044$fn__5057$fn__5110.invoke(executor.clj:846) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.util$async_loop$fn__557.invoke(util.clj:484) [storm-core-1.1.0.jar:1.1.0]
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_161]
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    at org.apache.storm.tuple.TupleImpl.getInteger(TupleImpl.java:116) ~[storm-core-1.1.0.jar:1.1.0]
    at com.agg.storm.pv.PVSumBolt.execute(PVSumBolt.java:32) ~[storm/:?]
    at org.apache.storm.daemon.executor$fn__5044$tuple_action_fn__5046.invoke(executor.clj:727) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.daemon.executor$mk_task_receiver$fn__4965.invoke(executor.clj:459) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.disruptor$clojure_handler$reify__4480.onEvent(disruptor.clj:40) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:472) ~[storm-core-1.1.0.jar:1.1.0]
    ... 6 more
8239 [Thread-26-PVSumBolt-executor[6 6]] ERROR o.a.s.util - Halting process: ("Worker died")
java.lang.RuntimeException: ("Worker died")

    at org.apache.storm.util$exit_process_BANG_.doInvoke(util.clj:341) [storm-core-1.1.0.jar:1.1.0]
    at clojure.lang.RestFn.invoke(RestFn.java:423) [clojure-1.7.0.jar:?]
    at org.apache.storm.daemon.worker$fn__5642$fn__5643.invoke(worker.clj:759) [storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.daemon.executor$mk_executor_data$fn__4863$fn__4864.invoke(executor.clj:274) [storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.util$async_loop$fn__557.invoke(util.clj:494) [storm-core-1.1.0.jar:1.1.0]
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_161]

 

仔细看日志:是类型转换异常的错误。

通常出现这种错误主要是在bolt层:

在bolt层使用input.getXXX方法获取数据的时候会出现类型转换异常,因此一定要注意spout层输入数据与bolt层获取数据的类型一定要一致。

 

### Java中`stop failed`异常的解决方案 当遇到 `Java.lang.RuntimeException: stop failed` 异常时,通常意味着在尝试停止录音或其他媒体操作过程中出现了错误。此问题可能由多种原因引起,包括但不限于资源未正确初始化、设备权限不足或硬件不支持等。 #### 可能的原因分析 1. **资源管理不当** 如果 `MediaRecorder` 对象在其生命周期内未能被适当地配置,则可能会抛出此类异常。确保所有的设置都按照官方文档的要求完成,并且在调用 `start()` 方法之前已经完成了必要的准备工作[^3]。 2. **文件路径问题** 录音文件的目标位置可能存在访问权限问题或是磁盘空间已满等问题。应验证应用程序具有写入外部存储器所需的权限,并确认有足够的可用空间来保存录制的数据[^1]。 3. **并发冲突** 当多个线程试图同时控制同一个 `MediaRecorder` 实例时也会引发该异常。务必保证只有一个线程负责处理这些敏感的操作,并考虑使用同步机制防止竞态条件的发生[^4]。 4. **前置准备不足** 在某些情况下,如果摄像头或者其他传感器没有准备好就启动了 MediaRecorder 的话也有可能触发这个错误。因此,在实际应用开发当中应该先获取并锁定相机实例之后再创建和配置 MediaRecorder。 #### 推荐实践措施 为了有效预防上述提到的各种潜在风险因素,建议采取如下最佳做法: - 始终遵循 Android 官方指南中的步骤去构建和释放 `MediaRecorder` 资源; - 使用 try-catch 结构捕获可能出现的任何运行期异常,并给予用户友好的提示信息; - 尽量减少不必要的 API 调用次数,特别是在 UI 主线程上执行耗时任务的情况下更要注意这一点; 下面给出一段改进后的代码片段作为参考实现方式之一: ```java private void safeStopRecording(){ if (mediaRecorder != null){ try { mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; if (cameraDevice != null){ cameraDevice.close(); cameraDevice = null; } } catch (RuntimeException e) { Log.e(TAG, "Error stopping recording", e); // Handle the error appropriately here. } } } ``` 通过这种方式可以更好地管理和监控整个过程的状态变化情况,从而降低发生意外的概率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值