配置单机RocektMq踩过的那些坑

来源:互联网 发布:东莞制造业知乎 编辑:程序博客网 时间:2024/06/06 15:52

个人水平比较菜,记下这些是给自己看的,为了防止以后再掉进同样的坑,大神们一笑而过就好。


一、下载编译阶段

最开始用的方法是通过git直接从github上拉取源代码,然后用maven进行编译,可是编译结果却总是报错。



重复多次后无奈,只能去官网下载源码包,这次编译一次成功,这个坑到现在也不清楚是怎么回事,难道是apache官方有错?还希望大神指点一下。

二、启动阶段

最开始启动时会显示无法启动,查看错误信息,发现是jdk的堆配置过大,改小一些就可以启动成功。但是也不能改的太小,否则会出现OOM。


其中,runbroker.sh除了需要改动server部分外,还需要改动MaxDirectMemorySize


启动成功后,会在~/logs/rocketmqlogs/ 中的namesrv.log 以及 broker.log中看到如下信息。



这里有个坑,待会会提到。


同时,查看9876端口与10911端口,发现端口被Java程序占用——即namesrv和broker



三、收发消息

编写Producer,Consumer代码如下:

public class Consumer {    private static DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");    private static int initialState = 0;    private Consumer() {    }    public static DefaultMQPushConsumer getConsumer() {        if (consumer == null) {            consumer = new DefaultMQPushConsumer("ConsumerGroupName");        }        if (initialState == 0) {            consumer.setNamesrvAddr("47.95.118.244:9876");            consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);            initialState = 1;        }        return consumer;    }}


public class Producer {    private static DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");    private static int initialState = 0;    private Producer() {    }    public static DefaultMQProducer getDefaultMQProducer() {        if (producer == null) {            producer = new DefaultMQProducer("ProducerGroupName");        }        if (initialState == 0) {            producer.setNamesrvAddr("47.95.118.244:9876");            producer.setVipChannelEnabled(false);            try {                producer.start();            } catch (MQClientException e) {                //todo auto-generated                e.printStackTrace();                return null;            }            initialState = 1;        }        return producer;    }}

编写主函数如下:

public class Test {    private static final Logger logger = LoggerFactory.getLogger(Test.class);    public static void main(String[] args) {        Thread s = new Thread(new Runnable() {            @Override            public void run() {                sendMsg();            }        });        Thread r = new Thread(new Runnable() {            @Override            public void run() {                receiveMsg();            }        });        r.start();        s.start();    }    public static void sendMsg() {        DefaultMQProducer producer = Producer.getDefaultMQProducer();        try {            for (int i = 0; i < 10; i++) {                Message msg = new Message(                        "TopicTest1",                        "tagA",                        "OrderID00" + i,                        ("Hello " + i).getBytes()                );                SendResult sendResult = producer.send(msg);                logger.info("sendResult:{}", sendResult);            }        } catch (MQClientException | RemotingException | InterruptedException | MQBrokerException e) {            e.printStackTrace();        }        producer.shutdown();    }    public static void receiveMsg() {        DefaultMQPushConsumer consumer = Consumer.getConsumer();        try {            consumer.subscribe("TopicTest1", "*");            consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {                logger.info("currentThreadName:{} and Receive New Messages:{}", Thread.currentThread().getName(), msgs);                MessageExt msg = msgs.get(0);                System.out.println(new String(msg.getBody()));                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;            });            /**             * Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>             */            consumer.start();            logger.info("Consumer Started.");        } catch (MQClientException e) {            e.printStackTrace();        }    }}
然而运行时发现报异常,显示No route info of this topic,觉得很奇怪。namesrv和broker明明已经启动完毕,于是到服务器上看broker的日志,却发现查不到有该Topic的信息,迷茫的时候,忽然眼睛瞟到了刚刚的成功信息:



这个奇怪的ip是什么?我的服务器ip分明是47.95.118.244,后来想到会不会这是内网的ip,经过查看,发现果然是,原来broker会自动获取内网的ip来作为broker的默认ip,我用自己的电脑当然访问不到了,于是编写了一个broker.properties,通过-c 在启动时指定properties的位置:





更改前:



更改后:




这时再运行程序,便可以正常收发消息了。




原创粉丝点击