Search in sources :

Example 51 with PulsarClientException

use of org.apache.pulsar.client.api.PulsarClientException in project incubator-pulsar by apache.

the class PersistentTopicE2ETest method testSubscriptionTypeTransitions.

@Test
public void testSubscriptionTypeTransitions() throws Exception {
    final String topicName = "persistent://prop/use/ns-abc/shared-topic2";
    final String subName = "sub2";
    Consumer<byte[]> consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscriptionType(SubscriptionType.Exclusive).subscribe();
    Consumer<byte[]> consumer2 = null;
    Consumer<byte[]> consumer3 = null;
    PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
    PersistentSubscription subRef = topicRef.getSubscription(subName);
    // 1. shared consumer on an exclusive sub fails
    try {
        consumer2 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscriptionType(SubscriptionType.Shared).subscribe();
        fail("should have failed");
    } catch (PulsarClientException e) {
        assertTrue(e.getMessage().contains("Subscription is of different type"));
    }
    // 2. failover consumer on an exclusive sub fails
    try {
        consumer3 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscriptionType(SubscriptionType.Failover).subscribe();
        fail("should have failed");
    } catch (PulsarClientException e) {
        assertTrue(e.getMessage().contains("Subscription is of different type"));
    }
    // 3. disconnected sub can be converted in shared
    consumer1.close();
    try {
        consumer2 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscriptionType(SubscriptionType.Shared).subscribe();
        assertEquals(subRef.getDispatcher().getType(), SubType.Shared);
    } catch (PulsarClientException e) {
        fail("should not fail");
    }
    // 4. exclusive fails on shared sub
    try {
        consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscriptionType(SubscriptionType.Exclusive).subscribe();
        fail("should have failed");
    } catch (PulsarClientException e) {
        assertTrue(e.getMessage().contains("Subscription is of different type"));
    }
    // 5. disconnected sub can be converted in failover
    consumer2.close();
    try {
        consumer3 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscriptionType(SubscriptionType.Failover).subscribe();
        assertEquals(subRef.getDispatcher().getType(), SubType.Failover);
    } catch (PulsarClientException e) {
        fail("should not fail");
    }
    // 5. exclusive consumer can connect after failover disconnects
    consumer3.close();
    try {
        consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscriptionType(SubscriptionType.Exclusive).subscribe();
        assertEquals(subRef.getDispatcher().getType(), SubType.Exclusive);
    } catch (PulsarClientException e) {
        fail("should not fail");
    }
    consumer1.close();
    admin.persistentTopics().delete(topicName);
}
Also used : PersistentTopic(org.apache.pulsar.broker.service.persistent.PersistentTopic) PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) PersistentSubscription(org.apache.pulsar.broker.service.persistent.PersistentSubscription) Test(org.testng.annotations.Test)

Example 52 with PulsarClientException

use of org.apache.pulsar.client.api.PulsarClientException in project incubator-pulsar by apache.

the class V1_ProducerConsumerTest method testSillyUser.

