MqttHandlerManager.java 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package com.szwl.manager;
  2. import com.szwl.handle.*;
  3. import org.springframework.stereotype.Component;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Optional;
  8. /**
  9. * 策略管理器
  10. */
  11. @Component
  12. public class MqttHandlerManager {
  13. private final Map<String, MqttMessageHandler> handlerMap = new HashMap<>();
  14. public MqttHandlerManager(List<MqttMessageHandler> handlers) {
  15. // 手动映射主题到处理器
  16. handlerMap.put("connected", findHandler(handlers, ConnectedMessageHandler.class));
  17. handlerMap.put("disconnected", findHandler(handlers, DisconnectedMessageHandler.class));
  18. handlerMap.put("heart", findHandler(handlers, HeartMessageHandler.class));
  19. handlerMap.put("response", findHandler(handlers, ResponseMessageHandler.class));
  20. }
  21. public void dispatch(String topic, String payload) {
  22. Optional<Map.Entry<String, MqttMessageHandler>> handlerEntry = handlerMap.entrySet().stream()
  23. .filter(entry -> topic.matches(entry.getKey())) // 通过正则匹配主题
  24. .findFirst();
  25. if (handlerEntry.isPresent()) {
  26. handlerEntry.get().getValue().handle(topic, payload);
  27. } else {
  28. System.out.printf("No handler found for topic [%s]%n", topic);
  29. }
  30. }
  31. private MqttMessageHandler findHandler(List<MqttMessageHandler> handlers, Class<?> clazz) {
  32. return handlers.stream()
  33. .filter(handler -> clazz.isAssignableFrom(handler.getClass()))
  34. .findFirst()
  35. .orElseThrow(() -> new IllegalArgumentException("No handler found for: " + clazz.getName()));
  36. }
  37. }