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

由于最近公司需要承接全国的单点问题,在用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();
        }
    }
}
他自己有重试机制,强烈建议先启动消费者再去启动生产者。但是想批量消费,就先启动生产者在启动消费者。
  


转载请注明出处!!!!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值