消息队列Pulsar入门(二) UI工具Pulsar Manage 部署,Topic Namespace详解,附源码演示

1,395 阅读3分钟

前言

上一篇文章,介绍了Pulsar的生产者,消费者以及Topic的入门概念,最后留了疑问
1 有没有UI工具能够动态的一手掌握管理Pulsar
2 如何操作Pulsar的Topic,创建租户,namespace

消息队列Pulsar入门(一) 生产者/消费者/Topic详解,附源码演示

Pulsar Manager

docker启动

docker run --name pulsar-manager -dit -p 9527:9527 -p 7750:7750 -e SPRING_CONFIGURATION_FILE=/pulsar-manager/pulsar-manager/application.properties  apachepulsar/pulsar-manager

浏览器访问

http://部署机器IP:9527

image.png

内置登录账号

请注意Pulsar Manage启动后,登陆界面需输入账号密码,这里的账号密码需要手动内置,执行以下shell
CSRF_TOKEN=$(curl http://localhost:7750/pulsar-manager/csrf-token)
curl \

   -H 'X-XSRF-TOKEN: $CSRF_TOKEN' \

   -H 'Cookie: XSRF-TOKEN=$CSRF_TOKEN;' \

   -H "Content-Type: application/json" \

   -X PUT http://localhost:7750/pulsar-manager/users/superuser \

   -d '{"name": "admin", "password": "apachepulsar", "description": "test", "email": "username@test.org"}'

image.png

账号登陆

输入刚才内置的账号密码 admin/apachepulsar 直接登陆即可
然后将我们的pulsar环境信息添加进去就可以了
随便点点可以看到之前我们操作过的topic各种信息

image.png

image.png

image.png

Topic详解

Pulsar对topic的命名有如下规则,
{persistent|non-persistent}://tenant/namespace/topic,具体意义看上一篇文章
默认是persistent://public/default/topic
直接尝试跑程序程序创建,是会报错的,我们通过刚才的Pulsar manage先创建好命名空间 namespace_test4(也可以命令行,代码等创建,这里只演示PulsarManage)
/**
 * 报错
 * 向租户sample 命名空间 namespace_test4  topic topic-haha1 发送消息
 * 注意namespace需手动先创建好,否则会报错 olicies not found for sample/namespace_test4 namespace
 */
@Test
public void testProduce322() throws Exception {
    Producer<String> producer = client.newProducer(Schema.STRING)
            .topic("persistent://sample/namespace_test4/topic-haha1")
            .enableBatching(false)
            .create();
    producer.send("向租户sample 命名空间 namespace_test2  topic topic-haha1 发送消息");
    System.in.read();
}

image.png

测试namespace

1 向租户public 命名空间namespace_test1 topic topic-demo1 发送消息
  然后消费者设置 persistent://public/namespace_test1/topic-demo1 与topic-demo1消费
  看看那个会消费?? 只有persistent://public/namespace_test1/topic-demo1会消费,因为指定了namespace
/**
 * 向租户public 命名空间 namespace_test1 topic topic-demo1 发送消息
 */
@Test
public void testProduce1() throws Exception {
    Producer<String> producer = client.newProducer(Schema.STRING)
            .topic("persistent://public/namespace_test1/topic-demo1")
            .enableBatching(false)
            .create();
    producer.send("111");
    System.in.read();
}

/**
 * 测试消费
 * 只会打印出 Message received my-subscription2 因为指定了 namespace
 */
@Test
public void testConsumer1() throws IOException {
    MessageListener myMessageListener = (consumer, msg) -> {
        try {
            System.out.println("Message received my-subscription1 : " + new String(msg.getData()));
            consumer.acknowledge(msg);
        } catch (Exception e) {
            consumer.negativeAcknowledge(msg);
        }
    };
    Consumer consumer = client.newConsumer()
            .topic("topic-demo1")
            .subscriptionName("my-subscription1")
            .messageListener(myMessageListener)
            .subscribe();

    MessageListener myMessageListener2 = (consumer2, msg) -> {
        try {
            System.out.println("Message received my-subscription2 : " + new String(msg.getData()));
            consumer2.acknowledge(msg);
        } catch (Exception e) {
            consumer2.negativeAcknowledge(msg);
        }
    };
    Consumer consumer2 = client.newConsumer()
            .topic("persistent://public/namespace_test1/topic-demo1")
            .subscriptionName("my-subscription2")
            .messageListener(myMessageListener2)
            .subscribe();

    System.in.read();
}

image.png

验证默认persistent://public/default/topic

往topic hh_xixi1 发送一条消息,然后有三个消费者
hh_xixi1     会消费
persistent://public/default/hh_xixi1      会消费 符合默认
non-persistent://public/default/hh_xixi1   不会消费 因为是non-persistent
/**
 * 默认是persistent://public/default/topic
 */
@Test
public void testProduce3() throws Exception {
    Producer<String> producer = client.newProducer(Schema.STRING)
            .topic("hh_xixi1")
            .enableBatching(false)
            .create();
    producer.send("hh-xixi1");
    System.in.read();
}


/**
 * 测试消费
 * 也就是默认是 persistent://public/default/topic
 * 只会打印 my-subscription1 my-subscription2  不可打印 my-subscription3 因为设置接受的是非久化接收 non-persistent
 */
@Test
public void testConsumer4() throws IOException {
    MessageListener myMessageListener = (consumer, msg) -> {
        try {
            System.out.println("Message received my-subscription1 : " + new String(msg.getData()));
            consumer.acknowledge(msg);
        } catch (Exception e) {
            consumer.negativeAcknowledge(msg);
        }
    };
    Consumer consumer = client.newConsumer()
            .topic("hh_xixi1")
            .subscriptionName("my-subscription1")
            .messageListener(myMessageListener)
            .subscribe();


    MessageListener myMessageListener2 = (consumer2, msg) -> {
        try {
            System.out.println("Message received my-subscription2 : " + new String(msg.getData()));
            consumer2.acknowledge(msg);
        } catch (Exception e) {
            consumer2.negativeAcknowledge(msg);
        }
    };
    Consumer consumer2 = client.newConsumer()
            //验证默认是 persistent://public/default/topic
            .topic("persistent://public/default/hh_xixi1")
            .subscriptionName("my-subscription2")
            .messageListener(myMessageListener2)
            .subscribe();


    MessageListener myMessageListener3 = (consumer3, msg) -> {
        try {
            System.out.println("Message received my-subscription3 : " + new String(msg.getData()));
            consumer3.acknowledge(msg);
        } catch (Exception e) {
            consumer3.negativeAcknowledge(msg);
        }
    };
    Consumer consumer3 = client.newConsumer()
            //非持久化
            .topic("non-persistent://public/default/hh_xixi1")
            .subscriptionName("my-subscription3")
            .messageListener(myMessageListener3)
            .subscribe();

    System.in.read();
}

image.png