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