/**
 * Copyright 2017 Streamlio
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package tutorial;

import org.apache.pulsar.client.api.CompressionType;
import org.apache.pulsar.client.api.Message;
import org.apache.pulsar.client.api.MessageBuilder;
import org.apache.pulsar.client.api.MessageId;
import org.apache.pulsar.client.api.Producer;
import org.apache.pulsar.client.api.PulsarClient;
import org.apache.pulsar.client.api.PulsarClientException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.stream.IntStream;

public class ProducerTutorial {
    private static final Logger log = LoggerFactory.getLogger(ProducerTutorial.class);
    private static final String SERVICE_URL = "pulsar://localhost:6650";
    private static final String TOPIC_NAME = "tutorial-topic";

    public static void main(String[] args) throws IOException {
        // Create a Pulsar client instance. A single instance can be shared across many
        // producers and consumer within the same application
        PulsarClient client = PulsarClient.builder()
                .serviceUrl(SERVICE_URL)
                .build();

        // Here you get the chance to configure producer specific settings
        Producer<byte[]> producer = client.newProducer()
                // Set the topic
                .topic(TOPIC_NAME)
                // Enable compression
                .compressionType(CompressionType.LZ4)
                .create();

        // Once the producer is created, it can be used for the entire application life-cycle
        log.info("Created producer for the topic {}", TOPIC_NAME);

        // Send 10 test messages
        IntStream.range(1, 11).forEach(i -> {
            String content = String.format("hello-pulsar-%d", i);

            // Build a message object
            Message<byte[]> msg = MessageBuilder.create()
                    .setContent(content.getBytes())
                    .build();

            // Send each message and log message content and ID when successfully received
            try {
                MessageId msgId = producer.send(msg);

                log.info("Published message '{}' with the ID {}", content, msgId);
            } catch (PulsarClientException e) {
                log.error(e.getMessage());
            }
        });

        client.close();
    }
}