|
18 | 18 |
|
19 | 19 | import static org.junit.jupiter.api.Assertions.assertEquals;
|
20 | 20 | import static org.junit.jupiter.api.Assertions.assertNotNull;
|
| 21 | +import static org.junit.jupiter.api.Assertions.assertNull; |
21 | 22 | import static org.junit.jupiter.api.Assertions.assertTrue;
|
22 | 23 |
|
23 | 24 | import java.util.ArrayList;
|
|
28 | 29 | import java.util.concurrent.atomic.AtomicInteger;
|
29 | 30 |
|
30 | 31 | import org.apache.activemq.artemis.api.core.ActiveMQException;
|
| 32 | +import org.apache.activemq.artemis.api.core.Message; |
31 | 33 | import org.apache.activemq.artemis.api.core.SimpleString;
|
| 34 | +import org.apache.activemq.artemis.api.core.client.ClientConsumer; |
32 | 35 | import org.apache.activemq.artemis.api.core.client.ClientMessage;
|
33 | 36 | import org.apache.activemq.artemis.api.core.client.ClientProducer;
|
34 | 37 | import org.apache.activemq.artemis.api.core.client.ClientSession;
|
35 | 38 | import org.apache.activemq.artemis.api.core.client.TopologyMember;
|
36 | 39 | import org.apache.activemq.artemis.core.client.impl.TopologyMemberImpl;
|
| 40 | +import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle; |
37 | 41 | import org.apache.activemq.artemis.core.server.cluster.MessageFlowRecord;
|
38 | 42 | import org.apache.activemq.artemis.core.server.cluster.impl.BridgeTestAccessor;
|
39 | 43 | import org.apache.activemq.artemis.core.server.cluster.impl.ClusterConnectionBridge;
|
40 | 44 | import org.apache.activemq.artemis.core.server.cluster.impl.ClusterConnectionImpl;
|
41 | 45 | import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
|
| 46 | +import org.apache.activemq.artemis.core.settings.impl.AddressSettings; |
42 | 47 | import org.apache.activemq.artemis.tests.integration.cluster.distribution.ClusterTestBase;
|
43 | 48 | import org.apache.activemq.artemis.tests.util.Wait;
|
44 | 49 | import org.junit.jupiter.api.AfterEach;
|
@@ -305,6 +310,105 @@ public void testClusterBridgeAddRemoteBinding() throws Exception {
|
305 | 310 | stopServers(0, 1);
|
306 | 311 | }
|
307 | 312 |
|
| 313 | + @Test |
| 314 | + public void testBadClientSendMessagesToSnFQueue() throws Exception { |
| 315 | + setupServer(0, isFileStorage(), isNetty()); |
| 316 | + setupServer(1, isFileStorage(), isNetty()); |
| 317 | + |
| 318 | + setupClusterConnection("cluster0", "queues", MessageLoadBalancingType.ON_DEMAND, 1, isNetty(), 0, 1); |
| 319 | + |
| 320 | + setupClusterConnection("cluster1", "queues", MessageLoadBalancingType.ON_DEMAND, 1, isNetty(), 1, 0); |
| 321 | + |
| 322 | + String dla = "DLA"; |
| 323 | + AddressSettings addressSettings = new AddressSettings(); |
| 324 | + addressSettings.setDeadLetterAddress(SimpleString.of(dla)); |
| 325 | + |
| 326 | + servers[0].getAddressSettingsRepository().addMatch("#", addressSettings); |
| 327 | + servers[1].getAddressSettingsRepository().addMatch("#", addressSettings); |
| 328 | + |
| 329 | + startServers(0, 1); |
| 330 | + |
| 331 | + setupSessionFactory(0, isNetty()); |
| 332 | + setupSessionFactory(1, isNetty()); |
| 333 | + |
| 334 | + createQueue(0, dla, dla, null, true); |
| 335 | + createQueue(1, dla, dla, null, true); |
| 336 | + |
| 337 | + waitForBindings(0, dla, 1, 0, true); |
| 338 | + waitForBindings(1, dla, 1, 0, true); |
| 339 | + |
| 340 | + ClientSession session0 = sfs[0].createSession(); |
| 341 | + ClientSession session1 = sfs[1].createSession(); |
| 342 | + |
| 343 | + session0.start(); |
| 344 | + session1.start(); |
| 345 | + |
| 346 | + final int num = 10; |
| 347 | + |
| 348 | + SimpleString nodeId1 = servers[1].getNodeID(); |
| 349 | + ClusterConnectionImpl cc0 = (ClusterConnectionImpl) servers[0].getClusterManager().getClusterConnection("cluster0"); |
| 350 | + SimpleString snfQueue0 = cc0.getSfQueueName(nodeId1.toString()); |
| 351 | + |
| 352 | + ClientProducer badProducer0 = session0.createProducer(snfQueue0); |
| 353 | + for (int i = 0; i < num; i++) { |
| 354 | + Message msg = session0.createMessage(true); |
| 355 | + msg.putStringProperty("origin", "from producer 0"); |
| 356 | + badProducer0.send(msg); |
| 357 | + } |
| 358 | + |
| 359 | + //add a remote queue and consumer to enable message to flow from node 0 to node 1 |
| 360 | + createQueue(1, "queues.testaddress", "queue0", null, true); |
| 361 | + ClientConsumer consumer1 = session1.createConsumer("queue0"); |
| 362 | + |
| 363 | + waitForBindings(0, "queues.testaddress", 0, 0, true); |
| 364 | + waitForBindings(1, "queues.testaddress", 1, 1, true); |
| 365 | + |
| 366 | + waitForBindings(0, "queues.testaddress", 1, 1, false); |
| 367 | + waitForBindings(1, "queues.testaddress", 0, 0, false); |
| 368 | + |
| 369 | + ClientConsumer dlqConsumer = session0.createConsumer(dla); |
| 370 | + |
| 371 | + for (int i = 0; i < num; i++) { |
| 372 | + Message msg = session0.createMessage(true); |
| 373 | + msg.putStringProperty("origin", "from producer 0"); |
| 374 | + badProducer0.send(msg); |
| 375 | + } |
| 376 | + |
| 377 | + //messages will never reache the consumer |
| 378 | + assertNull(consumer1.receiveImmediate()); |
| 379 | + |
| 380 | + SimpleString idHeadersName = Message.HDR_ROUTE_TO_IDS.concat(snfQueue0); |
| 381 | + for (int i = 0; i < num * 2; i++) { |
| 382 | + ClientMessage m = dlqConsumer.receive(5000); |
| 383 | + assertNotNull(m); |
| 384 | + String propValue = m.getStringProperty("origin"); |
| 385 | + assertEquals("from producer 0", propValue); |
| 386 | + propValue = m.getStringProperty(Message.HDR_ROUTE_DLQ_DETAIL); |
| 387 | + assertEquals(ActiveMQMessageBundle.BUNDLE.messageMissingHeader(idHeadersName), propValue); |
| 388 | + m.acknowledge(); |
| 389 | + } |
| 390 | + assertNull(dlqConsumer.receiveImmediate()); |
| 391 | + |
| 392 | + //normal message flow should work |
| 393 | + ClientProducer goodProducer0 = session0.createProducer("queues.testaddress"); |
| 394 | + for (int i = 0; i < num; i++) { |
| 395 | + Message msg = session0.createMessage(true); |
| 396 | + msg.putStringProperty("origin", "from producer 0"); |
| 397 | + goodProducer0.send(msg); |
| 398 | + } |
| 399 | + |
| 400 | + //consumer1 can receive from node0 |
| 401 | + for (int i = 0; i < num; i++) { |
| 402 | + ClientMessage m = consumer1.receive(5000); |
| 403 | + assertNotNull(m); |
| 404 | + String propValue = m.getStringProperty("origin"); |
| 405 | + assertEquals("from producer 0", propValue); |
| 406 | + m.acknowledge(); |
| 407 | + } |
| 408 | + assertNull(consumer1.receiveImmediate()); |
| 409 | + |
| 410 | + stopServers(0, 1); |
| 411 | + } |
308 | 412 |
|
309 | 413 | @Override
|
310 | 414 | @AfterEach
|
|
0 commit comments