簡體   English   中英

使用 pulsar 消息偵聽器進行多線程處理

[英]Multithreading with pulsar message listeners

我對java message listenersapache pulsar相當apache pulsar 假設我一直保持這樣的聽眾,

private MessageListener<byte[]> generateListener() {
        MessageListener<byte[]> listener = (consumer, respMsg) -> {
            String respM = new String(respMsg.getValue(), StandardCharsets.UTF_8);
            logger.info(respM);
            consumer.acknowledgeAsync(respMsg);
        };
        return listener;
    }

還有一個像這樣的消費者實例,

Consumer<byte[]> c = consumerBuilder.messageListener(generateListener()).topic(topicName).subscriptionName("Consumer-" + i).subscribeAsync().get();

我想知道的是此偵聽器將如何處理多個傳入消息? 是否會像 JMS 偵聽器那樣在單獨的線程中處理每條消息? 如果是這樣,那么我如何配置要使用的線程數 - 是使用ClientBuilder.listenerThreads()屬性嗎?

在維護多個消費者時,是否需要為每個消費者維護多個偵聽器對象,即類似這樣的東西 -

consumerBuilder.clone().messageListener(generateListener()).topic(topicName).subscriptionName("Consumer-" + i).subscribeAsync() ?

ClientBuilder#listenerThreads方法允許配置內部線程池的大小,該線程池將在將從該客戶端創建的所有ConsumersReaders之間共享和使用。

Pulsar Client 將向您保證單個消費者的MessageListener將始終由同一線程調用,即提供的MessageListener不需要是線程安全的。 因此,是的,每個Consumer使用專用的MessageListener對象。

請注意,這也確保了排序。

所以基本上,如果你只使用一個Consumer那么你可以將 listenerThreads 保持為1 (這是默認值)。

這是一個完整的示例,可用於觀察行為:

public class PulsarConsumerListenerExample {

    public static void main(String[] args) throws PulsarClientException {

        int numListenerThread = 2;

        PulsarClient client = PulsarClient
                .builder()
                .serviceUrl("pulsar://localhost:6650")
                .listenerThreads(numListenerThread)
                .build();

        final List<Consumer<?>> consumers = new ArrayList<>();
        for (int i = 0; i < numListenerThread; i++) {
            consumers.add(createConsumerWithLister(client, "my-topic", "my-subscription", "C" + i));
        }

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            for (Consumer<?> consumer : consumers) {
                try {
                    consumer.close();
                } catch (PulsarClientException e) {
                    e.printStackTrace();
                }
            }
        }));
    }

    private static Consumer<String> createConsumerWithLister(final PulsarClient client,
                                                             final String topic,
                                                             final String subscription,
                                                             final String consumerName) throws PulsarClientException {
        return client.newConsumer(Schema.STRING)
            .topic(topic)
            .consumerName(consumerName)
            .subscriptionName(subscription)
            .subscriptionMode(SubscriptionMode.Durable)
            .subscriptionType(SubscriptionType.Failover)
            .subscriptionInitialPosition(SubscriptionInitialPosition.Earliest)
            .messageListener((MessageListener<String>) (consumer, msg) -> {
                System.out.printf(
                    "[%s/%s]Message received: key=%s, value=%s, topic=%s, id=%s%n",
                    consumerName,
                    Thread.currentThread().getName(),
                    msg.getKey(),
                    msg.getValue(),
                    msg.getTopicName(),
                    msg.getMessageId().toString());
                consumer.acknowledgeAsync(msg);
            })
            .subscribe();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM