Sonar使用方法

###方法1:直接在服务器分析

  • 在项目源代码目录新建sonar-project.properties文件touch sonar-project.properties

  • 编辑此文件vim sonar-project.properties,内容如下:

      # Required metadata
      sonar.projectKey=my:project        #项目的key
      sonar.projectName=My project    #项目显示的名称
      sonar.projectVersion=1.0        #版本

作为一个苦逼码农,我要想想我以后的出路

    程序员,在外行看来是一个很高端的行业,搞IT的,高端人才,天天坐办公室,多爽。可是在我们自己看来,只有自己知道自己的苦。每天不固定的加班不说,还有忍受着客户各种无理苛刻的需求。

    或许是我们自己对技术的热爱,对新技术的狂热追求,他甚至曾经有段时间超越我追求妹子的欲望。我可以为一个bug熬个通宵,我可以为了一个新技术狂啃3天馒头不出门,但是我忍受不了别人对我的努力不赞同。这可能就是最真实的程序猿。

    程序猿不擅长与人交流,因为程序猿最擅长的是和电脑打交道,他们视电脑如媳妇,视代码如孩子,视新技术如新衣服一样的狂热追求。有人说,程序猿是最好的老公人选,他们有着固定的工作,拿着高薪,而且不会乱花钱,接触面很窄,很难出轨,经常会加班,不会约束到另一方。是的,我们确实是这样的状态,但是谁能知道我们心中的狂野吗?我们会骂,这傻逼系统,真垃圾,要我做,绝对比这好一百倍。还有这傻逼客户,怎么会提出这样傻逼的需求呢?

    今天一个同事说要辞职了,问他原因,他说要去自己做生意了,觉得做程序猿没有前途,要去和朋友合伙卖手机。很好的一个想法,反过来我想想自己,除了能写的了一手好代码,又能干些什么?在公司,每天帮着同事解决各种他们解决不了的问题,然后听着他们说你好厉害啊,我觉得心里特别舒服,很有成就感,或者发现某一个问题很操蛋,然后自己熬了一个通宵写出一个工具,然后心满意足的群发一封邮件给各个同事,最好带着慢慢的成就感上床睡觉去了。可是,一走到外面,那情况就正好反过来了,别人都说,你怎么这个都不会。。。

    我的生活很单调,除了公司、吃饭的地方、睡觉的地方就没有了,每个周末之前都在心里说,明天是个好周末,我要出去转转,结果周五或者周六晚上,领导或者现场一个电话来,说这里有问题,帮忙改改,明天要上线客户要看,我就哼哧哼哧的搞到2-3点钟,第二天一觉睡到下午,久而久之,也就习惯了这样的作息时间。以至于现在没了六块腹肌,没了胸肌,没了肱二头肌。啥也没了。

    如果不做程序猿,我能做什么?去珠江路开个修电脑的店?在小区附近开个奶茶店?还是回老家和我爸一起做装潢?我他妈的到底能做什么?

写给亲爱的媳妇还有未来的娃

现在是2014年1月14号晚上6点39。

致我未来的媳妇(现在叫亲爱的媳妇):

    虽然我现在还不知道你到底是谁?到底是哪里人?但是有些话我还是很想跟你说说。

    首先,你可以说你不懂爱情,因为我自己也不太懂,咱可以一起去学习什么是爱情,什么是家庭。我们一起长大,一起慢慢的变老,直到死去。这不是很浪漫很幸福的事情吗。

    其次,咱结婚以后,家里的财政大臣由你来当,我不会理财,也不喜欢去理财,所以这重任只能交给你来做了。我负责挣钱,你负责花钱。在家,你就是我的公主、我的皇上,我是你的取暖器、你的泄气包;在外,我是你的避风港、你的移动指路台、你的保镖。如果以后我们有了孩子,如果是女孩,那我会永远保护你们娘俩,如果是男孩,那我们爷俩永远会保护你。

    最后,也是最重要的一点,我喜欢你能像对你父母兄弟姐妹一样的对待我的父母兄弟姐妹,因为他们是我在这个世界上除了你以外最亲最爱的人了,同样,我也会像对待我自己的父母兄弟姐妹一样对待你的父母兄弟姐妹。也只有这样,我们的小家庭才会永远的幸福美满。

    现在,我想说一句:我会努力的去做一个合格的丈夫,以后我们有了孩子以后,我还会变成一个合格的父亲!

