Search code examples
javaspringannotationsmqttsubscribe

Which Spring Annotation use with the messageArrived from MQTTCallBack


I'm new to Spring, and I'm trying to insert data into my MySQL from the information received by MQTT.

I created my application with the following code.

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

        ProductionSubscribe();
    }

With the method

    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();
        }
    }

So, I implemented 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");
    }
}

Everything is going well until call the method messageArrived. My service machineService is null, and dont can call services

If I use REST controllers, my services works well... But I don't know which annotations to use in this case with MQTT, so I can call my services.

Thanks,


Solution

  • Just implement CommandLineRunner in principal class. Result:

    public class MqttServiceApplication extends SpringBootServletInitializer implements AsyncConfigurer, CommandLineRunner {
    
        @Autowired
        ProductionCallBack productionCallBack;
    
        @Override
        public void run(String... args) throws Exception {
            ProductionSubscribe();
        }
    
    }