点读系列《jmeter官方用户手册》
官网:http://jmeter.apache.org/usermanual/
说明:十八元件、十九属性、二十函数,涉及清单内容暂未仔细阅读,个人觉得一是仅供使用参考,二是适合单独写文章来解读
一、让我们开始吧
- 千万不要在GUI模式下来做负载测试,要用CLI模式 
- jmeter不带jdbc驱动程序,如果使用jdbc,就需要去网上下载,然后添加到classpath 
- jmeter是100%的java应用程序 
- 在jmeter的classpath中添加加密包,更新system.properties来注册ssl支持 
- jmeter http默认协议级别为TLS,可以编辑修改:jmeter.properties或user.properties的https.default.protocol 
- jmeter安装目录(XY是版本号) - apache-jmeter-X.Y # 可以修改根目录,不能修改子目录 apache-jmeter-X.Y/bin apache-jmeter-X.Y/docs apache-jmeter-X.Y/extras apache-jmeter-X.Y/lib/ apache-jmeter-X.Y/lib/ext apache-jmeter-X.Y/lib/junit apache-jmeter-X.Y/licenses apache-jmeter-X.Y/printable_docs
- bin目录  
- 可以在bin目录下创建setenv.bat来配置jvm - rem This is the content of bin\setenv.bat, rem it will be called by bin\jmeter.bat set JVM_ARGS="-Xms1024m -Xmx1024m -Dpropname=value"
- 可以配置环境变量  
- 可以在启动jmeter直接指定环境变量 - JVM_ARGS="-Xms1024m -Xmx1024m" jmeter -t test.jmx [etc.]
- jmeter的类路径 - JMETER_HOME/lib (jmeter.properties的user.classpath可以设置) - used for utility jars - JMETER_HOME/lib/ext (jmeter.properties的search_paths可以设置) - used for JMeter components and plugins 
- jmeter只能找到.jar而不是.zip 
- 执行java -jar时,设置的java环境变量classpath是不会起作用的,-jar就是牛 
- 代理 - jmeter -E https -H my.proxy.server -P 8000 -u username -a password -N localhost 
- HTTP Request Defaults和HTTP Request元件可以设置代理 
- CLI模式 - jmeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000 
- 服务器模式 - jmeter-server -H my.proxy.server -P 8000 - server.exitaftertest = true可以设置在单个测试后退出服务器 - CLI模式运行 - jmeter -n -t testplan.jmx -r [-Gprop = val] [-Gglobal.properties] [-X] 
- jmeter命令行设置properties - jmeter -Duser.dir=/home/mstover/jmeter_stuff \ -Jremote_hosts=127.0.0.1 -Ljmeter.engine=DEBUG - jmeter -Ljmeter.engine = DEBUG jmeter -Lorg.apache.jmeter.engine = DEBUG jmeter -Lcom.example.foo = DEBUG jmeter -LDEBUG 
- log4j2.xml位于bin目录下 
- 要将org.apache.http的日志级别调到debug,加上 - <记录仪> <! - SNIP - > <Logger name =“org.apache.http”level =“debug”/> <! - SNIP - > </记录器>
- 命令行和属性文件的处理顺序 - -p propfile
- jmeter.properties (or the file from the -p option) is then loaded
- -j logfile
- Logging is initialised
- user.properties is loaded
- system.properties is loaded
- all other command-line options are processed
 
- 使用模板创建测试计划  