致我未来的娃:

    现在我还不知道你这熊孩子是男孩是女,不过不管你是男还是女,我都会爱你的。

    如果你是男孩,在你没有上学之前,我不会要求你去背什么唐诗宋词,学什么乱七八糟的数学英语什么的,我会给你一个美好的童年。在你上学之后,我也不需要你考试每次都能考到第一第二名的,因为谁也不能保证每次考试都能考好。原则上的事情我会对你很严格的,但是我不会动手K你的,打你只能会让你变得更加叛逆。还有,在你18岁之后,请自己为你自己的路做决定,你老爹我只会给你建议。在你18岁之前,老爸我都是你的避风港,18岁之后,你要负责和我一起保护你老妈,一直到我老了,你就要保护我和你老妈了。

    如果你是女孩,我会一直一直把你当成我的小公主,我会给你买最漂亮的衣服,吃最好的,用最好的。考试成绩神马的,老爸都不会要求你的,只需要你给我平平安安的。还有18岁之前不要谈恋爱,18岁之后谈恋爱了,必须要把那家伙给我带回来看看,老爸要是不同意看不上,你就赶紧的让他拜拜。我对你的他的要求就是:能够保护你,要对你百分之一百的好。我在想,在你出嫁的那天,我一定会哭的,因为有个男人把你从我身边抢走了。

结束

    好了,写到这里了,连媳妇都没有的人,在这胡思乱想。唉,洗洗睡吧。

PS:

  1. 媳妇已经出现了,马上就要一起步入爱情的坟墓了!
  2. 努力造娃ing

关于maven的几个常用插件

最近整理了自己写的一个项目,使用maven+svn管理,idea开发,搭建了一个maven的私服.原来是凌乱不堪,所以费了好大劲才整理好,而且平时公司项目上事情多的一米…

下面说说使用的几个插件(至于那些dependency就让它们见鬼去吧)

