精华内容
下载资源
问答
  • RabbitMQ的七种工作模式-简单模式(一)

    万次阅读 2020-09-25 10:04:31
    在学习RabbitMQ的工作模式之前,必须先了解Exchange的类型,因为工作模式与交换机类型的基本对应的, 1.Direct:直接交换机通过消息上的路由键直接对消息进行分发,相当于精确匹配,一对一 2.Topic:这个交换机会将...

    在学习RabbitMQ的工作模式之前,必须先了解Exchange的类型,因为工作模式与交换机类型的基本对应的,

    1.Direct:直接交换机通过消息上的路由键直接对消息进行分发,相当于精确匹配,一对一

    2.Topic:这个交换机会将路由键和绑定上的模式进行通配符匹配,相当于模糊匹配,一对多

    3.Fanout:一个扇出交换机会将消息发送到所有和它进行绑定的队列上,广播,群发

    4.Headers:消息头交换机使用消息头的属性进行消息路由,相当于模糊匹配(like header%),一对多

    在这里插入图片描述

    再接着学习工作模式,原先是6种,现在是7种,见官网:https://www.rabbitmq.com/getstarted.html,如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如上,总共七种

    1.简单模式(simple)

    2.工作模式(work)

    3.发布/订阅模式(publisher/subscribe):对应Fanout

    4.路由模式(routing):对应Direct

    5.主题模式(topic):对应Topic/Headers

    6.RPC

    7.发布确认模式(publisher confirms)

    1.简单模式

    简单模式:一个生产者,一个消费者,不涉及Exchange
    在这里插入图片描述
    根据官网给出的样例:
    pom.xml:

    <dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>amqp-client</artifactId>
      <version>5.9.0</version>
    </dependency>
    

    消息生产者:

    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    import java.nio.charset.StandardCharsets;
    
    /**
     * @author Becolette
     * @description 消息产生者
     * @datetime 2020/9/24 13:53
     */
    public class Send {
    
        /** 定义了一个Queue */
        private final static String QUEUE_NAME = "hello";
    
        public static void main(String[] argv) throws Exception {
            ConnectionFactory factory = new ConnectionFactory();
            /**
             * 此处是采用了默认的配置,可以ctrl + F3进入ConnectionFactory配置连接参数查看
             * 下列的factory.setHost("localhost")相当于
             *         factory.setHost("localhost")
             *         factory.setPort(5672)
             *         factory.setUsername("guest")
             *         factory.setPassword("guest")
             *         factory.setVirtualHost("/")
             */
            factory.setHost("localhost");
    
            /** 创建通道channel */
            try (Connection connection = factory.newConnection();
                 Channel channel = connection.createChannel()) {
    
                /**
                 * @param queue the name of the queue
                 *              用于存储消息的队列
                 * @param durable true if we are declaring a durable queue (the queue will survive a server restart)
                 *                是否持久化,true则服务器启动一直存在
                 * @param exclusive true if we are declaring an exclusive queue (restricted to this connection)
                 *                  是否排外,true则一个channel只能用于一个消费者消费
                 * @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use)
                 *                   是否自动删除,true表示消费完自动删除
                 * @param arguments other properties (construction arguments) for the queue
                 *                  其他属性
                 */
                channel.queueDeclare(QUEUE_NAME, false, false, false, null);
                String message = "Hello World!";
                /**
                 * @param exchange the exchange to publish the message to
                 *                 交换机,发布消息
                 * @param routingKey the routing key
                 *                   路由键,也就是绑定的queue队列
                 * @param props other properties for the message - routing headers etc
                 *              其他参数,例如:路由头
                 * @param body the message body
                 *             消息实体
                 */
                channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
                System.out.println(" [x] Sent '" + message + "'");
            }
        }
    
    }
    

    消息消费者:

    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.DeliverCallback;
    
    /**
     * @author Becolette
     * @description 消息消费者
     * @datetime 2020/9/24 13:50
     */
    public class Recv {
    
        private final static String QUEUE_NAME = "hello";
    
        public static void main(String[] argv) throws Exception {
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("localhost");
    
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
    
            /** 创建通道开始可以接收消息了 */
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
    
            /**
             * DeliverCallback ==> while(true)
             */
            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println(" [x] Received '" + message + "'");
            };
            /**
             * @param queue the name of the queue
             *              队列名称,也即RouteKey
             * @param autoAck true if the server should consider messages
             * acknowledged once delivered; 
             * false if the server should expect explicit acknowledgements
             *                消息消费后是否自动反馈
             * @param deliverCallback callback when a message is delivered
             *                        消息获取到就反馈
             * @param cancelCallback callback when the consumer is cancelled
             *                       当消费者退出就退出
             */
            channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
        }
    
    }
    
    展开全文
  • 刘伟主编的设计模式中各个模式框架的源代码
  • 请用Java面向对象语言,利用简单工厂模式,实现简易计算器程序(加减乘除功能)。 在注释中回答以下问题: 1、 软件设计目标分别是什么? 2、 在相应的代码处解释设计目标实现的方式。
  • VMware更新到12.0版本了,有了个简易安装操作系统,不太方便,有许多需要的开发包和环境包没有配置。 如何做到按自己的需要安装Linux。 1、主要是在这里选择"稍后" 2、点击到CD/DVD调到----选择iso映像文件---...

    VMware更新到12.0版本了,有了个简易安装操作系统,不太方便,有许多需要的开发包和环境包没有配置。

    如何做到按自己的需要安装Linux。


    1、在新建虚拟机向导 选择 “稍后安装操作系统”


    2、点击到CD/DVD调到----选择iso映像文件---打开虚拟机



    展开全文
  • 串的简单模式匹配和KMP算法

    千次阅读 2017-08-31 14:24:56
    串的简单模式匹配和KMP算法  所谓串就是指字符串,在计算机中是一种很常见并且很重要的数据结构,我们平时所处理的文档实际上就是字符串。而对字符串的操作中比较常见的一种就是对一个串中某子串进行定位也就是...

                                                          串的简单模式匹配和KMP算法                 

    所谓串就是指字符串,在计算机中是一种很常见并且很重要的数据结构,我们平时所处理的文档实际上就是字符串。而对字符串的操作中比较常见的一种就是对一个串中某子串进行定位也就是模式匹配。

    其中待定位的子串称为模式串,简单模式匹配算法的思想是:从主串的第一个位置和模式串的第一个字符开始比较,如果相等,则继续逐一比较后续字符;否则从主串的第二个字符开始,再重新用上一步的方法与模式串中的字符作比较,以此类推,直到比较完模式串中的所有字符。若匹配成功则返回模式串在主串中的位置,若匹配不成功,则返回一个可区别于主串所有位置的标记,如”0”

    算法实现代码:                                            

    Ps:这里串中的字符存储位置是1~length

    int index(Str ste,Str substr){

       int i=1,j=1,k=i;

    while(i<=str.lenght;&&j<=substr.length){

          if(str.ch[i]==substr.ch[j]){

             i++;

             j++;

            }else{

              j=1;

              i=++k;//匹配失败,i从主串的下一个位置开始

            }

    }

           if(j>substr.length)

               return k;

           else

              return 0;

    }

    简单匹配算法思想很简单,但是时间复杂度比较大,并不是一种理想的算法,比如在一种极端情况下,0000……01,然后模式串是00001,这样的话最坏的时间复杂度是O(m*n)n,m分别为主串和模式串的长度。

    KMP算法可以在O(n+m)的时间数量级上完成串的匹配工作,其改进在于:每当一趟匹配过程中出现字符不等时不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右滑动尽可能远的一段距离。

    这里我们通常定义一个next[j]数组,j1~mm为模式串长度,表示模式串中第j个字符发生不匹配的时候,应从next[j]处的字符开始重新与主串比较。

    例如一个模式串:ABABABB,当在第四个位置出现不匹配的时候,说明主串前面三个字符是ABA而模式串的前两个字符是AB所以这个时候,就可以从第三个位置开始比较,这里有两种特殊情况:

    1、  模式串中的第一个字符与主串i位置不匹配,应从下一个位置和模式串第一个字符继续比较

    2、  当模式串中从第一个字符到不匹配的字符的前一个字符如果不存在前后重合的部分时则从主串中发生不匹配的字符和模式串第一字符开始比较。              

    ABABABBnext数组如下

    模式串        

    A        

    B        

    A        

    B       

    A     

    B       

    B      

    j

    1

    2

    3

    4

    5

    6

    7

    next[j]

    0

    1

    1

    2

    3

    4

    5

     下面是求next数组的算法:

         void getNext(Strsubstr,int next[]){              

          int  i=1,j=0;

          next[i]=0;

         while(i<substr.length){

             if(j==0||substr.ch[i]==substr.ch[j]){

               i++;

               j++;

              }else{

               j=next[j];

              }

          }

    }

    下面是KMP算法:

     int KMP(Str str,Strsubstr,int next[]){

          int  i=,j=1;

         while(i<=str.length&&j<=substr.length){

             if(j==0||str.ch[i]==substr.ch[j]){

                 i++;

                 j++;

                 }else{

                    j=next[j];

            }

           If(j>substr.length)

                return i-substr.length;

           else

                return 0;

    }

     

    KMP算法优点:

    1、  最坏的时间复杂度为O(m+n)

    2、  无需回溯访问待匹配字符串S,所以对处理从外设输入的庞大文件很有效,可以边读入,边匹配。

     

      

     

    展开全文
  • d3简易 欢迎使用d3-easy :) d3-easy是对数据进行虚拟化的最简单方法。 词云 层次边缘
  • 一般的字符串模式匹配算法是类似下面的逐次匹配,举例说明如下 主串s=ababcabcacbab 从串t=abcac 一般匹配方法如下图所示 代码如下 int index(string s,string t) {  int i=0,j=0;  int l1=s.length();  ...

    一般的字符串模式匹配算法是类似下面的逐次匹配,举例说明如下

    主串s=ababcabcacbab

    从串t=abcac

    一般匹配方法如下图所示

    图片

    代码如下

    int index(string s,string t)
    {
        int i=0,j=0;
        int l1=s.length();
        int l2=t.length();
        while(i<=l1-1&&j<=l2-1)
        {
            if(s[i]==t[j])
            {
                ++i;
                ++j;
            }
            else
            {
                if(j==0)
                {
                    ++i;
                }
                else
                {
                    i=i-j+2;
                    j=0;
                }

            }
            //cout<<"i="<<i<<"j="<<j<<endl;
        }
        if(j>l2-1) return i-l2;
        else return 0;
    }

    这样算下来的时间复杂度是O(l1*l2),因为每次只要中间发生字符串s[i]和t[j]不相等,这种算法会把字符串t的索引置为0,而主串s也是从之前开始匹配的i加一个1,其实我们可以发现,中间有些比较是不必要的,比如从第三趟比较就可以看出主串中第4,5,8个字符串是‘b’,'c','a',(对应模式串中的第2,3,4个字符)。而模式串t中第一个字符是a,所以其实不需要和这几个字符相比较了,只需要将模式向右滑动3个字符即可。这样的匹配过程中,实际上主串i没有回溯,只是模式串的j在变化,就降低了时间复杂度为O(l1+l2),这也就是kmp算法。

    kmp算法每趟比较过程让模式串向后滑动一个合适的位置,这个合适的位置我们可以算出来,一般称这个位置叫next表。

    先写出next表的定义,接下来再解释为什么这样定义

     

    结合这个图来解释

    先说一下,上面两个图中的S0和T0分别代表的是两个穿的长度,真正的字符串都从下标1开始。

    1)当j=1时,也就是说模式串的第一个字符就与当前位置s对应的字符不同,此时主串的下标应该+1,再和模式串第一个字符进行比较;

    2)当两个串匹配到此处时,前j-1个字符都是匹配的,到了第j个字符就不同了,此时需要把字符串t向右移动max{k}个位置。

    这个k应该满足1<k<j并且p1...pk-1=pj-k+1...pj-1.k的值可能有多个,为了不使向右移动丢失可能的匹配,选择最大的一个k,也就是max{k},其最大值为j-1;

    3)除了上面两种情况,发生匹配时,主串指针i不回溯,在最坏情况下,模式串从第1个字符开始与主串第i个字符比较,以便不丢失可能的匹配。

    上面讲解的next函数表的定义,然后下面是求next函数表的代码以及实现kmp算法。篇幅有点长,转到下一篇讲。

     

    展开全文
  • 用 面向对象思想编写简单运算器 1.简单运用 面向对象思想设计,封装、继承、多态,简单工厂设计模式 2.前后台分离,面向对象,业务封装,松耦合,易后期修改和维护
  • JAVA简单工厂模式四则运算计算器
  • (1)、 简单工厂模式使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一...
  • 简单工厂模式&amp;amp;amp;工厂方法模式&amp;amp;amp;抽象工厂模式的区别及优缺点及使用场景简单工厂普通简单工厂多方法简单工厂静态方法简单工厂工厂方法模式抽象工厂模式 工厂模式是java设计模式中比较...
  • 简单工厂模式 1.什么是工厂? 用一个单独的类来做这个类创造实例的过程,这就是工厂。 2.它解决了那些问题? 简单工厂模式解决了对象的创建问题。 3.什么时候去使用简单工厂模式? 用于已知某些条件后,对类的...
  • 单例模式简单工厂模式

    千次阅读 2017-11-11 17:46:28
    1:单例模式使用了简单工厂模式,换言之,单例类具有一个静态工厂方法,该方法返回一个实例,当然,一个抽象产品类同时是子类的工厂; 2:如下图(简单工厂模式架构图):抽象产品是生产具体水果的 3:单例...
  • 简单恢复模式可最大程度地减少事务日志的管理开销,因为不备份事务日志。 如果数据库损坏,则简单SQL Server 恢复模式将面临极大的工作丢失风险。数据只能恢复到已丢失数据的最新备份。 在简单恢复模式下,备份间隔...
  • 主要介绍了jsp 实现的简易mvc模式,结合实例形式简单分析了jsp实现的MVC模式模型、视图、控制器相关配置与使用操作技巧,需要的朋友可以参考下
  • NULL 博文链接:https://michael1990.iteye.com/blog/2111006
  • 这个是用工厂方法模式写的一个简易的计算器,这个代码可重用性高,满足开闭原则。
  • 用工厂方法模式重构简易计算器。界面要求:模仿windows操作系统附件中的计算器样式进行设计,要设计基本的菜单项(快捷键、热键、和分割线等)。功能要求:实现基本计算功能
  • 考虑一个计算器功能,只能实现加法和减法运算。但是,这个计算器支持撤销操作。
  • 设计模式 简单工厂模式 简易计算器代码 设计模式 面向对象 计算器 java
  • SQL Server数据库有三种恢复模式简单恢复模式、完整恢复模式和大容量日志恢复模式:   1.Simple 简单恢复模式, Simple模式的旧称叫”Checkpoint with truncate log“,其实这个名字更形象,在Simple模式下,...
  • 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,...
  • 简单工厂模式是一种创建型模式,又叫做静态工厂方法模式。它的定义为:定义一个用于创建对象的接口,让子类决定实例化那个类。在简单工厂模式中,可以根据参数的不同返回不同类的实例。 类图: 简单工厂模式...
  • 关于简单工厂模式,工厂方法模式,抽象工厂模式的一次总结 模式 定义 简单工厂模式 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。 工厂方法模式 定义一个...
  • SQL Server 2008 支持三种恢复模式,即简单恢复模式、完整恢复模式和大容量日志恢复模式
  • 简单工厂模式 简单例子

    万次阅读 2018-08-29 21:07:42
    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单...
  • 工厂方法模式简单工厂模式、抽象工程模式

    千次阅读 多人点赞 2018-04-07 22:11:06
    工厂设计模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 针对的问题:在面向对象编程中,最...
  • 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单...
  • 简单工厂模式和策略模式的比较

    万次阅读 多人点赞 2018-06-30 20:51:01
    首先来看一下简单工厂模式: 再看一下策略模式: 看完他们的结构图,是不是有种很相似的感觉?唯一不同的就是 简单工厂类 和 Context类。接下来再看一下代码上有什么区别。 简单工厂类和Context类中代码的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,427,558
精华内容 971,023
关键字:

简单模式