二、创建测试计划
- 完整的测试计划包括:one or more Thread Groups, logic controllers, sample generating controllers, listeners, timers, assertions, and configuration elements 
- "merge" "Save Selection As …" 右键选择这些选项,可以只加载/保存部分元件,而不用整个测试计划 
- 再次强调!只能在调试测试计划时使用GUI模式,实际测试要使用CLI模式 
- stop和shutdown的区别。 - stop:立即停止所有正在运行的线程 shutdown:等待当前正在运行线程结束后,停止所有线程
- CLI模式,就使用bin目录下的stoptest[.cmd|.sh] or shutdown[.cmd|.sh] 
- jmeter.log记录了日志 
三、测试计划的元件
- 最小的测试包括测试计划、线程组、采样器 
- Functional Test Mode,意思是说,在listener选择了保存文件的情况下,勾选上这个复选框,就会把返回数据保存到文件中去  
- 可以在listener中点击Configure来选择保存的字段  
- 所有控制器和采样器必须位于线程组下,而listener可以放在测试计划下,作用于所有线程组 
- 线程组可以设置3项:the number of threads, the ramp-up period,the number of times to execute the test 
- 线程组的Scheduler可以配置Startup Delay (seconds)和Duration (seconds) 
- 采样器就是用来发请求的 
- HTTP Cookie Manager应该添加到所有的web测试中,否则jmeter将会忽略cookie 
- 加载搜索,搜索“A”,加载搜索,搜索“B”,可以用Interleave Controller来实现  
- HTTP Request Defaults可以在多个http请求中共享同样的请求信息  - HTTP采样器中需要共享的就留空 
- 所有的listener都保存相同的数据,只是展示的不同而已 
- timers = time.sleep() 
- 断言是适用于范围内的,如果要断言单个sampler,则需要添加为sampler的子级 
- 执行顺序  
- 有sampler才会执行Pre-Processors Timers Post-Processors Assertions 
- 执行顺序示例  
- 严格分层的元件:Listeners, Config Elements, Post-Processors, Pre-Processors, Assertions, Timers - 有序的元件:controllers, samplers 
- Assertions Timers分层示例  - 更复杂的 

- 变量和属性都区分大小写 
- 如果线程更新变量,则仅更改变量的线程副本 
- 使用属性来定义变量的值  
四、创建测试计划-Web
- 使用测试计划的第一步就是,创建线程组
- Ramp-Up Period是指启动用户的总耗时,eg1:设置为0则立即启动所有用户,eg2:5个用户设置为5s则每1s启动1个用户
- HTTP Request Defaults不会发请求,只是设置默认值
- 如果有cookie,添加HTTP Cookie Manager就完事
- 测试计划的图标 线程组的图标 线程组的图标 
五、创建测试计划-高级Web
- 在不能确定浏览器是否支持Cookie的情况下,采用url重写来传session id 
- jmeter可以用HTTP URL Re-writing Modifier来支持  

 这样就会把session id添加到每个请求中。
 Path Extension:session id作为path一部分,用;分隔
 Cache Session Id?:保存最后找到的session id,如果前一个http请求没有session id,那么就用缓存这个
- HTTP Header Manager和HTTP Cookie Manager一般都添加在线程组级别,也就是在线程组右键添加
六、创建测试计划-数据库
- 数据库驱动程序需要放到 ./lib 目录,如mysql-connector-java-XXX-bin.jar 
- JDBC Connection Configuration配置了数据库连接,JDBC Request是sql请求,二者通过Variable name bound to pool来绑定关联  

七、创建测试计划-FTP
- FTP Request Defaults也是用来设置默认值的 
- 示例  



八、创建测试计划-LDAP、扩展LDAP
- LDAP(Light Directory Access Portocol)轻量级目录访问协议 
- 4个LDAP请求示例:http://jmeter.apache.org/usermanual/build-ldap-test-plan.html  
- 9个LDAP请求示例,http://jmeter.apache.org/usermanual/build-ldapext-test-plan.html 