不说废话了,代码贴上

  1. clean插件

     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-clean-plugin</artifactId>
         <version>2.5</version>
         <configuration>
             <filesets>
                 <fileset>
                     <directory>F:/logs</directory>
                 </fileset>
                 <fileset>
                     <directory>../message-test</directory>
                     <includes>
                         <include>spy.log</include>
                     </includes>
                 </fileset>
                 <fileset>
                     <directory>../message-test/target</directory>
                 </fileset>
             </filesets>
         </configuration>
     </plugin>

    这个插件没啥好说的,要是不需要删除别的地方代码,就用默认的,不用任何配置

  2. 单元测试插件

     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <version>2.16</version>
         <configuration>
             <skip>true</skip>
         </configuration>
     </plugin>

    单元测试没做好,一测就报错,干脆给skip了

  3. resources

     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
         <version>2.6</version>
         <executions>
             <execution>
                 <id>copy-resources</id>
                 <!-- here the phase you need -->
                 <phase>validate</phase>
                 <goals>
                     <goal>copy-resources</goal>
                 </goals>
                 <configuration>
                     <outputDirectory>${basedir}/target/test-classes</outputDirectory>
                     <resources>
                         <resource>
                             <directory>${basedir}/src/main/webapp/WEB-INF/config</directory>
                             <filtering>true</filtering>
                         </resource>
                     </resources>
                 </configuration>
             </execution>
         </executions>
     </plugin>

    用来复制一些资源文件,配置都是直译的

  4. war

     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-war-plugin</artifactId>
         <version>2.4</version>
         <configuration>
             <warName>${message.war.name}</warName>
             <includeEmptyDirectories>true</includeEmptyDirectories>
             <webResources>
                 <resource>
                     <directory>../message-easyjs</directory>
                     <targetPath>js</targetPath>
                     <excludes>
                         <exclude>**/.svn</exclude>
                         <exclude>**/*.iml</exclude>
                         <exclude>**/pom.xml</exclude>
                     </excludes>
                 </resource>
             </webResources>
         </configuration>
     </plugin>

    打war包的插件

  5. jetty

     <plugin>
         <groupId>org.mortbay.jetty</groupId>
         <artifactId>maven-jetty-plugin</artifactId>
         <version>6.1.10</version>
         <configuration>
             <!-- 配置扫描时间 -->
             <scanIntervalSeconds>10</scanIntervalSeconds>
             <!-- 配置项目在容器中的根路径 -->
             <contextPath>${project.contextPath}</contextPath>
             <!-- 配置jetty容器中的jndi -->
             <jettyEnvXml>src/main/resources/jetty.xml</jettyEnvXml>
             <connectors>
                 <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                     <!-- 端口 -->
                     <port>${project.port}</port>
                     <maxIdleTime>60000</maxIdleTime>
                 </connector>
             </connectors>
             <!-- 按照官网上说的是配置停止容器的快捷键和端口,至今不知怎么在idea中如何使用,有知道的麻烦告知下,3Q -->
             <stopKey>foo</stopKey>
             <stopPort>8888</stopPort>
         </configuration>
         <executions>
             <!-- 配置在maven哪个生命周期执行插件的哪个动作 -->
             <execution>
                 <id>jetty_run</id>
                 <!-- maven生命周期 -->
                 <phase>compile</phase>
                 <!-- 执行插件的哪个动作 -->
                 <goals><goal>run</goal></goals>
             </execution>
         </executions>
         <dependencies>
             <!-- 这个插件依赖的几个包 -->
             <dependency>
                 <groupId>org.eclipse.jetty</groupId>
                 <artifactId>jetty-io</artifactId>
                 <version>7.6.6.v20120903</version>
             </dependency>
             <dependency>
                 <groupId>org.eclipse.jetty</groupId>
                 <artifactId>jetty-server</artifactId>
                 <version>7.6.6.v20120903</version>
             </dependency>
         </dependencies>
     </plugin>

    jetty这个插件当时可是整的我头疼,各种报错各种上网找资料,附上jetty的配置文件:jetty.xml

     <?xml version="1.0"?>
     <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
     <Configure class="org.mortbay.jetty.webapp.WebAppContext">
         <New id="mysql" class="org.mortbay.jetty.plus.naming.Resource">
             <Arg>jdbc/core</Arg>
             <Arg>
                 <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
                     <Set name="Url">jdbc:mysql://localhost:3306/message</Set>
                     <Set name="User">root</Set>
                     <Set name="Password">123456</Set>
                 </New>
             </Arg>
         </New>
     </Configure>
  6. cargo(可以启动tomcat,远程部署,本地部署,都支持的,这里我只用到本地部署,远程部署需要配置tomcat-user.xml和tomcat的控制台)

     <plugin>
         <groupId>org.codehaus.cargo</groupId>
         <artifactId>cargo-maven2-plugin</artifactId>
         <version>1.4.3</version>
         <configuration>
             <container>
                 <!-- tomcat的版本,tomcat6使用tomcat6x -->
                 <containerId>${cargo.tomcat.version}</containerId>
                 <!-- tomcat在本地的绝对路径 -->
                 <home>${tomcat.home}</home>
                 <!-- 本地安装就用installed,远程使用remote -->
                 <type>installed</type>
    
                 <!-- tomcat日志文件路径 -->
                 <output>${tomcat.home}/logs/container.log</output>
                 <append>false</append>
                 <log>${tomcat.home}/logs/cargo.log</log>
             </container>
             <configuration>
                 <!-- 本地部署,已存在 -->
                 <type>existing</type>
                 <!-- 再配置一次tomcat绝对路径 -->
                 <home>${tomcat.home}</home>
                 <properties>
                     <!-- 端口 -->
                     <cargo.servlet.port>${project.port}</cargo.servlet.port>
                 </properties>
             </configuration>
             <!-- 这里一次可以部署多个项目 -->
             <deployables>
                 <!-- 指定我部署的项目GAV -->
                 <deployable>
                     <groupId>com.message</groupId>
                     <artifactId>message-test</artifactId>
                     <!-- war包形式部署 -->
                     <type>war</type>
                     <properties>
                         <!-- 容器中的上下文根 -->
                         <context>${project.contextPath}</context>
                     </properties>
                 </deployable>
             </deployables>
         </configuration>
         <!-- 同jetty -->
         <executions>
             <execution>
                 <id>tomcat-run</id>
                 <phase>package</phase>
                 <goals><goal>run</goal></goals>
             </execution>
         </executions>
     </plugin>
    • tomcat使用cargo这个插件有个缺点,不能debug了,而且不是热部署,不知道cargo有没有热部署的功能,暂时我还没找到,待研究
    • jetty那个是可以热部署的,不管改Java类还是jsp或者css,js都可以(加减方法,改参数不行)
  7. 附上maven的properties

     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <junit.version>4.10</junit.version>
         <spring.version>3.0.5.RELEASE</spring.version>
         <jdk.version>jdk15</jdk.version>
         <tomcat.version>6.0.32</tomcat.version>
         <message.war.name>message</message.war.name>
         <project.port>8099</project.port>
         <project.contextPath>/core</project.contextPath>
         <tomcat.home>F:\study\apache-tomcat-6.0.32</tomcat.home>
         <cargo.tomcat.version>tomcat6x</cargo.tomcat.version>
     </properties>   

