1.为了减少报错,多加了个fastjson的包
<dependency>
<groupId>com.alibaba.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>3.0.10.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2.消息的生产者。 如果报错No route info of this topic,网上有多种解决方式,靠谱的三种:
一是启动时设置:autoCreateTopicEnable=true
二是网络链接问题,很可能是linux的防火墙设置的问题,导致用远程ip访问不到mq的namesrv
三是缺少fastjson包
public class RocketMQProducer
{
private DefaultMQProducer sender;
protected String nameServer;
protected String groupName;
protected String topics;
/**
* 初始化信息
* @data 2018年5月17日
* @author zy
*/
public void init()
{
sender = new DefaultMQProducer(groupName);
sender.setNamesrvAddr(nameServer);
sender.setInstanceName(UUID.randomUUID().toString());
try
{
sender.start();
}
catch (MQClientException e)
{
e.printStackTrace();
}
}
/**
* 构造函数
*
* @param nameServer
* @param groupName
* @param topics
*/
public RocketMQProducer(String nameServer, String groupName, String topics)
{
this.nameServer = nameServer;
this.groupName = groupName;
this.topics = topics;
}
/**
* 构建消息的方法,启动MQ的时候将autoCreateTopicEnable=true,即使不创建topics,RocketMQ也会默认创建个
*
* @data 2018年5月17日
* @author zy
* @param message
* @param i
*/
public void send(Message message, int i)
{
message.setTopic(topics);
message.setKeys(String.valueOf(i));
// 实现message接收的顺序和插队
if (i != 5)
{
message.setDelayTimeLevel(2);
}
int dex = i % 100;
try
{
// 为了保证顺序消费,将消息定义在一个MessageQueue中
SendResult result = sender.send(message, new MessageQueueSelector()
{
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg)
{
int id = (Integer) arg;
int index = id % mqs.size();
return mqs.get(index);
}
}, dex);
SendStatus status = result.getSendStatus();
String info = "第"
+ i
+ "次发送的messageId = "
+ result.getMsgId()
+ ", "
+ "status = "
+ status
+ " MessageQueue id = "
+ result.getMessageQueue().getQueueId();
System.out.println(info);
App.WriteMsg(info + "\r\n");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
3.消息的消费者
public class RocketMQConsumer
{
private DefaultMQPushConsumer consumer;
private MessageListener listener;
protected String nameServer;
protected String groupName;
protected String topics;
public RocketMQConsumer(MessageListener listener, String nameServer, String groupName, String topics)
{
this.listener = listener;
this.nameServer = nameServer;
this.groupName = groupName;
this.topics = topics;
}
/**
* 初始化信息
* @data 2018年5月17日
* @author zy
*/
public void init()
{
consumer = new DefaultMQPushConsumer(groupName);
consumer.setNamesrvAddr(nameServer);
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
try
{
consumer.subscribe(topics, "*");
}
catch (MQClientException e)
{
e.printStackTrace();
}
consumer.setInstanceName(UUID.randomUUID().toString());
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
consumer.registerMessageListener((MessageListenerConcurrently) this.listener);
try
{
consumer.start();
}
catch (MQClientException e)
{
e.printStackTrace();
}
System.out.println("消費者開始消費! group=" + consumer.getConsumerGroup() + " instanceName="
+ consumer.getInstanceName() + "NamesrvAddr= " + consumer.getNamesrvAddr());
}
}
4.用main方法测试:
public class App
{
public static void main(String[] args)
{
// 生产者
testPro();
// 消费者
testCon();
}
/**
* 测试生产者的方法
*
* @data 2018年5月17日
* @author zy
*/
public static void testPro()
{
String mqNameServer = "192.168.1.104:9876";
String mqTopics = "TESTzy";
String producerMqGroupName = "PRODUCERzy";
RocketMQProducer mqProducer = new RocketMQProducer(mqNameServer, producerMqGroupName, mqTopics);
mqProducer.init();
for (int i = 0; i < 1000; i++)
{
Message message = new Message();
message.setBody(("这是发送的RocketMQ " + i).getBytes());
mqProducer.send(message, i);
}
}
/**
* 测试消费者的方法
*
* @data 2018年5月17日
* @author zy
*/
public static void testCon()
{
String mqNameServer = "192.168.1.104:9876";
String mqTopics = "TESTzy";
String consumerMqGroupName = "PRODUCERzy";
RocketMQListener mqListener = new RocketMQListener();
RocketMQConsumer mqConsumer = new RocketMQConsumer(mqListener, mqNameServer, consumerMqGroupName, mqTopics);
mqConsumer.init();
try
{
Thread.sleep(1000 * 60L);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
/**
* 将收发的消息放在文件中,可以看是否有消息丢失。
*
* @param string 消息
*
*/
public static void WriteMsg(String string)
{
FileOutputStream fos = null;
File file = new File("E:/log.txt");
try
{
fos = new FileOutputStream(file, true);
fos.write(string.getBytes());
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
fos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}