Java观察者模式 + Kafka实现发布订阅、消息推送

文章介绍了如何使用Java实现基于Kafka的发布订阅模式,包括抽象消息主题和观察者的接口定义,以及具体的消息主题和观察者类的实现。MessageSubject类监听Kafka的topic1,并在接收到消息后通过notify方法广播或点对点推送至Topic1Observer和Topic2Observer。
摘要由CSDN通过智能技术生成

一、Java实现发布订阅、消息推送

在发布订阅
消息推送

二、定义Java观察者模式 - UML类图

UML类图

三、Java代码实现

3.1 抽象消息主题

public abstract class KafkaSubject {
    public static long timestamp = 0;

    @Autowired
    private List<KafkaObserver> list = new ArrayList<>();

    public KafkaSubject(){

    }

    public KafkaSubject(KafkaObserver observer){
        this.list.add(observer);
    }

    public void register(KafkaObserver observer){
        this.list.add(observer);
    }

    public void remove(KafkaObserver observer){
        this.list.remove(observer);
    }

    public void notifyObserve(String message, String... observerNames){
    	//支持广播与点对点消息发布、推送
        timestamp = System.currentTimeMillis();
        if (observerNames != null && observerNames.length > 0){
            for (KafkaObserver observer : list) {
                for (String observerName : observerNames) {
                    if (observerName.equals(observer.observerName())){
                        //点对点推送消息
                        observer.update(message);
                    }
                }
            }
        }else{
            for (KafkaObserver observer : list) {
                //广播推送消息
                observer.update(message);
            }
        }
    }
}

3.1.1 具体消息主题

@Slf4j
@Component
public class MessageSubject extends KafkaSubject {

    @KafkaListener(topicPartitions = {@TopicPartition(topic = "topic1", partitions = {"0"})},groupId = "test",containerFactory="factory")
    public void chinaunicomCInterface(String message,ConsumerRecord<?, ?> record) {
	    log.info("收到kafka消息通知,主题topic = {},分区partition = {}",record.topic(),record.partition());
        notify(message,record);
    }

    private void notify(String message,ConsumerRecord<?, ?> record){
        
        if (StringUtils.isNotBlank(message)){
            //通知所有Service
            super.notifyObserve(message);
        }
    }
}

3.2 抽象观察者

public interface KafkaObserver {

    default String observerName(){
        return this.getClass().getSimpleName();
    }

    void update(String message);
}

3.2.1 具体观察者 - Topic1

public class Topic1Observer implements KafkaObserver {
    @Override
    public void update(String message) {
        if (StringUtils.isNotBlank(message)) {
            log.info("topic1收到订阅消息:{}",message);
        }
    }
}

3.2.2 具体观察者 - Topic2

public class Topic2Observer implements KafkaObserver {
    @Override
    public void update(String message) {
        if (StringUtils.isNotBlank(message)) {
            log.info("topic2收到订阅消息:{}",message);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值