rocketmq的单机版的安装部署以及简单的hell word

来源:互联网 发布:淘宝网怎么刷单挣钱 编辑:程序博客网 时间:2024/05/22 00:25

由于最近公司需要承接全国的单点问题,在用rocket来处理分布式事务问题。采用的是阿里的rocketmq消息对列。



rocketmq安装:
下载编译好的rocketmq包,
wget https://github.com/alibaba/RocketMQ/releases/download/v3.2.6/alibaba-rocketmq-3.2.6.tar.gz

如果此链接失效就下载这个地方的:

http://download.csdn.net/download/qq_38665235/9999088

解压
tar -zxvf alibaba-rocketmq-3.2.6.tar.gz


移动
mv alibaba-rocketmq-3.2.6 /usr/local/rocketmq

配置环境变量
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
M2_HOME=/usr/maven/
ROCKETMQ_HOME=/usr/rocketmq
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$M2_HOME/bin:$ROCKETMQ_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH M2_HOME ROCKETMQ_HOME PATH
export NAMESRV_ADDR=127.0.0.1:9876


修改runservice.sh和runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:PermSize=128m -XX:MaxPermSize=320m"


启动nameserver
nohup sh mqnamesrv &


如果报错如下
java.lang.ExceptionInInitializerError
at com.alibaba.rocketmq.namesrv.NamesrvStartup.main0(NamesrvStartup.java:125)
at com.alibaba.rocketmq.namesrv.NamesrvStartup.main(NamesrvStartup.java:70)
Caused by: java.lang.RuntimeException: InetAddress java.net.InetAddress.getLocalHost() throws UnknownHostException
See https://github.com/alibaba/RocketMQ/issues/64 for further details.
at com.alibaba.rocketmq.common.MixAll.localhost(MixAll.java:458)
at com.alibaba.rocketmq.common.MixAll.<clinit>(MixAll.java:82)
... 2 more
Caused by: java.net.UnknownHostException: bogon: bogon: Name or service not known
at java.net.InetAddress.getLocalHost(InetAddress.java:1505)
at com.alibaba.rocketmq.common.MixAll.localhost(MixAll.java:454)
... 3 more
Caused by: java.net.UnknownHostException: bogon: Name or service not known
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
at java.net.InetAddress.getLocalHost(InetAddress.java:1500)


说明此时绑定的主机名和hosts文件里面的不一致,查看主机名称 $ hostname
修改/etc/hosts文件中的主机名称和/etc/sysconfig/network中的主机名称


查看是否启动正常
ps aux|grep java
正常如下:




启动broker,创建文件夹
mkdir ../conf/me-2m-2s-async/
sh mqbroker -m >../conf/me-2m-2s-async/broker.p


打开broker.p吧brokerIP1制定为主机ip(虚拟机的对外ip)


启动broker
nohup sh mqbroker -n 192.168.73.129:9876 autoCreateTopicEnable=true -c ../conf/me-2m-2s-async/broker.p &

开放端口:
/sbin/iptables -I INPUT -p tcp --dport 9876 -j ACCEPT

保存设置:
/etc/rc.d/init.d/iptables save
下载rocketmq-console控制台项目
wget https://github.com/duomu/rocketmq-console/raw/master/rocketmq-console.war 下载


将下载好的war包放在tomcat的webapp文件夹下 启动tomcat即可访问控制台

java代码部分

pom依赖:

 <dependency>      <groupId>com.alibaba.rocketmq</groupId>      <artifactId>rocketmq-client</artifactId>      <version>3.2.6</version>    </dependency>

        生产者:

public class MqProducer {    public static void main(String[] args) throws UnsupportedEncodingException {        DefaultMQProducer producer=  new DefaultMQProducer("producer");        producer.setNamesrvAddr("192.168.73.129:9876");        try {            producer.start();            System.out.print("生产者启动成功");            //创建消息            for(int i=0;i<50;i++) {                Message msg = new Message("PushTopic", "push", "1", ("Hello world"+i).getBytes());                //发送消息                SendResult send = producer.send(msg);                String str=new String(msg.getBody(),("utf-8"));                System.out.println(str);            }        } catch (MQClientException e) {            e.printStackTrace();        } catch (InterruptedException e) {            e.printStackTrace();        } catch (RemotingException e) {            e.printStackTrace();        } catch (MQBrokerException e) {            e.printStackTrace();        }finally {            //关闭生产者            producer.shutdown();        }    }}

           消费者:

public class Consumer {    public static void main(String[] args){        DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("PushConsumer");//这里的PushConsumer必须全局唯一        consumer.setNamesrvAddr("192.168.73.129:9876");        try {            consumer.subscribe("PushTopic","*");            //程序第一次启动从消息队列头取数据            consumer.setConsumeFromWhere(                    ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);            consumer.registerMessageListener(                    new MessageListenerConcurrently() {                        public ConsumeConcurrentlyStatus consumeMessage(                                List<MessageExt> list,                                ConsumeConcurrentlyContext Context) {                            try {                               for(Message message:list){                                   String msgbody=new String(message.getBody(),("utf-8"));                                   String topic=message.getTopic();                                   System.out.println("收到消息"+"topic"+topic+"消息内容"+msgbody);                               }                            } catch (UnsupportedEncodingException e) {                                e.printStackTrace();                                MessageExt ext=list.get(0);                                if(ext.getReconsumeTimes()==2){                                    System.out.println("重试结束");                                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;                                }                            }                            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;                        }                    }            );            consumer.start();        } catch (MQClientException e) {            e.printStackTrace();        }    }}
他自己有重试机制,强烈建议先启动消费者再去启动生产者。但是想批量消费,就先启动生产者在启动消费者。
  


转载请注明出处!!!!

原创粉丝点击