虽然堆栈跟踪略有不同,但我能够使用以下输出重现类似的情况:
Exception in thread "Thread-5" java.lang.IllegalArgumentException: string length (200) exceeds maximum (10) at com.rti.dds.cdr.CdrInputStream.readString(CdrInputStream.java:364) at stringStructTypeSupport.deserialize_key_sample(stringStructTypeSupport.java:411) at com.rti.dds.topic.TypeSupportImpl.deserialize_key(TypeSupportImpl.java:1027) at com.rti.dds.topic.TypeSupportImpl.deserialize_keyI(TypeSupportImpl.java:965) PRESCstReaderCollator_storeSampleData:!deserialize
请注意,我使用的是5.1.0,它的错误消息有点冗长。
发生这种情况的条件如下:
protocol.serialize_key_with_dispose
dispose()
resource_limits.type_code_max_serialized_length
resource_limits.type_object_max_serialized_length
特别 protocol.serialize_key_with_dispose 通常不会改变,这似乎是这个的唯一原因 deserialize_key 函数可能会显示在堆栈跟踪中。如果你检查你的 rtireplay 配置并找到此特定设置设置为 true 那么这里描述的场景很可能就是你的情况。
deserialize_key
rtireplay
true
该 serialize_key_with_dispose 设置是为了允许键值的第一个样本恰好是a的情况 dispose 。这意味着该实例尚不清楚。通常,实际键值不会使用dispose传播,而只会传播散列键。这可能不足以确定dispose用于哪个实例。将此策略设置为true会导致使用dispose传播完整键值。它与...有关 propagate_dispose_of_unregistered_instances 。有关详细信息,请参阅部分 6.5.3.5使用处理实例通知传播序列化密钥 的 Connext用户手册
serialize_key_with_dispose
dispose
propagate_dispose_of_unregistered_instances