一、Java实现发布订阅、消息推送
二、定义Java观察者模式 - 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);
}
}
}