@@ -148,7 +148,64 @@ void publishToMovingQq() {
148
148
})
149
149
.build ();
150
150
assertThat (consumeSync ).completes ();
151
- assertThat (messageIds ).containsOnly (1L , 2L , 3L );
151
+ assertThat (messageIds ).containsExactlyInAnyOrder (1L , 2L , 3L );
152
+ } finally {
153
+ management .queueDeletion ().delete (q );
154
+ }
155
+ }
156
+
157
+ @ Test
158
+ void consumeFromMovingQq () {
159
+ try {
160
+ management .queue (q ).type (Management .QueueType .QUORUM ).declare ();
161
+
162
+ AmqpConnection consumeConnection = connection (b -> b .affinity ().queue (q ).operation (CONSUME ));
163
+ assertThat (consumeConnection ).isOnFollower (queueInfo ());
164
+
165
+ Set <Long > messageIds = ConcurrentHashMap .newKeySet ();
166
+ Sync consumeSync = sync ();
167
+ consumeConnection
168
+ .consumerBuilder ()
169
+ .queue (q )
170
+ .messageHandler (
171
+ (ctx , msg ) -> {
172
+ messageIds .add (msg .messageIdAsLong ());
173
+ consumeSync .down ();
174
+ ctx .accept ();
175
+ })
176
+ .build ();
177
+
178
+ Publisher publisher = connection .publisherBuilder ().queue (q ).build ();
179
+ Sync publishSync = sync ();
180
+ publisher .publish (publisher .message ().messageId (1L ), ctx -> publishSync .down ());
181
+ assertThat (publishSync ).completes ();
182
+ publishSync .reset ();
183
+
184
+ assertThat (consumeSync ).completes ();
185
+ assertThat (messageIds ).containsExactlyInAnyOrder (1L );
186
+ consumeSync .reset ();
187
+
188
+ String follower = consumeConnection .connectionNodename ();
189
+
190
+ deleteQqMember (follower );
191
+
192
+ publisher .publish (publisher .message ().messageId (2L ), ctx -> publishSync .down ());
193
+ assertThat (publishSync ).completes ();
194
+ publishSync .reset ();
195
+
196
+ assertThat (consumeSync ).completes ();
197
+ assertThat (messageIds ).containsExactlyInAnyOrder (1L , 2L );
198
+ consumeSync .reset ();
199
+
200
+ addQqMember (follower );
201
+
202
+ publisher .publish (publisher .message ().messageId (3L ), ctx -> publishSync .down ());
203
+ assertThat (publishSync ).completes ();
204
+ publishSync .reset ();
205
+
206
+ assertThat (consumeSync ).completes ();
207
+ assertThat (messageIds ).containsExactlyInAnyOrder (1L , 2L , 3L );
208
+ consumeSync .reset ();
152
209
} finally {
153
210
management .queueDeletion ().delete (q );
154
211
}
@@ -166,12 +223,16 @@ String deleteQqLeader() {
166
223
Management .QueueInfo info = queueInfo ();
167
224
String initialLeader = info .leader ();
168
225
int initialReplicaCount = info .replicas ().size ();
169
- Cli . deleteQuorumQueueMember ( q , initialLeader );
226
+ deleteQqMember ( initialLeader );
170
227
TestUtils .waitAtMost (() -> !queueInfo ().leader ().equals (initialLeader ));
171
228
assertThat (queueInfo ().replicas ()).hasSize (initialReplicaCount - 1 );
172
229
return initialLeader ;
173
230
}
174
231
232
+ void deleteQqMember (String member ) {
233
+ Cli .deleteQuorumQueueMember (q , member );
234
+ }
235
+
175
236
void addQqMember (String newMember ) {
176
237
Management .QueueInfo info = queueInfo ();
177
238
int initialReplicaCount = info .replicas ().size ();
0 commit comments