九、创建测试计划-Webservice
- File → Templates…选择Building a SOAP Webservice Test Plan,按模板创建
- 添加路径,修改HTTP Header Manager
- http://jmeter.apache.org/usermanual/build-ws-test-plan.html
十、创建测试计划-JMS点对点
- 把jar放入JMeter的lib目录后,需要重启JMeter 
- Add → Listener → Graph Results  
- http://jmeter.apache.org/usermanual/build-jms-point-to-point-test-plan.html 
十一、创建测试计划-JMS主题
- JMeter会自动保存在控制面板所做的更改
- http://jmeter.apache.org/usermanual/build-jms-topic-test-plan.html
十二、监听器
- 输出类型有树、表、图形、日志文件 
- csv文件比xml文件小得多,如果要生成大量数据,请使用csv 
- 相对路径是相对于当前工作目录,默认为bin/目录 
- 如果路径以“~/”开头(或jmeter.save.saveservice.base_prefix JMeter属性中的任何名称),则是相对于当前测试计划(jmx文件)所在目录的路径 
- 如果仅希望记录某些样本,则将监听器添加为采样器的子节点。或者,可以使用“简单控制器”对一组采样器进行分组,然后向其添加“监听器”。多个采样器可以使用相同的文件名-但请确保它们都使用相同的配置! 
- jmeter.properties(或user.properties)可以配置默认保存项 
- jmeter.save.saveservice.output_format若设置为csv,那么default_delimiter要设置为逗号"," 
- 配置说明 - #------------------------------------------------- -------------------------- #结果文件配置 #------------------- -------------------------------------------------- ------ #本部分有助于确定如何保存结果数据。 #注释掉的值是默认值。 #合法值:xml,csv,db。当前仅支持xml和csv。 #jmeter.save.saveservice.output_format = csv #应该保存字段时为true;否则为false #assertion_results_failure_message只影响CSV输出 #jmeter.save.saveservice.assertion_results_failure_message =真 # #合法值:无,首先,所有 #jmeter.save.saveservice.assertion_results =无 # #jmeter.save.saveservice.data_type = true #jmeter.save.saveservice.label = true #jmeter.save.saveservice.response_code = true #CSV输出当前不支持response_data #jmeter.save.saveservice.response_data = false #将ResponseData保存为失败的样本 #jmeter.save.saveservice.response_data.on_error = false #jmeter.save.saveservice.response_message = true #jmeter.save.saveservice.successful = true #jmeter.save.saveservice.thread_name = true #jmeter。 save.saveservice.time = true #jmeter.save.saveservice.subresults = true #jmeter.save.saveservice.assertions = true #jmeter.save.saveservice.latency = true #jmeter.save.saveservice.connect_time = true #jmeter.save.saveservice.samplerData = false #jmeter.save.saveservice.responseHeaders = false #jmeter.save.saveservice.requestHeaders = false #jmeter.save.saveservice.encoding = false #jmeter.save.saveservice.bytes = true #jmeter.save.saveservice.sent_bytes = true #jmeter.save.saveservice.url = false #jmeter.save.saveservice.filename = false #jmeter.save.saveservice.hostname = false #jmeter.save.saveservice.thread_counts = true #jmeter.save.saveservice.sample_count = false #jmeter.save.saveservice.idle_time = true #时间戳格式-仅影响CSV输出文件 #合法值:无,ms或适用于SimpleDateFormat的格式 #jmeter.save.saveservice.timestamp_format = ms #jmeter.save.saveservice.timestamp_format = yyyy / MM / dd HH:mm:ss.SSS #用于逗号分隔值(CSV)文件或其他格式 #字段'值由指定的分隔符分隔。 #默认值: #jmeter.save.saveservice.default_delimiter =, #对于TAB,由于JMeter 2.3可使用: #jmeter.save.saveservice.default_delimiter = \ t #仅适用于CSV格式文件: #将字段名称打印为第一行在CSV中 #jmeter.save.saveservice.print_field_names = true #JMeter变量名称的可选列表,其值将保存在结果数据文件中。 #使用逗号分隔名称。例如: #sample_variables = SESSION_ID,REFERENCE #NB当前的实现将XML值保存为属性, #因此名称必须是有效的XML名称。 #JMeter将变量发送到所有服务器 #以确保客户端上可获得正确的数据。 #文件 第2行的可选xml处理指令:#jmeter.save.saveservice.xml_pi = <?xml-stylesheet type =“ text / xsl” href =“ sample.xsl”?> #用于标识文件名的前缀相对于当前基准 #jmeter.save.saveservice.base_prefix =〜/ #用XML或CSV输出编写的每一行上的AutoFlush #设置为true可以减少测试结果数据丢失(如果发生崩溃) #但会影响性能,特别是对于密集测试(低暂停或无暂停) #从JMeter 2.10开始,默认情况下为假 #jmeter.save.saveservice.autoflush = false #将开始时间戳记记入日志,而不是结束 sampleresult .timestamp.start = true #是否使用System.nanoTime()-否则仅使用System.currentTimeMillis() #sampleresult.useNanoTime = true #使用后台线程计算nanoTime偏移量 #将此值设置为≤0 可禁用背景线程 #sampleresult.nanoThreadSleep = 5000
- SimpleDateFormat:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html 
- CLI模式下,-1 可以用于创建顶级监听器,一般用来为每次运行指定不同的数据和日志文件。因为默认是写入jmeter.log文件,所以如果要重命名,需要使用 -j - jmeter -n -t testplan.jmx -l testplan_01.jtl -j testplan_01.log jmeter -n -t testplan.jmx -l testplan_02.jtl -j testplan_02.log
- 为每次测试运行生成唯一的名称:log_file = 'jmeter_'yyyyMMddHHmmss'.tmp' 
- 大多数监听器都会保留它们显示的样本的副本,除了 - Simple Data Writer
- BeanShell/JSR223 Listener
- Mailer Visualizer
- Monitor Results
- Summary Report
 - 这2个使用的内存更少: - Aggregate Report
