• 2.持久化、非持久化、租户、命名空间


    持久化的大白话说明

    Pulsar默认消息为持久化

    持久化消息

    只要消息产生了,除非所有硬盘都坏了,否则不会丢失

    非持久化消息

    消息存在内存中,服务挂了,或者消息产生式消费者未启动,都无法收到消息

    持久&非持久消息发送方法

    注:

    • 显示指定持久|非持久都需要指定租户和命名空间
    • pulsar默认命名租户为public,命名空间为default,会自动创建主题topic,但不会自动创建租户和命名空间
    • 命名空间和租户不存在直接调用会报异常,解决办法为创建先创建租户和命名空间,再调用生产者和消费者,租户和命名空间操作方法见下方的《维护租户&命名空间》

    生产者方法

        /**
         * 生产消息
         * @param msg
         * @param tag 0默认持久化的消息 1非持久化消息 2 持久化消息的另外一个写法,同0
         * @throws PulsarClientException
         */
        @GetMapping("/persistent/sendMsg")
        public MessageId sendMsg(String msg, String tag) throws PulsarClientException {
            PulsarClient pulsarFactory = pulsarConf.pulsarFactory();
            String topic="my-topic";
            if("1".equals(tag)) {
                topic="non-persistent://public/default/my-topic";
                       //非持久化         租户   命名空间   主题
            }
            if("2".equals(tag)){
                topic="persistent://public/default/my-topic";
                      //持久化         租户   命名空间   主题
            }
            Producer<byte[]> producer1 = pulsarFactory.newProducer()
                    .topic(topic)
                    .create();
            // 然后你就可以发送消息到指定的broker 和topic上:
            return producer1.send(msg.getBytes());
        }
    

    消费者方法

    注:监听方法同下

     /**
         * 手动执行获取消息
         * @param tag 0默认持久化的消息 1非持久化消息 2 持久化消息的另外一个写法,同0
         * @throws PulsarClientException
         */
        @GetMapping("/base/comsumer")
        public void comsumerByArtificial(String tag) throws PulsarClientException {
            PulsarClient pulsarFactory = pulsarConf.pulsarFactory();
            String topic="my-topic";
            if("1".equals(tag)) {
                topic="non-persistent://public/default/my-topic";
                       //非持久化         租户   命名空间   主题
            }
            if("2".equals(tag)){
                topic="persistent://public/default/my-topic";
                     //持久化         租户   命名空间   主题
            }
            Consumer<byte[]> consumer = pulsarFactory.newConsumer()
                    .topic(topic)
                    .subscriptionName("my-subscription")
                    .subscribe();
            Message<byte[]> receive = consumer.receive();
            System.out.println(new String(receive.getData()));
            consumer.acknowledge(receive);//确认消息被消费
            consumer.close();
        }
    

    维护租户&命名空间

    操作下面的所有代码,需要另外引入Jar,可以引入pulsar-client和pulsar-client-admin,也可以只引入pulsar-client-all

    如果通过RestApi或命令行来操作集群、租户、命名空间的操作,可以不看下面这些

            <dependency>
                <groupId>org.apache.pulsar</groupId>
                <artifactId>pulsar-client</artifactId>
                <version>2.8.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.pulsar</groupId>
                <artifactId>pulsar-client-admin</artifactId>
                <version>2.8.0</version>
            </dependency>
    <!--同时引入上面两个或只引入下面一个-->
            <dependency>
                <groupId>org.apache.pulsar</groupId>
                <artifactId>pulsar-client-all</artifactId>
                <version>2.8.0</version>
            </dependency>
    

    YML修改

    新增serviceHttpUrl,此端口为apache-pulsar-2.8.0/conf/standalone.conf--->webServicePort=9090 配置,默认8081

    server:
      port: 7777
    
    pulsar:
      url: 10.30.54.103:6650
      serviceHttpUrl: http://10.30.54.103:9090
    #  url: 10.30.54.103:6650,10.30.54.104:6650
    
    
    

    创建PulsarAdmin

    目的:用于操作租户和命名空间

    • 修改PulsarConf.java

      新增serviceHttpUrl和pulsarAdminFactory

    package com.project.pulsar.conf;
    
    import org.apache.pulsar.client.admin.PulsarAdmin;
    import org.apache.pulsar.client.api.PulsarClient;
    import org.apache.pulsar.client.api.PulsarClientException;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class PulsarConf {
        @Value("${pulsar.url}")
        String url;
        @Value("${pulsar.serviceHttpUrl}")
        String serviceHttpUrl;
    
        @Bean
        public PulsarClient pulsarFactory(){
            PulsarClient client = null;
            try {
                client = PulsarClient.builder()
                        .serviceUrl("pulsar://"+url)
                        .build();
            } catch (PulsarClientException e) {
            }
            return client;
        }
        @Bean
        public PulsarAdmin pulsarAdminFactory(){
            PulsarAdmin admin =null;
            try {
                admin = PulsarAdmin.builder()
                        .serviceHttpUrl(serviceHttpUrl)
                        .build();
            } catch (PulsarClientException e) {
                e.printStackTrace();
            }
            return  admin;
        }
    }
    
    

    租户(增删改查)

    注:

    • 此操作需要Pulsar集群名字,集群配置见官方文档
    • 本配置为入门级,更多详细配置见此处
       /**
         * 创建租户
         * @throws Exception
         */
        @GetMapping("/persistent/createTenant")
        public void createTenant(String tenantName,String clusterName) throws Exception {
            PulsarAdmin admin = pulsarConf.pulsarAdminFactory();
            if(admin!=null) {
                Tenants tenants = admin.tenants();
                Set set = new HashSet();
                set.add(clusterName);
                TenantInfo build = TenantInfo.builder().allowedClusters(set).build();
                tenants.createTenant(tenantName, build);
            }
        }
        /**
         * 获得现有租户
         * @throws Exception
         */
        @GetMapping("/persistent/tenantList")
        public List<String> tenantList() throws Exception {
            PulsarAdmin admin = pulsarConf.pulsarAdminFactory();
            if(admin!=null) {
                Tenants tenants = admin.tenants();
                return tenants.getTenants();
            }
            return null;
        }
        /**
         * 修改现有租户配置(所属集群等信息)
         * @throws Exception
         */
        @GetMapping("/persistent/updateTenant")
        public void updateTenant(String tenantName,String clusterName) throws Exception {
            PulsarAdmin admin = pulsarConf.pulsarAdminFactory();
            if(admin!=null) {
                Tenants tenants = admin.tenants();
                Set set = new HashSet();
                set.add(clusterName);
                TenantInfo build = TenantInfo.builder().allowedClusters(set).build();
                tenants.updateTenant(tenantName, build);
            }
        }
        /**
         * 删除指定租户
         * @throws Exception
         */
        @GetMapping("/persistent/delTenant")
        public void delTenant(String tenantName) throws Exception {
            PulsarAdmin admin = pulsarConf.pulsarAdminFactory();
            if(admin!=null) {
                Tenants tenants = admin.tenants();
                tenants.deleteTenant(tenantName);
            }
        }
    

    命名空间(增删查)

    改目前没有发现有什么意义,或许是没有需求吧,用到再说,都在官方文档

    注意创建命名空间时入参

    /**
         * 创建命名空间
         * @param namespace 租户名字/命名空间 租户名字必须是已存在的
         * @throws Exception
         */
        @GetMapping("/persistent/createNamespace")
        public void createNamespace(String namespace) throws Exception {
            PulsarAdmin admin = pulsarConf.pulsarAdminFactory();
            if(admin!=null) {
                Namespaces namespaces = admin.namespaces();
                namespaces.createNamespace(namespace);
            }
        }
    
        /**
         * 根据租户获得命名空间
         * @param tenant
         * @return
         * @throws Exception
         */
        @GetMapping("/persistent/namespaceList")
        public List<String> namespaceList(String tenant) throws Exception {
            PulsarAdmin admin = pulsarConf.pulsarAdminFactory();
            if(admin!=null) {
                Namespaces namespaces = admin.namespaces();
                return namespaces.getNamespaces(tenant);
            }
            return null;
        }
    
        /**
         * 删除命名空间
         * @param npname
         * @throws Exception
         */
        @GetMapping("/persistent/delNamespace")
        public void delNamespace(String npname) throws Exception {
            PulsarAdmin admin = pulsarConf.pulsarAdminFactory();
            if(admin!=null) {
                Namespaces namespaces = admin.namespaces();
                namespaces.deleteNamespace(npname);
            }
        }
    
    

    代码下载

    代码见此Persistent包下

    更多AdminApi见此

    1.所写技术都是我工作中用到的
    2.所写技术都是自己从项目中提取的
    3.所有配置搭建流程都经过2到3遍的测试
    4.因都是工作中使用的技术,所以不确定是否有转载的,如果有,请及时通知
  • 相关阅读:
    基于javascript引擎封装实现算术表达式计算工具类
    Windows 服务入门指南
    参数化查询为什么能够防止SQL注入
    Control 的DraggerHelper, 拖动控件从此变得很简单。。。
    书籍推荐记这几年看的书
    使用“using” 的 “Cursor”
    多线程,silverlight_Rest_WCF,dynamic 索引帖
    关于静态事件 static event 的二三事
    探讨 .NET 4 新增的 SortedSet 类
    我们需要莱特希尔报告
  • 原文地址:https://www.cnblogs.com/rb2010/p/15314686.html
Copyright © 2020-2023  润新知