RocketMQ学习笔记(一)eclipse版的quickstart
学而时习之,不亦说乎!
自己搭建个学习用的RocketMQ总是很麻烦,需要虚拟机环境,网络,需要安装rocketmq,启动。时间久了再去看,又不知道这个虚拟机是干嘛的了。
直接在eclipse中启动,简单省事,用的时候启动,用完关掉就行了。
先看下图,给还没开始的你一点信心。

RocketMQ
Apache RocketMQ™ is an open source distributed messaging and streaming data platform.
Apache RocketMQ™是一个开源分布式消息和流数据平台
Quick Start(先看看官网的怎么玩的)
This quick start guide is a detailed instruction of setting up RocketMQ messaging system on your local machine to send and receive messages.
这个快速启动指南详细说明了如何在本地机器上设置RocketMQ消息传递系统来发送和接收消息。
Prerequisite
The following softwares are assumed installed:
64bit OS, Linux/Unix/Mac is recommended;
64bit JDK 1.8+;
Maven 3.2.x
Git
Download & Build from Release
Click here to download the 4.3.0 source release. Also you could download a binary release from here.
Now execute the following commands to unpack 4.3.0 source release and build the binary artifact.
> unzip rocketmq-all-4.3.0-source-release.zip
> cd rocketmq-all-4.3.0/
> mvn -Prelease-all -DskipTests clean install -U
> cd distribution/target/apache-rocketmq
Start Name Server
> nohup sh bin/mqnamesrv &
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
Start Broker
> nohup sh bin/mqbroker -n localhost:9876 &
> tail -f ~/logs/rocketmqlogs/broker.log
The broker[%s, 172.30.30.233:10911] boot success...
Send & Receive Messages
Before sending/receiving messages, we need to tell clients the location of name servers. RocketMQ provides multiple ways to achieve this. For simplicity, we use environment variable NAMESRV_ADDR
> export NAMESRV_ADDR=localhost:9876
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
Shutdown Servers
> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
> sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK
Start In STS
参考官网的quick start,实现STS的quick start。以后再也不用去虚拟机找rocketmq了!
导入源码到STS
安装STS(Spring Tool Suite)或者Eclipse
新建rocketmq和rocketmq-externals各自的Java Working Set
分别导入源码到各自的Java Working Set
解决报错,ignore或者update
修改下设置,比如字体什么的
接下来干什么?
要在STS中启动RocketMQ,那么首先分析下官方提供的脚本是怎么启动的。对照官网quick start开始下面的流程。
分析mqnamesrv
位置:rocketmq\distribution\bin\
#!/bin/sh
#[ -z STRING ] “STRING” 的长度为零则为真
# [ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
#$ Shell本身的文件名
#$@ 是传给脚本的所有参数列表
if [ -z "$ROCKETMQ_HOME" ] ; then
## resolve links - $ may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
ROCKETMQ_HOME=`dirname "$PRG"`/..
# make it fully qualified
ROCKETMQ_HOME=`cd "$ROCKETMQ_HOME" && pwd`
cd "$saveddir"
fi
#这个if的作用就是没有ROCKETMQ_HOME环境变量的时候,设置一个ROCKETMQ_HOME环境变量。明显我们进来的时候是没有的,通过一系列操作后,ROCKETMQ_HOME就被设置为当前文件所在目录的上层目录,这里就是rocketmq\distribution\bin
export ROCKETMQ_HOME
sh ${ROCKETMQ_HOME}/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup $@
#这个shell的目的是在当前目录执行runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup $@
分析NamesrvStartup
#!/bin/sh
#[ -e FILE ] 如果 FILE 存在则为真
error_exit ()
{
echo "ERROR: $1 !!"
exit
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
#这儿是确保找到AVA_HOME,不然就直接报错了
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $)/..
#BASE_DIR就是上一级的bin目录,也就是../bin
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
#把上级目录下的conf目录,也就是../conf加到CLASSPATH
#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
#运行在server模式;堆内存固定为4g,新生代2g,元空间128m,最大元空间320m
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
#使用CMS垃圾收集器;在FULL GC的时候,对年老代的压缩;使用70%后开始CMS收集;降低标记停顿;每兆堆空闲空间中SoftReference的存活时间=;新生代比例:::;新生代使用ParNew
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
#输出虚拟机中GC的详细情况;gc日志地址/dev/shm/rmq_srv_gc.log ;-XX:+PrintGCDetails
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
#禁用吃异常优化
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
#启用大内存分页
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#指定扩展类加载器加载的包路径
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
#开启远程debug
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
$JAVA ${JAVA_OPT} $@
那么我们要干什么呢?
从shell看,我们要设置一个ROCKET_HOME,我们的启动类是org.apache.rocketmq.namesrv.NamesrvStartup
private String rocketmqHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV));
ROCKET_HOME主要就是为了找到日志配置文件,那么可以手动指定一下环境
查看日志配置文件,使用到了user.home,那么手动写一个
虚拟机的启动优化,参数,可以在启动的时候加上,也可以不管
修改rocketmq-namesrv项目下的NamesrvStartup.java
public static void main(String[] args) {
System.setProperty("rocketmq.home.dir", "../distribution");//新增
System.setProperty("user.home", ".");//新增
main0(args);
}
接下来
Run As ->Java Application
The Name Server boot success. serializeType=JSON
然后用jconsole大致看一下,内存消耗的确不大,但是启动指定几个g是几个意思?
刷新一下,当前目录就可以看到日志了
同样的方法,启动brocker
shell文件大同小异,main方法如下,新增三行代码
rocketmq-brocker项目下的BrokerStartup.java
public static void main(String[] args) {
System.setProperty("rocketmq.home.dir", "../distribution");//新增
System.setProperty("user.home", ".");//新增
args=new String[]{"-n","localhost:9876"};//新增
start(createBrokerController(args));
}
Run As ->Java Application
启动后刷新当前项目,可以看到日志目录和数据目录
启动控制台
我们已经导入了rocketmq-externals,找到rocketmq-console-ng项目
修改aplication.properties:rocketmq.config.namesrvAddr=localhost:9876
运行App类的main方法:Run As ->Java Application
访问localhost:8080
至此,我们一共启动了三个项目,一个nameserver,一个broker,一个console;nameserver类似于zk,broker用于实际消息收发,console用于可视化监控查看。
生产消费消息
找到项目:rocketmq-example
启动生产者
打开org.apache.rocketmq.example.quickstart.Producer类,加上producer.setNamesrvAddr("localhost:9876");
运行
启动消费者
打开org.apache.rocketmq.example.quickstart.Consumer类,加上consumer.setNamesrvAddr("localhost:9876");
运行
RocketMQ学习笔记(一)eclipse版的quickstart的更多相关文章
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- RocketMQ学习笔记(15)----RocketMQ的消息模式
在前面学习ActiveMQ时,看到ActiveMQ可以是队列消息模式,也可以是订阅发布模式. 同样,在RocketMQ中,也存在两种消息模式,即是集群消费模式和广播消费模式. 1. 集群消费模式 跟A ...
- RocketMQ学习笔记(13)----RocketMQ的Consumer消息重试
1. 概念 Producer端重试: 生产者端的消息失败,也就是Producer往MQ上发消息没有发送成功,比如网络抖动导致生产者发送消息到MQ失败. 这种消息失败重试我们可以手动设置发送失败重试的次 ...
- RocketMQ学习笔记(16)----RocketMQ搭建双主双从(异步复制)集群
1. 修改RocketMQ默认启动端口 由于只有两台机器,部署双主双从需要四个节点,所以只能修改rocketmq的默认启动端口,从官网下载rocketmq的source文件,解压后使用idea打开,全 ...
- RocketMQ学习笔记(14)----RocketMQ的去重策略
1. Exactly Only Once (1). 发送消息阶段,不允许发送重复的消息 (2). 消费消息阶段,不允许消费重复的消息. 只有以上两个条件都满足情况下,才能认为消息是“Exactly O ...
- RocketMQ学习笔记(4)----RocketMQ搭建双Master集群
前面已经学习了RockeMQ的四种集群方式,接下来就来搭建一个双Master(2m)的集群环境. 1. 双Master服务器环境 序号 ip 用户名 密码 角色 模式 (1) 47.105.145.1 ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar中的类解压后放在运行jar中
前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中 使用7z打开压缩包,查看所有依赖的jar都被解压以包名及class的方式存储在了运行jar中,此时jar的 ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中
本文需要参考前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中 上文是导出的运行的依赖jar被放在了子目录中,本文是将依赖jar放在可运行jar的本身,这样发布的 ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中
工程创建可参考前文: [学习笔记] 在Eclipse中使用Hibernate,并创建第一个工程,数据库为Oracle XE 在工程上鼠标右键: 找到java 选择 Runable JAR file N ...
- [学习笔记] 在Eclipse中添加用户库 Add User Libraries ,在项目中引用用户库
如果还没有安装Eclipse, 则请参考前文: [学习笔记] 下载.安装.启动 Eclipse(OEPE) 添加用户库 本文主要介绍在项目中直接使用第三方库的情况.就是把第三方的jar文件直接放到某 ...
随机推荐
- [GO]go context的deadline方法
package main import ( "time" "context" "fmt" ) func main() { d := time ...
- android分屏
上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Android7.0原生系统就可以支持两个App横屏并排或者竖屏上下摆放了.第二个新特性就是在Android TV ...
- SpringMvc与Struts2的对比
目前企业中使用SpringMvc的比例已经远远超过Struts2,那么两者到底有什么区别,是很多初学者比较关注的问题,下面我们就来对SpringMvc和Struts2进行各方面的比较: 1.核心控制器 ...
- iOS9 Https技术预研
一.服务器需要做的事情: 1.要注意 App Transport Security 要求 TLS 1.2, 2.而且它要求站点使用支持forward secrecy协议的密码. 3.证书也要求是符合A ...
- JDBC 中 socketTimeout 的作用
如果我们把socketTimeout设置如下: socketTimeout=60000; 这意味着60秒以内服务器必须开始给客户端吐数据,以保持socket的活性.配置成60秒,一般查询都不会遇到问题 ...
- AngularJS Backbone.js Ember.js 对比
看到一篇关于AngularJS Backbone Ember.js的对比,建议看一看 说说个人的观点(本人学艺不精,只是个人的观点,不保证观点完全正确,请轻拍): backbone.js 短小精悍,非 ...
- PHP爬虫(3)PHP DOM开源代码里的大坑和字符编码
一.开源代码的问题 在PHP爬虫(2)中介绍了开源工程Sunra.PhpSimple.HtmlDomParser.在实际工作中发现一个问题,例如http://www.163.com的网页数据怎么也抓取 ...
- ES6学习之const声明常量的学习
在ES中const关键字用来声明常量,const声明的一经定义不能修改 和let特性差不多, ; console.log(a); a = ; //报错 const定义完常量后必须赋值,后面不允许再次赋 ...
- AngularJS 常用语法
面板收缩(class=collapsed)与扩展(class=expand) <div ng-init="expand=false" data-ng-class=" ...
- Gogland配置- 去掉Go源代码中的参数提示
Gogland处于好意,在Go源代码中对每个参数提示类型,这或许方便大家处理源代码,但是我觉得对于正常阅读源代码反而造成一种负担,我决定去掉这个功能! Gogland默认配置状态,有参数提示: 下面是 ...