- Aggregate Graph
 - 如果需要保存大量数据,请使用Simple Data Writer + csv 
- csv,xml,sample attribute配置说明http://jmeter.apache.org/usermanual/listeners.html 
- 可以使用Save_Responses_to_a_file,为每个样本生成一个新文件 
- 为了正确解析无标题的csv文件,必须设置适当的jmeter属性 
- 可以通过Edit → Save Node As Image把监听器保存为PNG文件  
十三、远程测试
- 从单个JMeter客户端控制多个远程JMeter引擎 
- jmeter客户端的实例可以控制任意数量的远程jmeter实例 
- 所有服务器都运行相同的测试计划,这意味着,如果设置了1000个线程,有6台jmeter服务器,那么将运行6000个线程 
- 推荐将一台或多台计算机,与配置为运行jmeter engine的应用服务器,位于同一以太网段上,这将最大程度减少网络对测试结果的影响,而且不会影响应用服务器本身的性能 
- 需确保多台服务器的jmeter和java版本完全相同 
- 启动服务器组件 - JMETER_HOME/bin/jmeter-server (unix) JMETER_HOME/bin/jmeter-server.bat (windows)
- 添加服务器ip - JMETER_HOME/bin/jmeter.properties remote_hosts- 也可以通过-R来指定 - jmeter -Rhost1,127.0.0.1,host2
- 通过新菜单来启动/停止  
- CLI模式启动远程 - jmeter -n -t script.jmx -r # 从remote_hosts读取 jmeter -n -t script.jmx -R server1,server2,… # 指定
- 生成密钥的脚本,默认密码为'changeit' - bin/create-rmi-keystore.bat # windows bin/create-rmi-keystore.sh # unix- 生成rmi_keystore.jks,复制到jmeter/bin目录或在server.rmi.ssl.keystore.file中引用它 
- 默认情况下,jmeter使用标准rmi端口1099 
- 处理启动失败的节点 - client.tries client.retries_delay client.continue_on_fail = true
- java有安全管理器概念,它会在执行潜在危险操作前(如解析主机名,创建或读取文件在OS中执行命令),被JVM询问,可以通过java.security.manager和java.security.policy来启用安全管理器 
十四、Dashboard报表
- dashboard是jmeter的模块化扩展,默认会从csv读取数据,生成html报告 
- 提供的内容见http://jmeter.apache.org/usermanual/generating-dashboard.html 
- 可以在reportgenerator.properties中找到相关属性,要自定义这些属性,需要复制到user.properties文件中并进行修改 
- 所有属性必须以jmeter.reportgenerator开头,图属性必须以jmeter.reportgenerator.graph开头,导出属性必须以jmeter.reportgenerator.exporter开头 
- 过滤机制是正则匹配的 
- 生成报告的方式 - CLI: - # 从现有csv文件生成报告 jmeter -g <log file> -o <Path to output folder> # 测试结束后自动生成 jmeter -n -t <test JMX file> -l <test log file> -e -o <Path to output folder>- GUI: - Tools → Generate HTML report  
- 默认生成目录为${JMETER_HOME}/bin/report-output 
- 报告生成超时设置generate_report_ui.generation_timeout 
十五、实时结果
- 通过实现AbstractBackendListenerClient类,把实时结果发给后端
- 线程指标、响应时间指标
- 使用InfluxDBBackendListenerClient 添加一个BackendListener,使用CLI连接到InfluxDB
- 还可以配置Grafana
- http://jmeter.apache.org/usermanual/realtime-results.html
十六、最佳实践
- 使用最新版本,jmeter的性能一直在优化 
- 合理的线程数,过多可以考虑分布式多台服务器 
- cookie manager的位置 
- authorization manager的位置 
- 使用HTTP(S) Test Script Recorder 
- 使用用户变量参数化 
- 减少资源的建议,很重要 - 使用CLI模式 jmeter -n -t test.jmx -l test.jtl - 去掉无用的监听器 - 实际运行测试时,去掉察看结果树,仅在调试时使用 - 太多相同的采样器,建议改成循环 - 不要使用功能模式 - 输出csv而不是xml - 只保存需要的数据 - 尽可能少的断言 
- BeanShell服务器 
- vars.get()和vars.put(),访问jmeter变量,作用范围是线程内 
- 线程间共享变量 - 方式1 - import org.apache.jmeter.util.JMeterUtils; String value = JMeterUtils.getPropDefault("name",""); JMeterUtils.setProperty("name", "value");- 方式2 - if (bsh.shared.myObj == void){ // not yet defined, so create it: myObj = new AnyObject(); } bsh.shared.myObj.process();
- CLI模式下可以通过属性来参数化变量 - LOOPS=${__P(loops,10)} # 默认10 jmeter … -Jloops=12 … # 指定12
- 属性对于jmeter实例是全局的 
- 修改属性时,不要修改jmeter.properties文件,而是从jmeter.properties中复制属性到user.properties,这样方便升级到下个版本时,直接拿来用 
十七、帮帮忙!老板想让我给webapp做负载测试
- 需要思考:平均用户数、高峰用户数、压测时机、应用程序状态、测试目的
- 网络和应用资源
- 操作系统
十八、元件参考
- jdbc的sql不要输入分号
- 元件清单:http://jmeter.apache.org/usermanual/component_reference.html
十九、属性参考
- 重启jmeter,加载类时,才会解析属性
- 属性列表:http://jmeter.apache.org/usermanual/properties_reference.html
二十、函数
- 函数调用 - ${__functionName(var1,var2,var3)}
- 注意\转义参数中的逗号 
- jmeter会将${x}中x的空格自动删除 
- 属性使用**__P** or **__property**函数引用 
- 函数有2种,变量和内置函数 
- 函数在线程之间共享 
- 有些字段不允许随机字符串,它们需要数字,不接受函数 
- 要注意${}两边的引号,比如接口参数、sql 
- 函数名称以"**__**"开头 
- 如果函数不带参数,可以省略括号,这操作666,跟编程语言有明显差异 
- 查看变量的值,**__logn()**函数或Debug Sampler,还可以建一个包括变量引用的Java Request sampler,在listener中查看 
- 自定义变量会覆盖同名的内置函数 
- The Function Helper Dialog 
- 预定义变量COOKIE_cookiename JMeterThread.last_sample_ok START 
- 预定义属性START.MS START.YMD START.HMS TESTSTART.MS 
二十一、正则表达式
- 添加Debug Sampler和Tree View Listener,可以用来测试正则 
- View Results Tree包含RegExp Tester 
- 包含是指正则表达式是其中一部分,匹配是指全部匹配,例如alphabet包含ph.b.,匹配al.*t,注意alp|.lp.*是包含而不是匹配,因为alp包含后不会再继续寻找了 
- ^表示非,一个例子 - name="file" value="([^"]+)"> [^"]表示除"以外的任何
- . 任何 - + 一个或多个 - ? 非贪婪 
二十二、提示与技巧
- jmeter的变量是线程作用域,要共享线程变量,一属性,二文件(Save Responses to a file或BeanShell写文件,HTTP Sampler "file:" protocol或BeanShell读) 
- 调试日志选项 - jmeter.loggerpanel.display = true
- 通过菜单的搜索,搜索树中元件 
- jmeter会为每个jmx备份10个文件在$ {JMETER_HOME} / backups,相关属性 - jmeter.gui.action.save.backup_on_save = false jmeter.gui.action.save.backup_directory=/path/to/backups/dir jmeter.gui.action.save.keep_backup_max_hours=0 jmeter.gui.action.save.keep_backup_max_count=10
- gui.quick_*属性用于设置键盘快捷键 
版权申明:本文为博主原创文章,转载请保留原文链接及作者。
点读系列《jmeter官方用户手册》的更多相关文章
- 读《流畅的python》第一天
		1.跟运算符无关的特殊方法了解: 2.跟运算符相关的特殊方法了解: 3.内置的序列类型分类: 容器序列 list.tuple 和 collections.deque 这些序列能存放不同类型的数据. 扁 ... 
