RocketMQ-消息过滤

RocketMQ 执行过滤是在 Broker 端,Broker 所在的机器会启动多个 FilterServer 过滤进程;Consumer 启动后,会向 FilterServer 上传一个过滤的 Java 类;Consumer 从 FilterServer 拉消息,FilterServer 将请求转发给 Broker,FilterServer 从 Broker 收到消息后,按照 Consumer 上传的 Java 过滤程序做过滤,过滤完成后返回给 Consumer。这种过滤方法可以节省网络流量,但是增加了 Broker 的负担

首先我们需要在rocketmq 的我们需要在broker-*.properties文件里添加一句话filterServerNums=1

生产者代码:


public class FilterProducer {
	public static void main(String[] args) throws MQClientException {
		DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
		producer.setNamesrvAddr("192.168.1.244:9876;192.168.1.245:9876;192.168.1.242:9876;192.168.1.243:9876");
		producer.start();
		try {
			for (int i = 0; i < 100; i++) {
				Message msg = new Message("TopicFilter7",// topic
									"TagA",// tag
										("Hello MetaQ").getBytes());// body
				//这个属性作为过滤的条件
				msg.putUserProperty("SequenceId", String.valueOf(i));
				SendResult sendResult = producer.send(msg);
				System.out.println(sendResult+","+String.valueOf(i));
				Thread.sleep(100);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		producer.shutdown();
	}

 

消费者代码:

public class FilterConsumer {
	public static void main(String[] args) throws InterruptedException,
			MQClientException {
		
		DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(
				"ConsumerGroupNamecc4");
		
		consumer.setNamesrvAddr("192.168.1.244:9876;192.168.1.245:9876;192.168.1.242:9876;192.168.1.243:9876");
		
		// 使用Java代码,在服务器做消息过滤
		String filterCode = MixAll.file2String("D:/Workspaces/rocket-simple/src/main/java/com/sun/activemq/filter/MessageFilterImpl.java");
		
		System.out.println(filterCode);
		//有了filter不用指定tag了 其实tag也可以作为过滤
		consumer.subscribe("TopicFilter7",
				"com.sun.activemq.filter.MessageFilterImpl", filterCode);
		consumer.registerMessageListener(new MessageListenerConcurrently() {
 
			@Override
			public ConsumeConcurrentlyStatus consumeMessage(
					List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
				for(MessageExt mext : msgs) {
            		try {
						System.out.println("消费了一条消息:"+new String(mext.getBody(),"utf-8")+mext.getUserProperty("SequenceId"));	
					} catch (UnsupportedEncodingException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						//消费失败告诉mq重新发送继续消费
						return ConsumeConcurrentlyStatus.RECONSUME_LATER;
					} 
            	}
            	 /*
            	  * 告诉mq消费成功 
            	  */
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
			}
		
		});
		/**
		 * Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>
		 */
		consumer.start();
		System.out.println("Consumer Started.");
	}
}

过滤器:

package com.sun.activemq.filter;
 
import com.alibaba.rocketmq.common.filter.MessageFilter;
import com.alibaba.rocketmq.common.message.MessageExt;
 
public class MessageFilterImpl implements MessageFilter {
 
	@Override
	public boolean match(MessageExt msg) {
		String property = msg.getUserProperty("SequenceId");
		System.out.println(property);
		if (property != null) {
			int id = Integer.parseInt(property);
			if((id % 2) == 0) { 
				return true;
			}
		}
		return false;
	}
 
}

先启动消费者 ,再启动生产者,打印结果如下:

生产者打印部分结果:

消费者打印部分结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ是一款开源的分布式消息队列系统,而rocketmq-client-java是RocketMQ的Java客户端。 rocketmq-client-java提供了丰富的API,使得开发者可以方便地使用RocketMQ进行消息的发布和订阅。它支持多种消息发送模式,包括同步发送、异步发送和单向发送。同步发送保证了消息的可靠性和顺序性,异步发送提高了发送效率,而单向发送则不需要等待服务器的响应。此外,rocketmq-client-java还支持批量发送和延迟发送等特性,满足了不同场景下的需求。 rocketmq-client-java提供了多种消息消费模式,包括集群模式和广播模式。在集群模式下,多个消费者可以共同消费一个队列的消息,实现消息的负载均衡和高可用性;而在广播模式下,每个消费者都能收到所有队列的消息,适用于需要实时获得消息的场景。 rocketmq-client-java还提供了自动负载均衡和故障转移的功能。当消费者增减或者下线时,RocketMQ会自动进行负载均衡,保证每个消费者都能平均地消费消息。而当某个消费者出现故障时,RocketMQ会将该消费者的消息重新分配给其他正常工作的消费者,保证消息的可靠性和高可用性。 此外,rocketmq-client-java还支持消息过滤消息事务和顺序消息等高级特性。消息过滤可以根据指定的条件对消息进行过滤,只消费符合条件的消息消息事务可以保证消息的原子性,要么一起成功,要么一起失败。顺序消息可以保证按照发送顺序进行消费,避免了消息的乱序问题。 综上所述,rocketmq-client-java是RocketMQ的Java客户端,提供了丰富的API和多种特性,使得开发者可以方便地使用RocketMQ进行消息的发布和订阅,并满足不同场景下的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值