我通过交互式会话+在独立线程上运行的私有源(InputStream)连接到外部服务。在交互式会话中,我发送传出消息并接收包含不同字段的对象的同步响应,其中一个是ID和“状态”,以确认成功或失败。同时,我会收到有关此ID的私人Feed的消息,并进一步提供“状态”更新。我目前在一个ConcurrentHashMap中存储关于每个ID的状态的信息。我必须在这些对象上保留正确的事件序列,但目前我正在获得竞争条件,在我接收和处理交互式会话上的同步响应之前,有时我会处理和更新专用Feed上的对象,因此让我与ID的过时和不正确的状态。Java在并发中集合/获取集合
理想情况下,我希望拥有某种类型的带PutIfKeyExistOrWait(w超时)方法的集合,只有在密钥存在或等待时才会更新该值,以便在处理私有订阅源上的对象时使用。
有谁知道是否有合适的集合可用或可以建议我的问题的替代解决方案?谢谢。
如果稍后(当ID已存在时),PutIfKeyExistOrWait将无法帮助您收到2个异步通知,但由于竞争条件而以错误的顺序处理它们。这听起来像唯一的防弹方法是,如果传入的消息具有序列号。如果他们不这样做,我想下一个最好的办法是在每封邮件中附上收到邮件时的时间戳,然后根据时间戳对状态进行排序。 –
@EliAcherkan谢谢。私人订阅源上的异步消息是在单个线程中接收的,所以我可以'保证'这些消息的正确顺序。只有同步响应是导致问题的异步消息。时间戳也不起作用。这些消息通常在同一毫秒内接收,并且不能保证在私人订阅源上的消息之前收到同步响应,因此存在问题。 – hgus1294
对不起,我能想到的唯一选择是交互式会话具有一个“同步”块,用于检查密钥是否已通过私人订阅源插入到地图中,并相应地插入/更新状态。 –