关于p6spy的介绍

最近公司项目里需要使用到将所有执行的sql打出日志,放在一个文件下。公司一大神级人物给解决了,刚刚花了点时间给研究了一下。

他用的就是p6spy,其实也没做多少工作。主要的工作p6spy都已经做过了。

p6spy我的理解就是:p6spy将应用的数据源给劫持了,应用操作数据库其实在调用p6spy的数据源,p6spy劫持到需要执行的sql或者hql之类的语句之后,他自己去调用一个realDatasource,再去操作数据库,只要劫持到那些sql之后,能干的事情就很多了。

p6spy 可以输出日志到文件中、控制台、或者传递给 Log4j,而且还能配搭 SQL Profiler 或 IronTrackSQL 图形化监控 SQL 语句,监测到哪些语句的执行是耗时的,逐个优化。关于与 SQL Profiler 或 IronTrackSQL 的配合使用可参数文件的链接。

p6spy在sourceforge上下载:[p6spy][]
[p6spy]: http://sourceforge.net/projects/p6spy/?source=dlp

p6spy的配置:

  1. p6spy.jar放入应用的classpath下

  2. 修改连接池或者连接配置的jdbc的驱动为p6spy所提供的驱动,com.p6spy.engine.spy.P6SpyDriver

    在单独的Hibernate的应用中,数据库驱动配置在hibernate.cfg.xml里面,所以我需要配置文件中的connection.driver_class属性从oracle.jdbc.driver.OracleDriver改为com.p6spy.engine.spy.P6SpyDriver其他的用户名密码等等配置信息全部不用修改.在web程序中,配置的连接池部分,也只需要修改jdbc-driver的配置即可。

    Hibernate.cfg.xml:

     <session-factory>
         <!-- 在这里改成p6spy提供的数据源 -->
         <property name="connection.driver_class">com.p6spy.engine.spy.P6SpyDriver</property>       
         <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
         <property name="connection.username">scott</property>
         <property name="connection.password">tiger</property>
         <property name="connection.pool_size">1</property>
         <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
         <property name="current_session_context_class">thread</property>
         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
         <property name="show_sql">true</property>
         <property name="hbm2ddl.auto">false</property>
         <property name="hibernate.jdbc.batch_size">0</property>
     </session-factory>
  3. 修改 spy.properties 并将其放到classpath下:

     #################################################################
     # MODULES                                                       #
     #                                                               #
     # Modules provide the P6Spy functionality.  If a module, such   #
     # as module_log is commented out, that functionality will not   #
     # be available.  If it is not commented out (if it is active),  #
     # the functionality will be active.                             #
     #                                                               #
     # Values set in Modules cannot be reloaded using the            #
     # reloadproperties variable.  Once they are loaded, they remain #
     # in memory until the application is restarted.                 #
     #                                                               #
     #################################################################
     #第一:module.log的属性必须配置,如果不配置,P6SPY将不起任何作用,典型配置:
     module.log=com.p6spy.engine.logging.P6LogFactory
     #module.outage=com.p6spy.engine.outage.P6OutageFactory
    
     #################################################################
     # REALDRIVER(s)                                                 #
     #                                                               #
     # In your application server configuration file you replace the #
     # "real driver" name with com.p6spy.engine.P6SpyDriver. This is #
     # where you put the name of your real driver P6Spy can find and #
     # register your real driver to do the database work.            #
     #                                                               #
     # If your application uses several drivers specify them in      #
     # realdriver2, realdriver3.  See the documentation for more     #
     # details.                                                      #
     #                                                               #
     # Values set in REALDRIVER(s) cannot be reloaded using the      #
     # reloadproperties variable.  Once they are loaded, they remain #
     # in memory until the application is restarted.                 #
     #                                                               #
     #################################################################
    
     #第二:数据库驱动配置,你懂的,不多说了
     # oracle driver
     # realdriver=oracle.jdbc.driver.OracleDriver
    
     # mysql Connector/J driver
     # realdriver=com.mysql.jdbc.Driver
    
     # informix driver
     # realdriver=com.informix.jdbc.IfxDriver
    
     # ibm db2 driver
     # realdriver=COM.ibm.db2.jdbc.net.DB2Driver
    
     # the mysql open source driver
     realdriver=org.gjt.mm.mysql.Driver
    
     #specifies another driver to use
     realdriver2=
     #specifies a third driver to use
     realdriver3=
    
     #第三:appender配置,一般分为三种
     #specifies the appender to use for logging
     #appender=com.p6spy.engine.logging.appender.Log4jLogger
     #控制台
     #appender=com.p6spy.engine.logging.appender.StdoutLogger
     appender=com.p6spy.engine.logging.appender.FileLogger
    
     # name of logfile to use, note Windows users should make sure to use forward slashes in their pathname (e:/test/spy.log) (used for file logger only)
     #日志文件存放路径及文件名
     logfile     = spy.log
    
     # append to  the p6spy log file.  if this is set to false the
     # log file is truncated every time.  (file logger only)
     append=true
    
     #The following are for log4j logging only
     log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
     log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
     log4j.appender.STDOUT.layout.ConversionPattern=p6spy - %m%n
    
     log4j.logger.p6spy=INFO,STDOUT

