配置单机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的位置:
更改前:
更改后:
这时再运行程序,便可以正常收发消息了。
阅读全文
1 0
- 配置单机RocektMq踩过的那些坑
- HBase单机踩过的坑
- 我踩过的听过的那些坑
- 那些年我踩过的坑
- Google支付 踩过的那些坑
- Xcode打包踩过的那些坑
- 那些曾经踩过的坑
- angularjs踩过的那些坑
- 那些年Dialog踩过的坑
- 那些年踩过的坑
- 学习java踩过的那些坑
- 那些年踩过的坑
- Matlab coder 踩过的那些坑
- React-Native踩过的那些坑
- 那些年,踩过的坑
- echarts踩过的那些坑
- 那些年,React 踩过的坑
- 那些年踩过的mysql的坑
- H-Bomb
- 运维小结之关于ssh登录问题的解决方法
- [洛谷P1315]观光公交
- Java之定义and启动线程
- 疯狂Activiti6.0连载(13)DMN的XML规范
- 配置单机RocektMq踩过的那些坑
- 2017.11.3总结
- CSS 继承
- 记忆网络之Gated End-To-End Memory Networks
- MySQL explain执行计划解读
- 一个简单地程序示例剖析类加载机制
- 洛谷 3932 浮游大陆的68号岛 前缀和
- bzoj5056: OI游戏
- 手把手教Redis安装