@Test
public void testSillyUser() {
    try {
        PulsarClient.create("invalid://url");
        Assert.fail("should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.InvalidServiceURL);
    }
    ProducerConfiguration producerConf = new ProducerConfiguration();
    try {
        producerConf.setSendTimeout(-1, TimeUnit.SECONDS);
        Assert.fail("should fail");
    } catch (IllegalArgumentException e) {
    // ok
    }
    try {
        producerConf.setMaxPendingMessages(0);
        Assert.fail("should fail");
    } catch (IllegalArgumentException e) {
    // ok
    }
    try {
        pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic7", (ProducerConfiguration) null);
        Assert.fail("should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
    }
    try {
        pulsarClient.createProducer("invalid://topic", producerConf);
        Assert.fail("should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.InvalidTopicNameException);
    }
    ConsumerConfiguration consumerConf = new ConsumerConfiguration();
    try {
        consumerConf.setMessageListener(null);
        Assert.fail("should fail");
    } catch (NullPointerException e) {
    // ok
    }
    try {
        consumerConf.setSubscriptionType(null);
        Assert.fail("should fail");
    } catch (NullPointerException e) {
    // ok
    }
    try {
        consumerConf.setReceiverQueueSize(-1);
        Assert.fail("should fail");
    } catch (IllegalArgumentException e) {
    // ok
    }
    try {
        pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic7", "my-subscriber-name", (ConsumerConfiguration) null);
        Assert.fail("Should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
    }
    try {
        pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic7", null, consumerConf);
        Assert.fail("Should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
    }
    try {
        pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic7", "", consumerConf);
        Assert.fail("Should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
    }
    try {
        pulsarClient.subscribe("invalid://topic7", "my-subscriber-name", consumerConf);
        Assert.fail("Should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.InvalidTopicNameException);
    }
}
Also used : PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) ConsumerConfiguration(org.apache.pulsar.client.api.ConsumerConfiguration) ProducerConfiguration(org.apache.pulsar.client.api.ProducerConfiguration) Test(org.testng.annotations.Test)

Example 53 with PulsarClientException

use of org.apache.pulsar.client.api.PulsarClientException in project incubator-pulsar by apache.

the class V1_ProducerConsumerTest method testInvalidSequence.

@Test
public void testInvalidSequence() throws Exception {
    log.info("-- Starting {} test --", methodName);
    PulsarClient client1 = PulsarClient.create("http://127.0.0.1:" + BROKER_WEBSERVICE_PORT);
    client1.close();
    ConsumerConfiguration consumerConf = new ConsumerConfiguration();
    consumerConf.setSubscriptionType(SubscriptionType.Exclusive);
    try {
        client1.subscribe("persistent://my-property/use/my-ns/my-topic6", "my-subscriber-name", consumerConf);
        Assert.fail("Should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.AlreadyClosedException);
    }
    try {
        client1.createProducer("persistent://my-property/use/my-ns/my-topic6");
        Assert.fail("Should fail");
    } catch (PulsarClientException e) {
        Assert.assertTrue(e instanceof PulsarClientException.AlreadyClosedException);
    }
    Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic6", "my-subscriber-name", consumerConf);
    try {
        Message msg = MessageBuilder.create().setContent("InvalidMessage".getBytes()).build();
        consumer.acknowledge(msg);
    } catch (PulsarClientException.InvalidMessageException e) {
    // ok
    }
    consumer.close();
    try {
        consumer.receive();
        Assert.fail("Should fail");
    } catch (PulsarClientException.AlreadyClosedException e) {
    // ok
    }
    try {
        consumer.unsubscribe();
        Assert.fail("Should fail");
    } catch (PulsarClientException.AlreadyClosedException e) {
    // ok
    }
    Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic6");
    producer.close();
    try {
        producer.send("message".getBytes());
        Assert.fail("Should fail");
    } catch (PulsarClientException.AlreadyClosedException e) {
    // ok
    }
}
Also used : Consumer(org.apache.pulsar.client.api.Consumer) Message(org.apache.pulsar.client.api.Message) Producer(org.apache.pulsar.client.api.Producer) ConsumerConfiguration(org.apache.pulsar.client.api.ConsumerConfiguration) PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) PulsarClient(org.apache.pulsar.client.api.PulsarClient) Test(org.testng.annotations.Test)

Example 54 with PulsarClientException

use of org.apache.pulsar.client.api.PulsarClientException in project incubator-pulsar by apache.

the class V1_ProducerConsumerTest method testMutlipleSharedConsumerBlockingWithUnAckedMessages.

/**
 * Verify: Consumer1 which doesn't send ack will not impact Consumer2 which sends ack for consumed message.
 *
 * @param batchMessageDelayMs
 * @throws Exception
 */
@Test
public void testMutlipleSharedConsumerBlockingWithUnAckedMessages() throws Exception {
    log.info("-- Starting {} test --", methodName);
    int unAckedMessages = pulsar.getConfiguration().getMaxUnackedMessagesPerConsumer();
    try {
        final int maxUnackedMessages = 20;
        final int receiverQueueSize = 10;
        final int totalProducedMsgs = 100;
        int totalReceiveMessages = 0;
        pulsar.getConfiguration().setMaxUnackedMessagesPerConsumer(maxUnackedMessages);
        ConsumerConfiguration conf = new ConsumerConfiguration();
        conf.setReceiverQueueSize(receiverQueueSize);
        conf.setSubscriptionType(SubscriptionType.Shared);
        Consumer consumer1 = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic", "subscriber-1", conf);
        Consumer consumer2 = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic", "subscriber-1", conf);
        ProducerConfiguration producerConf = new ProducerConfiguration();
        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic", producerConf);
        // (1) Produced Messages
        for (int i = 0; i < totalProducedMsgs; i++) {
            String message = "my-message-" + i;
            producer.send(message.getBytes());
        }
        // (2) Consumer1: consume without ack:
        // try to consume messages: but will be able to consume number of messages = maxUnackedMessages
        Message msg = null;
        List<Message> messages = Lists.newArrayList();
        for (int i = 0; i < totalProducedMsgs; i++) {
            msg = consumer1.receive(1, TimeUnit.SECONDS);
            if (msg != null) {
                messages.add(msg);
                totalReceiveMessages++;
                log.info("Received message: " + new String(msg.getData()));
            } else {
                break;
            }
        }
        // client must receive number of messages = unAckedMessagesBufferSize rather all produced messages
        assertEquals(messages.size(), maxUnackedMessages);
        // (3.1) Consumer2 will start consuming messages without ack: it should stop after maxUnackedMessages
        messages.clear();
        for (int i = 0; i < totalProducedMsgs - maxUnackedMessages; i++) {
            msg = consumer2.receive(1, TimeUnit.SECONDS);
            if (msg != null) {
                messages.add(msg);
                totalReceiveMessages++;
                log.info("Received message: " + new String(msg.getData()));
            } else {
                break;
            }
        }
        assertEquals(messages.size(), maxUnackedMessages);
        // (3.2) ack for all maxUnackedMessages
        messages.forEach(m -> {
            try {
                consumer2.acknowledge(m);
            } catch (PulsarClientException e) {
                fail("shouldn't have failed ", e);
            }
        });
        // (4) Consumer2 consumer and ack: so it should consume all remaining messages
        messages.clear();
        for (int i = 0; i < totalProducedMsgs - (2 * maxUnackedMessages); i++) {
            msg = consumer2.receive(1, TimeUnit.SECONDS);
            if (msg != null) {
                messages.add(msg);
                totalReceiveMessages++;
                consumer2.acknowledge(msg);
                log.info("Received message: " + new String(msg.getData()));
            } else {
                break;
            }
        }
        // verify total-consumer messages = total-produce messages
        assertEquals(totalProducedMsgs, totalReceiveMessages);
        producer.close();
        consumer1.close();
        consumer2.close();
        log.info("-- Exiting {} test --", methodName);
    } catch (Exception e) {
        fail();
    } finally {
        pulsar.getConfiguration().setMaxUnackedMessagesPerConsumer(unAckedMessages);
    }
}
Also used : Consumer(org.apache.pulsar.client.api.Consumer) Producer(org.apache.pulsar.client.api.Producer) Message(org.apache.pulsar.client.api.Message) ConsumerConfiguration(org.apache.pulsar.client.api.ConsumerConfiguration) PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) ProducerConfiguration(org.apache.pulsar.client.api.ProducerConfiguration) PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) Test(org.testng.annotations.Test)

Example 55 with PulsarClientException

use of org.apache.pulsar.client.api.PulsarClientException in project incubator-pulsar by apache.

the class BrokerClientIntegrationTest method testResetCursor.

@Test(timeOut = 10000, dataProvider = "subType")
public void testResetCursor(SubscriptionType subType) throws Exception {
    final RetentionPolicies policy = new RetentionPolicies(60, 52 * 1024);
    final TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/unacked-topic");
    final int warmup = 20;
    final int testSize = 150;
    final List<Message<byte[]>> received = new ArrayList<>();
    final String subsId = "sub";
    final NavigableMap<Long, TimestampEntryCount> publishTimeIdMap = new ConcurrentSkipListMap<>();
    // set delay time to start dispatching messages to active consumer in order to avoid message duplication
    conf.setActiveConsumerFailoverDelayTimeMillis(500);
    restartBroker();
    admin.namespaces().setRetention(topicName.getNamespace(), policy);
    ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName.toString()).subscriptionName(subsId).subscriptionType(subType).messageListener((consumer, msg) -> {
        try {
            synchronized (received) {
                received.add(msg);
            }
            consumer.acknowledge(msg);
            long publishTime = ((MessageImpl<?>) msg).getPublishTime();
            log.info(" publish time is " + publishTime + "," + msg.getMessageId());
            TimestampEntryCount timestampEntryCount = publishTimeIdMap.computeIfAbsent(publishTime, (k) -> new TimestampEntryCount(publishTime));
            timestampEntryCount.incrementAndGet();
        } catch (final PulsarClientException e) {
            log.warn("Failed to ack!");
        }
    });
    Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
    Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
    final Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString()).create();
    log.info("warm up started for " + topicName.toString());
    // send warmup msgs
    byte[] msgBytes = new byte[1000];
    for (Integer i = 0; i < warmup; i++) {
        producer.send(msgBytes);
    }
    log.info("warm up finished.");
    // sleep to ensure receiving of msgs
    for (int n = 0; n < 10 && received.size() < warmup; n++) {
        Thread.sleep(200);
    }
    // validate received msgs
    Assert.assertEquals(received.size(), warmup);
    received.clear();
    // publish testSize num of msgs
    log.info("Sending more messages.");
    for (Integer n = 0; n < testSize; n++) {
        producer.send(msgBytes);
        Thread.sleep(1);
    }
    log.info("Sending more messages done.");
    Thread.sleep(3000);
    long begints = publishTimeIdMap.firstEntry().getKey();
    long endts = publishTimeIdMap.lastEntry().getKey();
    // find reset timestamp
    long timestamp = (endts - begints) / 2 + begints;
    timestamp = publishTimeIdMap.floorKey(timestamp);
    NavigableMap<Long, TimestampEntryCount> expectedMessages = new ConcurrentSkipListMap<>();
    expectedMessages.putAll(publishTimeIdMap.tailMap(timestamp, true));
    received.clear();
    log.info("reset cursor to " + timestamp + " for topic " + topicName.toString() + " for subs " + subsId);
    log.info("issuing admin operation on " + admin.getServiceUrl().toString());
    List<String> subList = admin.persistentTopics().getSubscriptions(topicName.toString());
    for (String subs : subList) {
        log.info("got sub " + subs);
    }
    publishTimeIdMap.clear();
    // reset the cursor to this timestamp
    Assert.assertTrue(subList.contains(subsId));
    admin.persistentTopics().resetCursor(topicName.toString(), subsId, timestamp);
    Thread.sleep(3000);
    int totalExpected = 0;
    for (TimestampEntryCount tec : expectedMessages.values()) {
        totalExpected += tec.numMessages;
    }
    // validate that replay happens after the timestamp
    Assert.assertTrue(publishTimeIdMap.firstEntry().getKey() >= timestamp);
    consumer1.close();
    consumer2.close();
    producer.close();
    // validate that expected and received counts match
    int totalReceived = 0;
    for (TimestampEntryCount tec : publishTimeIdMap.values()) {
        totalReceived += tec.numMessages;
    }
    Assert.assertEquals(totalReceived, totalExpected, "did not receive all messages on replay after reset");
    resetConfig();
    restartBroker();
}
Also used : RetentionPolicies(org.apache.pulsar.common.policies.data.RetentionPolicies) ConcurrentSkipListMap(java.util.concurrent.ConcurrentSkipListMap) Message(org.apache.pulsar.client.api.Message) ArrayList(java.util.ArrayList) TopicName(org.apache.pulsar.common.naming.TopicName) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) Test(org.testng.annotations.Test)

Aggregations

PulsarClientException (org.apache.pulsar.client.api.PulsarClientException)59 Test (org.testng.annotations.Test)24 CompletableFuture (java.util.concurrent.CompletableFuture)17 Message (org.apache.pulsar.client.api.Message)13 IOException (java.io.IOException)12 ByteBuf (io.netty.buffer.ByteBuf)11 PulsarClient (org.apache.pulsar.client.api.PulsarClient)11 ExecutionException (java.util.concurrent.ExecutionException)10 Consumer (org.apache.pulsar.client.api.Consumer)10 Producer (org.apache.pulsar.client.api.Producer)10 ConsumerConfiguration (org.apache.pulsar.client.api.ConsumerConfiguration)8 MessageId (org.apache.pulsar.client.api.MessageId)8 ProducerConfiguration (org.apache.pulsar.client.api.ProducerConfiguration)7 List (java.util.List)6 Logger (org.slf4j.Logger)6 LoggerFactory (org.slf4j.LoggerFactory)6 HashSet (java.util.HashSet)5 TimeUnit (java.util.concurrent.TimeUnit)5 Map (java.util.Map)4 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)4