Я довольно новичок в весне и весенней интеграции.Что я пытаюсь сделать: публиковать сообщения mqtt, используя интеграцию Spring.
Вот код:
@Configuration
@IntegrationComponentScan
@Service
public class MQTTPublishAdapter {
private MqttConfiguration mqttConfiguration;
public MQTTPublishAdapter(MqttConfiguration mqttConfiguration) {
this.mqttConfiguration = mqttConfiguration;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new PublishSubscribeChannel();
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new
DefaultMqttPahoClientFactory();
//... set factory details
return factory;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MQTTCustomMessageHandler mqttOutbound() {
String clientId = UUID.randomUUID().toString();
MQTTCustomMessageHandler messageHandler =
new MQTTCustomMessageHandler(clientId, mqttClientFactory());
//...set messagehandler details
return messageHandler;
}
//I extend this only because the publish method is protected and I want to
send messages to different topics
public class MQTTCustomMessageHandler extends MqttPahoMessageHandler {
//default constructors
public void sendMessage(String topic, String message){
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(message.getBytes());
try {
super.publish(topic, mqttMessage, null);
} catch (Exception e) {
log.error("Failure to publish message on topic " + topic,
e.getMessage());
}
}
}
Здесь я пытаюсь ввести обработчик
@Service
public class MQTTMessagePublisher {
private MQTTCustomMessageHandler mqttCustomMessageHandler;
public MQTTMessagePublisher(@Lazy MQTTCustomMessageHandler
mqttCustomMessageHandler) {
this.mqttCustomMessageHandler = mqttCustomMessageHandler;
}
public void publishMessage(String topic, String message) {
mqttCustomMessageHandler.sendMessage(topic, message);
}
}
Так что мой вопрос о том, как мне вводитьbean-компонент, который я пытаюсь использовать, потому что, если я удаляю аннотацию @Lazy, он говорит, что «запрашиваемый bean-компонент находится в процессе создания: существует неразрешимая циклическая ссылка?».У меня нет циклических зависимостей, так как в bean-компоненте я устанавливаю только несколько строк, так что, полагаю, я не совсем понимаю, как это должно работать.
Очень сожалею о форматировании, это одна из моихПервые вопросы здесь.
Редактировать:
Если я удаляю
@ServiceActivator(inputChannel = "mqttOutboundChannel")
и добавляю
messageHandler.setChannelResolver((name) -> mqttOutboundChannel());
, это работает.Мне до сих пор неясно, почему происходит сбой кода.