使用history.back(-1)的问题

今天在调一个项目现场的问题,觉得有点记录下来的意义。

首先看看重现问题的步骤:

  1. 选择一个事物分类进行查询,搜到一条记录,然后进入申请页面。

  2. 进入申请页面之后点返回,页面立即没有了(只在IE下会出现问题)而且页面上显示的是webpage has expired!页面已经过期。

    ps:返回按钮触发的事件是:window.history.back(-1);

  3. 解决办法:

    页面过期,我在想了是不是页面上的meta设置no-cache了,即:

     <meta http-equiv="Pragma" content="no-cache"/>

    然后我立即查看页面源代码,发现木有这个东西。我就纳闷了,那是怎么了呢。

    后来一想是不是我查询的时候提交了一个表单,这时候已经跳到我查询的目标页面(虽然还是同一个jsp页面),这时候用history.back(-1)已经找不到参数了,所以会报页面找不到的问题。

    然后想到form表单里面的method=”post”和method=”get”的区别(具体的网上搜索去吧)。

    so, 我把搜索的form中method改成get。

然后就OK了,问题解决了。

个人简历

联系方式

  • 手机:18014480006
  • Email:sunhao0550@163.com/sunhao.java@gmail.com
  • 微信:同手机号

个人信息


工作经历

南京叶子科技有限公司

职位、在职时间

架构师、2018-08~至今

工作内容

