Search in sources :

Example 1 with AckReplyConsumer

use of com.google.cloud.pubsub.spi.v1.AckReplyConsumer in project google-cloud-java by GoogleCloudPlatform.

the class MessageDispatcher method processOutstandingBatches.

public void processOutstandingBatches() {
    while (true) {
        boolean batchDone = false;
        Runnable batchCallback = null;
        OutstandingMessage outstandingMessage;
        synchronized (outstandingMessageBatches) {
            OutstandingMessagesBatch nextBatch = outstandingMessageBatches.peek();
            if (nextBatch == null) {
                return;
            }
            outstandingMessage = nextBatch.messages.peek();
            if (outstandingMessage == null) {
                return;
            }
            try {
                // This is a non-blocking flow controller.
                flowController.reserve(1, outstandingMessage.receivedMessage().getMessage().getSerializedSize());
            } catch (FlowController.MaxOutstandingElementCountReachedException | FlowController.MaxOutstandingRequestBytesReachedException flowControlException) {
                return;
            } catch (FlowControlException unexpectedException) {
                throw new IllegalStateException("Flow control unexpected exception", unexpectedException);
            }
            // We got a hold to the message already.
            nextBatch.messages.poll();
            batchDone = nextBatch.messages.isEmpty();
            if (batchDone) {
                outstandingMessageBatches.poll();
                batchCallback = nextBatch.doneCallback;
            }
        }
        final PubsubMessage message = outstandingMessage.receivedMessage().getMessage();
        final AckHandler ackHandler = outstandingMessage.ackHandler();
        final SettableFuture<AckReply> response = SettableFuture.create();
        final AckReplyConsumer consumer = new AckReplyConsumer() {

            @Override
            public void ack() {
                response.set(AckReply.ACK);
            }

            @Override
            public void nack() {
                response.set(AckReply.NACK);
            }
        };
        Futures.addCallback(response, ackHandler);
        executor.submit(new Runnable() {

            @Override
            public void run() {
                try {
                    receiver.receiveMessage(message, consumer);
                } catch (Exception e) {
                    response.setException(e);
                }
            }
        });
        if (batchDone) {
            batchCallback.run();
        }
    }
}
Also used : OutstandingMessage(com.google.cloud.pubsub.spi.v1.MessageDispatcher.OutstandingMessagesBatch.OutstandingMessage) PubsubMessage(com.google.pubsub.v1.PubsubMessage) FlowControlException(com.google.api.gax.batching.FlowController.FlowControlException) FlowControlException(com.google.api.gax.batching.FlowController.FlowControlException)

Example 2 with AckReplyConsumer

use of com.google.cloud.pubsub.spi.v1.AckReplyConsumer in project google-cloud-java by GoogleCloudPlatform.

the class ITPubSubTest method testPublishSubscribe.

@Test
public void testPublishSubscribe() throws Exception {
    TopicName topicName = TopicName.create(projectId, formatForTest("testing-publish-subscribe-topic"));
    SubscriptionName subscriptionName = SubscriptionName.create(projectId, formatForTest("testing-publish-subscribe-subscription"));
    topicAdminClient.createTopic(topicName);
    subscriptionAdminClient.createSubscription(subscriptionName, topicName, PushConfig.newBuilder().build(), 10);
    PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("my message")).build();
    final SettableApiFuture<PubsubMessage> received = SettableApiFuture.create();
    Subscriber subscriber = Subscriber.defaultBuilder(subscriptionName, new MessageReceiver() {

        @Override
        public void receiveMessage(final PubsubMessage message, final AckReplyConsumer consumer) {
            if (received.set(message)) {
                consumer.ack();
            } else {
                consumer.nack();
            }
        }
    }).build();
    subscriber.addListener(new Subscriber.Listener() {

        public void failed(Subscriber.State from, Throwable failure) {
            received.setException(failure);
        }
    }, MoreExecutors.directExecutor());
    subscriber.startAsync();
    Publisher publisher = Publisher.defaultBuilder(topicName).build();
    publisher.publish(message).get();
    publisher.shutdown();
    assertEquals(received.get().getData(), message.getData());
    subscriber.stopAsync().awaitTerminated();
    subscriptionAdminClient.deleteSubscription(subscriptionName);
    topicAdminClient.deleteTopic(topicName);
}
Also used : Subscriber(com.google.cloud.pubsub.spi.v1.Subscriber) MessageReceiver(com.google.cloud.pubsub.spi.v1.MessageReceiver) SubscriptionName(com.google.pubsub.v1.SubscriptionName) Publisher(com.google.cloud.pubsub.spi.v1.Publisher) AckReplyConsumer(com.google.cloud.pubsub.spi.v1.AckReplyConsumer) PubsubMessage(com.google.pubsub.v1.PubsubMessage) TopicName(com.google.pubsub.v1.TopicName) Test(org.junit.Test)

