Pulsar Schema
Pulsar 对于特定结构的数据可以在构造生产者的时候构建schema
Schema 实例
假设一条消息是如下的格式,[name,address,age]
创建Schema
public class userReading {
public String name;
public String address;
public int age;
public userReading(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
public userReading() {
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "userReading{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", age=" + age +
'}';
}
}
创建client
private static PulsarClient mkClient(String URL) {
try {
PulsarClient client = PulsarClient.builder()
.serviceUrl(URL)
.build();
return client;
} catch (PulsarClientException e) {
e.printStackTrace();
}
return null;
}
创建 指定Schema 的生产者
Producer<userReading> producer = client.newProducer(JSONSchema.of(userReading.class))
.topic("user-readings")
.create();
生产消费者完整案例
Schema
package Schema_test;
public class userReading {
public String name;
public String address;
public int age;
public userReading(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
public userReading() {
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "userReading{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", age=" + age +
'}';
}
}
schemaExample_send
package Schema_test;
import org.apache.pulsar.client.api.Producer;
import org.apache.pulsar.client.api.PulsarClient;
import org.apache.pulsar.client.api.PulsarClientException;
import org.apache.pulsar.client.api.Schema;
import org.apache.pulsar.client.impl.schema.JSONSchema;
import java.util.Scanner;
public class schemaExample_send {
public static void main(String[] args) throws PulsarClientException {
String Pulsar_URL="pulsar://localhost:6650";
PulsarClient client = mkClient(Pulsar_URL);
send(client);
}
private static void send(PulsarClient client) throws PulsarClientException {
Producer<userReading> producer = client.newProducer(JSONSchema.of(userReading.class))
.topic("user-readings")
.create();
for (int i=0;i<100;i++) {
userReading user=new userReading(("thc"+i),("广州"+i),i);
producer.send(user);
System.out.println("消息已发送: "+ user.toString());
}
}
private static PulsarClient mkClient(String URL) {
try {
PulsarClient client = PulsarClient.builder()
.serviceUrl(URL)
.build();
return client;
} catch (PulsarClientException e) {
e.printStackTrace();
}
return null;
}
}
SchemaExample_receive
package Schema_test;
import org.apache.pulsar.client.api.Consumer;
import org.apache.pulsar.client.api.Message;
import org.apache.pulsar.client.api.PulsarClient;
import org.apache.pulsar.client.api.PulsarClientException;
public class SchemaExample_receive {
public static void main(String[] args) throws PulsarClientException {
String Pulsar_URL="pulsar://localhost:6650";
PulsarClient client=mkClient(Pulsar_URL);
receive(client);
}
private static PulsarClient mkClient(String URL) {
try {
PulsarClient client = PulsarClient.builder()
.serviceUrl(URL)
.build();
return client;
} catch (PulsarClientException e) {
e.printStackTrace();
}
return null;
}
private static void receive (PulsarClient client) throws PulsarClientException {
Consumer consumer = null;
consumer = client.newConsumer(JSONSchema.of(userReading.class))
.topic("user-readings")
.subscriptionName("my-subscription")
.subscribe();
while (true){
Message msg= null;
try {
msg = consumer.receive();
System.out.println("Message received: " +new String(msg.getData()));
//确认消息,以便删除已经接受的消息
consumer.acknowledge(msg);
} catch (PulsarClientException e) {
//消息处理失败,请稍后重新传递
consumer.negativeAcknowledge(msg);
}
}
}
}
结果截图
send
receive
如果在不指定schema 的情况下构造生产者,则生产者只能生成类型为byte[]的消息
Producer<byte[]> producer = client.newProducer()
.topic(topic)
.create();
以下常用schema格式
bytes
不指定Schema或 字节数组Schema :
Producer<byte[]> bytesProducer = client.newProducer(Schema.BYTES)
.topic("some-raw-bytes-topic")
.create();
或者
Producer<byte[]> bytesProducer = client.newProducer()
.topic("some-raw-bytes-topic")
.create();
String
UTF-8编码的String 字符串
Producer<String> stringProducer = client.newProducer(Schema.STRING)
.topic("some-string-topic")
.create();
JSON
Producer<MyPojo> pojoProducer = client.newProducer(Schema.JSON(MyPojo.class))
.topic("some-pojo-topic")
.create();
PROTOBUF
Producer<MyProtobuf> protobufProducer = client.newProducer(Schema.PROTOBUF(MyProtobuf.class))
.topic("some-protobuf-topic")
.create();
AVRO
Producer<MyAvro> avroProducer = client.newProducer(Schema.AVRO(MyAvro.class))
.topic("some-avro-topic")
.create();