1616
1717package io .rsocket .fragmentation ;
1818
19- import static io .rsocket .fragmentation .FrameReassembler .createFrameReassembler ;
20- import static io .rsocket .util .AbstractionLeakingFrameUtils .toAbstractionLeakingFrame ;
21-
2219import io .netty .buffer .ByteBufAllocator ;
2320import io .netty .buffer .PooledByteBufAllocator ;
21+ import io .netty .util .collection .IntObjectHashMap ;
22+ import io .netty .util .collection .LongObjectHashMap ;
2423import io .rsocket .DuplexConnection ;
2524import io .rsocket .Frame ;
2625import io .rsocket .util .AbstractionLeakingFrameUtils ;
2726import io .rsocket .util .NumberUtils ;
28- import java .util .Objects ;
29- import org .jctools .maps .NonBlockingHashMapLong ;
3027import org .reactivestreams .Publisher ;
3128import reactor .core .publisher .Flux ;
3229import reactor .core .publisher .Mono ;
3330
31+ import java .util .Collection ;
32+ import java .util .Objects ;
33+
34+ import static io .rsocket .fragmentation .FrameReassembler .createFrameReassembler ;
35+ import static io .rsocket .util .AbstractionLeakingFrameUtils .toAbstractionLeakingFrame ;
36+
3437/**
3538 * A {@link DuplexConnection} implementation that fragments and reassembles {@link Frame}s.
3639 *
@@ -46,8 +49,7 @@ public final class FragmentationDuplexConnection implements DuplexConnection {
4649
4750 private final FrameFragmenter frameFragmenter ;
4851
49- private final NonBlockingHashMapLong <FrameReassembler > frameReassemblers =
50- new NonBlockingHashMapLong <>();
52+ private final IntObjectHashMap <FrameReassembler > frameReassemblers = new IntObjectHashMap <>();
5153
5254 /**
5355 * Creates a new instance.
@@ -85,7 +87,16 @@ public FragmentationDuplexConnection(
8587
8688 delegate
8789 .onClose ()
88- .doFinally (signalType -> frameReassemblers .values ().forEach (FrameReassembler ::dispose ))
90+ .doFinally (
91+ signalType -> {
92+ Collection <FrameReassembler > values ;
93+ synchronized (this ) {
94+ values = frameReassemblers .values ();
95+ }
96+ for (FrameReassembler reassembler : values ) {
97+ reassembler .dispose ();
98+ }
99+ })
89100 .subscribe ();
90101 }
91102
@@ -134,9 +145,13 @@ private Flux<Frame> toFragmentedFrames(int streamId, io.rsocket.framing.Frame fr
134145 }
135146
136147 private Mono <Frame > toReassembledFrames (int streamId , io .rsocket .framing .Frame fragment ) {
137- FrameReassembler frameReassembler =
138- frameReassemblers .computeIfAbsent (
139- (long ) streamId , i -> createFrameReassembler (byteBufAllocator ));
148+ FrameReassembler frameReassembler ;
149+
150+ synchronized (this ) {
151+ frameReassembler =
152+ frameReassemblers .computeIfAbsent (
153+ streamId , i -> createFrameReassembler (byteBufAllocator ));
154+ }
140155
141156 return Mono .justOrEmpty (frameReassembler .reassemble (fragment ))
142157 .map (frame -> toAbstractionLeakingFrame (byteBufAllocator , streamId , frame ));
0 commit comments