- [读书笔记]流畅的Python(Fluent Python)
		<流畅的Python>这本书是图灵科技翻译出版的一本书,作者Luciano Ramalho. 作者从Python的特性角度出发,以Python的数据模型和特殊方法为主线,主要介绍了pyth ... 
- 流畅的python(笔记)
		流畅的python中有很多奇技淫巧,整本书都在强调如何最大限度地利用Python 标准库.介绍了很多python的不常用的数据类型.操作.库等,对于入门python后想要提升对python的认识应该有 ... 
- 流畅的python 对象引用 可变性和垃圾回收
		对象引用.可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量.Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加 ... 
- 一篇夯实一个知识点系列--python生成
		写在前面 本系列目的:一篇文章,不求鞭辟入里,但使得心应手. 迭代是数据处理的基石,在扫描内存无法装载的数据集时,我们需要一种惰性获取数据的能力(即一次获取一部分数据到内存).在Python中,具有这 ... 
- 《流畅的python》读书笔记
		流畅的python 第1章 python数据模型 ---1.1 一摞Python风格的纸牌 特殊方法,即__method__,又被称为魔术方法(magic method)或者双下方法(dunder-m ... 
- python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学
		首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ... 
- 《流畅的Python》一副扑克牌中的难点
		1.现在在看<流畅的Python>这本书,看了三页就发现,这本书果然不是让新手来入门的,一些很常见的知识点能被这个作者玩出花来, 唉,我就在想,下面要分析的这些的代码,就算我费劲巴拉的看懂 ... 
- 《流畅的Python》Object References, Mutability, and Recycling--第8章
		Object References, Mutability, and Recycling 本章章节: Variables Are Not Boxes identity , Equality , Al ... 
- 《流畅的Python》 第一部分 序章 【数据模型】
		流畅的Python 致Marta,用我全心全意的爱 第一部分 序幕 第一章 Python数据模型 特殊方法 定义: Python解释器碰到特殊句法时,使用特殊方法激活对象的基本操作,例如python语 ... 
随机推荐
- 3天教你掌握Python必备常用英语词汇
			第一天 path [ pɑ:θ ] 路径 unexpected [ˌʌnɪkˈspektɪd] 不期望的 class [klɑ:s] 类 usage [ˈju:sɪdʒ] 使用 public ['p ... 
- 《单词的减法》state1~state17(第三遍学习记录)
			2016.05.24 state 8 curse/curve dedication 多用于奉献和献身 disastrous disruptive distract state 9 domestic/d ... 
- idea新手教程    如何springmvc创建Maven项目
			1.点击Create project,选择maven,勾选Create from archetype选择web-app,如图 2 输入 Group-Id //组织名,也是作者名 Arti ... 
- Java业务代理模式~
			业务代理模式用于解耦表示层和业务层. 它基本上用于减少表示层代码中的业务层代码的通信或远程查找功能.在业务层有以下实体. 客户端(Client) - 表示层代码可以是JSP,servlet或UI ja ... 
- leetcde-27-移除元素
			问题: package com.example.demo; public class Test27 { /** * 定义一个尾指针,该位置放置和val不同的元素, * 遍历数组,将不同的元素全部放置到 ... 
- C#程序的编译过程
			C#程序的编译过程,如下图 总结:编译器将C#代码编译成DLL/EXE,DLL/EXE包含metadata(清单数据,对代码的描述)和IL(中间语言),IL(中间语言)经过CLR/JIT第二次编译才是 ... 
- IntelliJ Idea 环境搭建
			安装IntelliJ Idea 可以去官网下载: https://www.jetbrains.com/idea/download/#section=windows 选择Ultimate.一路下一步安装 ... 
- NHibernet Unable to locate persister for the entity
			第一 xml文件必须为 *.hbm.xml 第二 设置xml文件为嵌入的资源,用鼠标点击右键 然后生成操作里 选择嵌入的资源即可解决. https://www.cnblogs.com/lyj/ 
- rabbitmq一个连接多个信道channel
			https://www.cnblogs.com/eleven24/p/10326718.html 
- EventBus总结(原)
			1.EventBus的作用 EventBus is a publish/subscribe event bus for Android and Java. EventBus可以被用来在各种自定义的监听 ... 
