|
32 | 32 | MessageId, |
33 | 33 | CompressionType, |
34 | 34 | ConsumerType, |
| 35 | + KeySharedMode, |
| 36 | + ConsumerKeySharedPolicy, |
35 | 37 | PartitionsRoutingMode, |
36 | 38 | AuthenticationBasic, |
37 | 39 | AuthenticationTLS, |
@@ -1437,6 +1439,135 @@ def send_callback(res, msg): |
1437 | 1439 | producer.flush() |
1438 | 1440 | client.close() |
1439 | 1441 |
|
| 1442 | + def test_keyshare_policy(self): |
| 1443 | + with self.assertRaises(ValueError): |
| 1444 | + # Raise error because sticky ranges are not provided. |
| 1445 | + pulsar.ConsumerKeySharedPolicy( |
| 1446 | + key_shared_mode=pulsar.KeySharedMode.Sticky, |
| 1447 | + allow_out_of_order_delivery=False, |
| 1448 | + ) |
| 1449 | + |
| 1450 | + expected_key_shared_mode = pulsar.KeySharedMode.Sticky |
| 1451 | + expected_allow_out_of_order_delivery = True |
| 1452 | + expected_sticky_ranges = [(0, 100), (101,200)] |
| 1453 | + consumer_key_shared_policy = pulsar.ConsumerKeySharedPolicy( |
| 1454 | + key_shared_mode=expected_key_shared_mode, |
| 1455 | + allow_out_of_order_delivery=expected_allow_out_of_order_delivery, |
| 1456 | + sticky_ranges=expected_sticky_ranges |
| 1457 | + ) |
| 1458 | + |
| 1459 | + self.assertEqual(consumer_key_shared_policy.key_shared_mode, expected_key_shared_mode) |
| 1460 | + self.assertEqual(consumer_key_shared_policy.allow_out_of_order_delivery, expected_allow_out_of_order_delivery) |
| 1461 | + self.assertEqual(consumer_key_shared_policy.sticky_ranges, expected_sticky_ranges) |
| 1462 | + |
| 1463 | + def test_keyshared_invalid_sticky_ranges(self): |
| 1464 | + client = Client(self.serviceUrl) |
| 1465 | + topic = "my-python-topic-keyshare-invalid-" + str(time.time()) |
| 1466 | + with self.assertRaises(ValueError): |
| 1467 | + consumer_key_shared_policy = pulsar.ConsumerKeySharedPolicy( |
| 1468 | + key_shared_mode=pulsar.KeySharedMode.Sticky, |
| 1469 | + allow_out_of_order_delivery=False, |
| 1470 | + sticky_ranges=[(0,65536)] |
| 1471 | + ) |
| 1472 | + client.subscribe(topic, "my-sub", consumer_type=ConsumerType.KeyShared, |
| 1473 | + start_message_id_inclusive=True, |
| 1474 | + key_shared_policy=consumer_key_shared_policy) |
| 1475 | + |
| 1476 | + with self.assertRaises(ValueError): |
| 1477 | + consumer_key_shared_policy = pulsar.ConsumerKeySharedPolicy( |
| 1478 | + key_shared_mode=pulsar.KeySharedMode.Sticky, |
| 1479 | + allow_out_of_order_delivery=False, |
| 1480 | + sticky_ranges=[(0, 100), (50, 150)] |
| 1481 | + ) |
| 1482 | + client.subscribe(topic, "my-sub", consumer_type=ConsumerType.KeyShared, |
| 1483 | + start_message_id_inclusive=True, |
| 1484 | + key_shared_policy=consumer_key_shared_policy) |
| 1485 | + |
| 1486 | + |
| 1487 | + def test_keyshared_autosplit(self): |
| 1488 | + client = Client(self.serviceUrl) |
| 1489 | + topic = "my-python-topic-keyshare-autosplit-" + str(time.time()) |
| 1490 | + consumer_key_shared_policy = pulsar.ConsumerKeySharedPolicy( |
| 1491 | + key_shared_mode=pulsar.KeySharedMode.AutoSplit, |
| 1492 | + allow_out_of_order_delivery=True, |
| 1493 | + ) |
| 1494 | + |
| 1495 | + consumer = client.subscribe(topic, "my-sub", consumer_type=ConsumerType.KeyShared, consumer_name = 'con-1', |
| 1496 | + start_message_id_inclusive=True, key_shared_policy=consumer_key_shared_policy) |
| 1497 | + consumer2 = client.subscribe(topic, "my-sub", consumer_type=ConsumerType.KeyShared, consumer_name = 'con-2', |
| 1498 | + start_message_id_inclusive=True, key_shared_policy=consumer_key_shared_policy) |
| 1499 | + producer = client.create_producer(topic) |
| 1500 | + |
| 1501 | + for i in range(10): |
| 1502 | + if i > 0: |
| 1503 | + time.sleep(0.02) |
| 1504 | + producer.send(b"hello-%d" % i) |
| 1505 | + |
| 1506 | + msgs = [] |
| 1507 | + while True: |
| 1508 | + try: |
| 1509 | + msg = consumer.receive(100) |
| 1510 | + except pulsar.Timeout: |
| 1511 | + break |
| 1512 | + msgs.append(msgs) |
| 1513 | + consumer.acknowledge(msg) |
| 1514 | + |
| 1515 | + while True: |
| 1516 | + try: |
| 1517 | + msg = consumer2.receive(100) |
| 1518 | + except pulsar.Timeout: |
| 1519 | + break |
| 1520 | + msgs.append(msgs) |
| 1521 | + consumer2.acknowledge(msg) |
| 1522 | + |
| 1523 | + self.assertEqual(len(msgs), 10) |
| 1524 | + client.close() |
| 1525 | + |
| 1526 | + def test_sticky_autosplit(self): |
| 1527 | + client = Client(self.serviceUrl) |
| 1528 | + topic = "my-python-topic-keyshare-sticky-" + str(time.time()) |
| 1529 | + consumer_key_shared_policy = pulsar.ConsumerKeySharedPolicy( |
| 1530 | + key_shared_mode=pulsar.KeySharedMode.Sticky, |
| 1531 | + allow_out_of_order_delivery=True, |
| 1532 | + sticky_ranges=[(0,30000)], |
| 1533 | + ) |
| 1534 | + |
| 1535 | + consumer = client.subscribe(topic, "my-sub", consumer_type=ConsumerType.KeyShared, consumer_name='con-1', |
| 1536 | + start_message_id_inclusive=True, key_shared_policy=consumer_key_shared_policy) |
| 1537 | + |
| 1538 | + consumer2_key_shared_policy = pulsar.ConsumerKeySharedPolicy( |
| 1539 | + key_shared_mode=pulsar.KeySharedMode.Sticky, |
| 1540 | + allow_out_of_order_delivery=True, |
| 1541 | + sticky_ranges=[(30001, 65535)], |
| 1542 | + ) |
| 1543 | + consumer2 = client.subscribe(topic, "my-sub", consumer_type=ConsumerType.KeyShared, consumer_name='con-2', |
| 1544 | + start_message_id_inclusive=True, key_shared_policy=consumer2_key_shared_policy) |
| 1545 | + producer = client.create_producer(topic) |
| 1546 | + |
| 1547 | + for i in range(10): |
| 1548 | + if i > 0: |
| 1549 | + time.sleep(0.02) |
| 1550 | + producer.send(b"hello-%d" % i) |
| 1551 | + |
| 1552 | + msgs = [] |
| 1553 | + while True: |
| 1554 | + try: |
| 1555 | + msg = consumer.receive(100) |
| 1556 | + except pulsar.Timeout: |
| 1557 | + break |
| 1558 | + msgs.append(msgs) |
| 1559 | + consumer.acknowledge(msg) |
| 1560 | + |
| 1561 | + while True: |
| 1562 | + try: |
| 1563 | + msg = consumer2.receive(100) |
| 1564 | + except pulsar.Timeout: |
| 1565 | + break |
| 1566 | + msgs.append(msgs) |
| 1567 | + consumer2.acknowledge(msg) |
| 1568 | + |
| 1569 | + self.assertEqual(len(msgs), 10) |
| 1570 | + client.close() |
1440 | 1571 |
|
1441 | 1572 | if __name__ == "__main__": |
1442 | 1573 | main() |
0 commit comments