转至元数据起始
定义生产者
每一类生产者必须定义一个spring bean,,,而且该bean的producerGroup属性必须唯一(不能跟其他类的生产者重复),否则在使用分布式事务的时候会出现问题。
根据官方规范:producerGroup: 一般发送同样消息的Producer,归为同一个Group,应用必须设置,并保证命名唯一
producer配置
<
bean
id
=
"smsproducer"
class
=
"com.alibaba.rocketmq.client.producer.DefaultMQProducer"
init-method
=
"start"
lazy-init
=
"true"
>
<
property
name
=
"producerGroup"
value
=
"smsproductgroup"
/>
</
bean
>
|
使用生产者
调用producer
<
bean
id
=
"sendmessage"
class
=
"com.lifeix.apollo.user.service.impl.SendMessageDemo"
>
<
property
name
=
"producer"
ref
=
"smsproducer"
/>
</
bean
>
|
发消息
public
class
SendMessageDemo {
private
DefaultMQProducer producer;
public
DefaultMQProducer getProducer() {
return
producer;
}
public
void
setProducer(DefaultMQProducer producer) {
this
.producer = producer;
}
public
void
sendMessage() {
Message msg =
new
Message(
"TopicTest1"
,
// topic
"TagA"
,
// tag
"OrderID001"
,
// key
(
"Hello MetaQ"
).getBytes());
// body
SendResult sendResult;
try
{
sendResult = producer.send(msg);
System.out.println(sendResult);
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
|
pushconsumer 广播模式用法
consumer使用之前必须先调用subscribe 订阅topic ,还需要定义消费消息的Listener,,,没有办法全部在spring里面管理,,,
所以,只能显示的new DefaultMQPushConsumer对象,进行消费的操作
sample
public
class
ConsumeMessageClusteringDemo {
protected
void
init() {
DefaultMQPushConsumer consumer =
new
DefaultMQPushConsumer(
"ConsumerGroupName"
);
/**
* 订阅指定topic下tags分别等于TagA或TagC或TagD
*/
try
{
consumer.setMessageModel(MessageModel.BROADCASTING);
//设置 广播消费模式
consumer.subscribe(
"TopicTest1"
,
"TagA || TagC || TagD"
);
/**
* 订阅指定topic下所有消息<br>
* 注意:一个consumer对象可以订阅多个topic
*/
consumer.subscribe(
"TopicTest2"
,
"*"
);
/**
* 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br>
* 如果非第一次启动,那么按照上次消费的位置继续消费
*/
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.registerMessageListener(
new
MessageListenerConcurrently() {
/**
* 默认msgs里只有一条消息,可以通过设置consumeMessageBatchMaxSize参数来批量接收消息
*/
@Override
public
ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
System.out.println(Thread.currentThread().getName() +
" Receive New Messages: "
+ msgs);
MessageExt msg = msgs.get(
0
);
if
(msg.getTopic().equals(
"TopicTest1"
)) {
// 执行TopicTest1的消费逻辑
if
(msg.getTags() !=
null
&& msg.getTags().equals(
"TagA"
)) {
// 执行TagA的消费
String msgbody =
new
String(msg.getBody());
System.out.println(msgbody);
}
else
if
(msg.getTags() !=
null
&& msg.getTags().equals(
"TagC"
)) {
// 执行TagC的消费
String msgbody =
new
String(msg.getBody());
System.out.println(msgbody);
}
else
if
(msg.getTags() !=
null
&& msg.getTags().equals(
"TagD"
)) {
// 执行TagD的消费
String msgbody =
new
String(msg.getBody());
System.out.println(msgbody);
}
}
else
if
(msg.getTopic().equals(
"TopicTest2"
)) {
// 执行TopicTest2的消费逻辑
}
return
ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
/**
* Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>
*/
consumer.start();
}
catch
(MQClientException e) {
e.printStackTrace();
}
}
}
|
pushconsumer 集群模式用法
pushconsumer 集群消费模式,,,跟广播很相似,,只是setMessageModel 方法传参做点修改即可
consumer.setMessageModel(MessageModel.CLUSTERING); //设置 广播消费模式
demo代码参考
注:参考 apollo 工程目录结构 ssh://git@pangtong.l99.com:19022/framework/lifeix-demo.git
apollo.user.impl 模块