Какую аннотацию Spring использовать с сообщением, полученным из MQTTCallBack - PullRequest
0 голосов
/ 10 февраля 2020

Я новичок в Spring и пытаюсь вставить в свой MySQL данные из информации, полученной MQTT.

Я создал свое приложение со следующим кодом.

    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext context = SpringApplication.run(MqttServiceApplication.class, args);
        context.registerShutdownHook();

        ProductionSubscribe();
    }

С помощью метода

    public static void ProductionSubscribe() {
        try {
            IMqttClient client = new MqttClient("tcp://192.168.0.201:1883", new Date().getTime() + "");
            client.connect();

            ProductionCallBack productionCallBack = new ProductionCallBack();
            client.setCallback(productionCallBack);

            client.subscribe("/InputCounter/#");
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

Итак, я реализовал MqttCallback


@Component
public class ProductionCallBack implements MqttCallback {

    @Autowired
    private MachineService machineService;

    @Override
    public void connectionLost(Throwable throwable) {
        System.out.println(throwable);
    }

    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
        String name = s.replace("/InputCounter/", "").split("/")[0];
        Date now = new Date();

        EasyIOModel easyIOModel = new ObjectMapper().readValue(mqttMessage.toString(), EasyIOModel.class);

        // Get Machine
        Machine machine = machineService.getMachineByNameAndInputNumber(easyIOName);
        if (machine == null) {
            System.out.println("Error.");
        }
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        System.out.println("deliveryComplete");
    }
}

Все идет хорошо до вызова метода messageArrived. Мой сервис machineService имеет значение null и не может вызывать сервисы

Если я использую контроллеры REST, мои сервисы работают хорошо ... Но я не знаю, какие аннотации использовать в этом случае с MQTT, поэтому я могу позвонить мои услуги.

Спасибо,

1 Ответ

0 голосов
/ 10 февраля 2020

Просто внедрите CommandLineRunner в основной класс. Результат:

public class MqttServiceApplication extends SpringBootServletInitializer implements AsyncConfigurer, CommandLineRunner {

    @Autowired
    ProductionCallBack productionCallBack;

    @Override
    public void run(String... args) throws Exception {
        ProductionSubscribe();
    }

}
...