Инъекция бина для обработчика сообщений весенней интеграции - PullRequest
0 голосов
/ 19 февраля 2019

Я довольно новичок в весне и весенней интеграции.Что я пытаюсь сделать: публиковать сообщения 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());

, это работает.Мне до сих пор неясно, почему происходит сбой кода.

1 Ответ

0 голосов
/ 19 февраля 2019

Вы показываете много пользовательских кодов, но не все из них.Очень сложно отвечать на вопросы, где это только пользовательский код.Было бы здорово поделиться как можно большей информацией.Например, внешний проект на GitHub, позволяющий нам воспроизводить и воспроизводить, был бы полностью полезен и сэкономил бы некоторое время.

Тем не менее, мне интересно, какой у вас MQTTCustomMessageHandler.Однако я предполагаю, что это не MessageHandler реализация.Отсюда аннотация @ServiceActivator не будет работать должным образом, поскольку она действительно применяется для mqttOutbound(), а не того, что вы ожидаете.Или вам нужно переместить эту аннотацию к вашему sendMessage() методу в MQTTCustomMessageHandler или использовать его как MessageHandler.

С другой стороны, неясно, зачем вам вообще нужна эта аннотация @ServiceActivator, поскольку вы вызываете этот метод вручную из MQTTMessagePublisher.

Также не понятно, почему выУ вас так много пользовательского кода, когда Framework предоставляет ваши готовые реализации адаптера канала.

Слишком много вопросов к вашему коду, чем возможный ответ ...

См. дополнительную информацию вСправочное руководство:

https://docs.spring.io/spring-integration/docs/current/reference/html/#annotations

https://docs.spring.io/spring-integration/docs/current/reference/html/#mqtt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...