南京叶子科技有限公司,是OPPO公司的全资子公司,负责oppo销售领域的数字化构建工作。

  1. 带领团队完成公司PaaS层的构建(控制台、流程中心、网关中心、任务调度中心、集成中心)
  2. 协助运维完成公司devops流程的构建
  3. 构建公司底层工具类组件(公司内部广泛使用)
  4. 公司使用的技术选型
  5. 疑难问题解答、协助
  6. 负责一些简单的大数据相关(入门,刚接触)
  7. 深度参与OPPO数字化转型计划(凤凰计划,又叫phoenix计划)
    • 项目一:API集市(A+类)
      • 项目背景:通过API集市将OPPO上千的内部系统进行整合,分析调用关系、调用合理性以及接口质量
      • 参与角色:系统架构师
      • 项目成果:
        • 入驻1400+系统,共计近万接口
        • 全球化部署(中国、巴黎、新加坡、印度)
        • 其中,中国区完成异地双机房部署,可做到分钟级容灾切换(内部基础平台原因,无法做到更细粒度切换),也可支持蓝绿部署
        • 基本完成全年99.99%的可用性目标,无重大事故发生
        • 单日流量峰值2亿+次,TPS峰值5000+
        • 主导整个系统降本计划,为公司节省80万+/年
      • 技术栈:Java、Lua、Spring全家桶、APISIX、Docker、K8S
    • 项目二:任务调度中心(A类)
      • 项目背景:通过统一的调度平台来统一管控公司内部系统的定时任务,基于Quatz完全自研
      • 参与角色:产品、架构师、主程
      • 项目成果:
        • 支撑800+系统的6000+任务,总调度超3.5亿次
        • 任务类型:HTTP任务、自研协议任务、DUBBO任务
        • 支持分片和广播
        • 支持多Quartz集群,以降低任务之间的相互影响

离职原因

公司组织调整,base变更成深圳

中兴软创科技股份有限公司

职位、在职时间

架构师、2015-04~2018-08

工作内容

中兴软创 政企部门 智慧城市 底层架构开发 (中间有段时间离职去创业的,时间:2015-08~2016-01)

离职原因

第一次离职时因为和朋友一起出去创业

南京橘子星球网络科技有限公司

职位、在职时间

架构师、2015-08~2016-01

工作内容

负责公司技术上的架构,技术选型,技术培训等

离职原因

公司融资失败,趋于破产

联创车盟汽车服务有限公司

职位、在职时间

高级java开发工程师、2014-07~2015-04

工作内容

联创车盟(AA China)2004年7月成立于北京,隶属于联创科技集团,是国内处于领先地位的全国汽车服务网络提供商。
主要负责开发慧驾平台的结算系统,以及产品技术支撑。合作完成系统架构,研究新技术

离职原因

公司欠薪,领导鼓励离职

江苏金智教育信息技术有限公司

职位、在职时间

高级java开发工程师、2011-07~2014-07

工作内容

主要做同一通信平台和关于工作流方面的项目,面向全国本专科学校
自定义表单的协助开发
以及内容管理系统(CMS)的开发,主要负责内容模型的开发。2011.7-2012.7 实习一年,并且获得优秀实习生。

离职原因

寻求新的发展、突破自我


开源项目和技术文章

开源项目


自我描述

以下均为我熟练使用的技能

  • 熟练使用Spring/Spring-Boot/Spring-Cloud等主流开源框架,也略读过一些源码。
  • 有过微服务拆分、优化经验。完整参与设计、建设OPPO体系使用的开发者平台、网关、BaaS服务(任务调度、邮件推送、消息通知等等)等
  • 熟练使用Linux服务器,熟练使用一些Linux常用命令,对项目部署有一定经验 。
  • 熟悉Docker/K8S,有过搭建CICD流程、规范的经验。
  • 对持续集成有过研究,搭建过jenkins+maven+gitlab一套开发工具
  • 熟练使用MySQL数据库.有过SQL优化的经验。
  • 对redis、memcached、mongodb等也有过研究
  • 熟练使用maven、gradle等构建工具
  • 了解并研究过一些其他语言,如:javascript、python、groovy、php、nodejs、scala等
  • 了解并熟悉整个互联网开发体系及架构,如分布式服务调度框架dubbo,消息队列rabbitmq等等
  • 有着较强的团队合作能力、较强的自学能力,对新的知识充满渴望

END

感谢您花时间阅读我的简历,期待能有机会和您共事。