Я создал весенний отдых, то есть клиент брокера MQTT.
Я настраиваю, и это работает, но я хочу изменить код, чтобы его было легко читать и поддерживать.
Это мой текущий код:
Слушатель:
public class MqttMessageListener implements MessageHandler {
private final List<MqttMessageHandler> mqttMessageHandlers;
public MqttMessageListener(List<MqttMessageHandler> mqttMessageHandlers) {
this.mqttMessageHandlers = mqttMessageHandlers;
}
@Override
public void handleMessage(Message<?> message) {
MqttMessageHandler handler = mqttMessageHandlers.stream()
.filter(handleMessage -> handleMessage.canHandle(message))
.findFirst()
.orElseThrow(() -> new MqttMessageHandleException("Have no handler for this message in system"));
handler.handleMessage(message);
}
}
Общий интерфейс обработчика:
public interface MqttMessageHandler {
void handleMessage(Message<?> message);
boolean canHandle(Message<?> message);
}
Абстрактный обработчик
public abstract class AbstractMqttMessageHandler implements MqttMessageHandler {
private DeviceModel deviceModel;
protected AbstractMqttMessageHandler(DeviceModel deviceModel) {
this.deviceModel = deviceModel;
}
@Override
public boolean canHandle(Message<?> message) {
return message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC).toString().contains(this.deviceModel.getModel());
}
}
Обработчик реализации
@Component
public class ShellyHTMessageHandler extends AbstractMqttMessageHandler {
protected ShellyHTMessageHandler() {
super(DeviceModel.HT);
}
@Override
public void handleMessage(Message<?> message) {
System.out.println("ShellyHTMessageHandler");
}
}
@Component
public class ShellySmokeMessageHandler extends AbstractMqttMessageHandler {
protected ShellySmokeMessageHandler() {
super(DeviceModel.SMOKE);
}
@Override
public void handleMessage(Message<?> message) {
System.out.println("ShellySmokeMessageHandler");
System.out.println(message);
}
}
Код выше работает хорошо. Но я хочу изменить код на что-то вроде:
@Component
@MyAnnotation(topic="ShellyHT_regex")
public class ShellyHTMessageHandler {
public void handleMessage(Message<?> message) {
System.out.println("ShellyHTMessageHandler");
}
}
есть предложения? Спасибо