如果你想使用SpringBoot集成Pulsar的客户端可以通过 spring for apache pualsr 进行,但是他对您jdk以及springboot版本有一定要求。
1.设置java客户端类库
1.1 Maven
如果使用Maven,请将以下信息添加到pom.xml文件中。
<!-- in your <properties> block -->
<pulsar.version>3.0.0</pulsar.version>
<!-- in your <dependencies> block -->
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-client</artifactId>
<version>${pulsar.version}</version>
</dependency>
1.2 Gradle
如果您使用Gradle,请添加以下信息到bulid.gradle文件。
def pulsarVersion = '3.0.0'
dependencies {
compile group: 'org.apache.pulsar', name: 'pulsar-client', version: pulsarVersion
}
2.初始化java客户端
你可以实例化一个PulsarClient对象,只需要为pulsar集群提供一个URL,如下所示:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://localhost:6650")
.build();
如果你有多个代理,你可以像这样启动一个PulsarClient:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://localhost:6650,localhost:6651,localhost:6652")
.build();
3.使用java客户端
3.1 producer
实例化PulsarClient对象之后,就可以为特定的topic创建一个Producer。
Producer<byte[]> producer = client.newProducer()
.topic("my-topic")
.create();
// You can then send messages to the broker and topic you specified:
producer.send("My message".getBytes());
默认情况下,producer生成由字节数组组成的消息。您可以通过指定消息模式来生成不同的类型,后面会详细介绍schema的定义。
// 指定消息类型为String
Producer<String> stringProducer = client.newProducer(Schema.STRING)
.topic("my-topic")
.create();
stringProducer.send("My message");
如果不需要时,请确保关闭他们。
producer.close();
consumer.close();
client.close();
//也可以异步关闭
producer.closeAsync()
.thenRun(() -> System.out.println("Producer closed"))
.exceptionally((ex) -> {
System.err.println("Failed to close producer: " + ex);
return null;
});
3.2 consumer
在Pulsar中,消费者订阅主题并处理生产者发布到这些主题的消息。您可以通过首先实例化PulsarClient对象并创建一个新的消费者。
在实例化了PulsarClient对象之后,可以通过指定主题和订阅名来创建Consumer。
Consumer consumer = client.newConsumer()
.topic("my-topic")
.subscriptionName("my-subscription")
.subscribe();
subscribe将自动订阅消费者指定的topic。可以设置一个while循环来持续监听消息。在下面这个示例中,打印counser接收到的任何消息的内容,然后确认消息已被处理(acknowledgment)。如果处理逻辑失败,您可以使用negative acknowledgment稍后重新传递消息.
while (true) {
// Wait for a message
Message msg = consumer.receive();
try {
// Do something with the message
System.out.println("Message received: " + new String(msg.getData()));
// Acknowledge the message
consumer.acknowledge(msg);
} catch (Exception e) {
// Message failed to process, redeliver later
consumer.negativeAcknowledge(msg);
}
}
如果不想阻塞主线程,但又不断地监听新消息,可以考虑使用MessageListener。MessageListener使用客户机内部的线程池。您可以在ClientBuilder中设置消息侦听器的线程数。MessageListener将使用PulsarClient内部的线程池。您可以在ClientBuilder中设置用于消息侦听器的线程数。
MessageListener myMessageListener = (consumer, msg) -> {
try {
System.out.println("Message received: " + new String(msg.getData()));
consumer.acknowledge(msg);
} catch (Exception e) {
consumer.negativeAcknowledge(msg);
}
}
Consumer consumer = client.newConsumer()
.topic("my-topic")
.subscriptionName("my-subscription")
.messageListener(myMessageListener)
.subscribe();
3.3 reader
通过reader接口,pulsar客户端可以在主题中“手动定位”自己,并从指定的消息中读取所有消息。Java的Pulsar API允许您通过指定主题和MessageId来创建Reader对象。
示例如下:
byte[] msgIdBytes = // Some message ID byte array
MessageId id = MessageId.fromByteArray(msgIdBytes);
Reader reader = pulsarClient.newReader()
.topic(topic)
.startMessageId(id)
.create();
while (true) {
Message message = reader.readNext();
// Process message
}
在上面的例子中,为特定的Topic(按message ID)实例化了一个Reader对象,reader遍历主题中的每条消息(如何获得该值取决于应用程序)。
也可以使用MessageId.earliest指向关于MessageId主题的最早可用消息。MessageId.latest指向最近可用的消息。
我们一般通过Reader进行消息的重放.