Example 3 with AckReplyConsumer

use of com.google.cloud.pubsub.spi.v1.AckReplyConsumer in project google-cloud-java by GoogleCloudPlatform.

the class CreateSubscriptionAndConsumeMessages method main.

public static void main(String... args) throws Exception {
    TopicName topic = TopicName.create("my-project-id", "my-topic-id");
    SubscriptionName subscription = SubscriptionName.create("my-project-id", "my-topic-id");
    try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
        subscriptionAdminClient.createSubscription(subscription, topic, PushConfig.getDefaultInstance(), 0);
    }
    MessageReceiver receiver = new MessageReceiver() {

        @Override
        public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
            System.out.println("Received message: " + message.getData().toStringUtf8());
            consumer.ack();
        }
    };
    Subscriber subscriber = null;
    try {
        subscriber = Subscriber.defaultBuilder(subscription, receiver).build();
        subscriber.addListener(new Subscriber.Listener() {

            @Override
            public void failed(Subscriber.State from, Throwable failure) {
                // Handle failure. This is called when the Subscriber encountered a fatal error and is shutting down.
                System.err.println(failure);
            }
        }, MoreExecutors.directExecutor());
        subscriber.startAsync().awaitRunning();
        Thread.sleep(60000);
    } finally {
        if (subscriber != null) {
            subscriber.stopAsync();
        }
    }
}
Also used : MessageReceiver(com.google.cloud.pubsub.spi.v1.MessageReceiver) Subscriber(com.google.cloud.pubsub.spi.v1.Subscriber) SubscriptionAdminClient(com.google.cloud.pubsub.spi.v1.SubscriptionAdminClient) SubscriptionName(com.google.pubsub.v1.SubscriptionName) AckReplyConsumer(com.google.cloud.pubsub.spi.v1.AckReplyConsumer) PubsubMessage(com.google.pubsub.v1.PubsubMessage) TopicName(com.google.pubsub.v1.TopicName)

Example 4 with AckReplyConsumer

use of com.google.cloud.pubsub.spi.v1.AckReplyConsumer in project google-cloud-java by GoogleCloudPlatform.

the class SubscriberSnippets method createSubscriber.

private void createSubscriber() throws Exception {
    // [START pubsub_pull]
    String projectId = "my-project-id";
    String subscriptionId = "my-subscription-id";
    SubscriptionName subscriptionName = SubscriptionName.create(projectId, subscriptionId);
    // Instantiate an asynchronous message receiver
    MessageReceiver receiver = new MessageReceiver() {

        @Override
        public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
            // handle incoming message, then ack/nack the received message
            System.out.println("Id : " + message.getMessageId());
            System.out.println("Data : " + message.getData().toStringUtf8());
            consumer.ack();
        }
    };
    Subscriber subscriber = null;
    try {
        // Create a subscriber for "my-subscription-id" bound to the message receiver
        subscriber = Subscriber.defaultBuilder(subscriptionName, receiver).build();
        subscriber.startAsync();
    // ...
    } finally {
        // stop receiving messages
        if (subscriber != null) {
            subscriber.stopAsync();
        }
    }
// [END pubsub_pull]
}
Also used : MessageReceiver(com.google.cloud.pubsub.spi.v1.MessageReceiver) Subscriber(com.google.cloud.pubsub.spi.v1.Subscriber) SubscriptionName(com.google.pubsub.v1.SubscriptionName) AckReplyConsumer(com.google.cloud.pubsub.spi.v1.AckReplyConsumer) PubsubMessage(com.google.pubsub.v1.PubsubMessage)

Aggregations

PubsubMessage (com.google.pubsub.v1.PubsubMessage)4 AckReplyConsumer (com.google.cloud.pubsub.spi.v1.AckReplyConsumer)3 MessageReceiver (com.google.cloud.pubsub.spi.v1.MessageReceiver)3 Subscriber (com.google.cloud.pubsub.spi.v1.Subscriber)3 SubscriptionName (com.google.pubsub.v1.SubscriptionName)3 TopicName (com.google.pubsub.v1.TopicName)2 FlowControlException (com.google.api.gax.batching.FlowController.FlowControlException)1 OutstandingMessage (com.google.cloud.pubsub.spi.v1.MessageDispatcher.OutstandingMessagesBatch.OutstandingMessage)1 Publisher (com.google.cloud.pubsub.spi.v1.Publisher)1 SubscriptionAdminClient (com.google.cloud.pubsub.spi.v1.SubscriptionAdminClient)1 Test (org.junit.Test)1