UCJava
UCJava

Reputation: 307

Camel MQTT Configuration options DSL route URL parameter with bean value not working

I ma trying to test pub/sub from an external broker ( AWs IoT ); started off of the camel-example-spring-boot example project and added thecamel-mqtt-starter. Everything seems to work fine until I try to define the mqtt routes. I am having issues with configuring the sslContext url parameter :

@Configuration
public class AppConfig {


@Bean(name="awsiotsslcontext")
SSLContext awsiotsslcontext(){

    SSLContext sslContext = null;
    try{
        ClassLoader cl = this.getClass().getClassLoader();
        InputStream is = cl.getResourceAsStream("/cert/myApp.cert.pem");
        // You could get a resource as a stream instead.

        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        X509Certificate caCert = (X509Certificate)cf.generateCertificate(is);

        TrustManagerFactory tmf = TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

        ks.load(null); // You don't need the KeyStore instance to come from a file.
        ks.setCertificateEntry("caCert", caCert);

        tmf.init(ks);

        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);
    } catch (Exception e){

    }
    return sslContext;
}
}

And then in my route builder :

@Component
public class SampleCamelRouter extends RouteBuilder {

@Autowired
SSLContext awsiotsslcontext;

@Override
public void configure() throws Exception {

    from("timer://foo?repeatCount=0&delay=5000&fixedRate=true&period=10s")
        .setBody(simple("TEST MESSAGE"))
        .to("mqtt:awsiot?host=ssl://{{aws.iot.host}}:8883&publishTopicName={{aws.iot.sub.topic}}&sslContext=#awsiotsslcontext").log("Sent :"+body().convertToString().toString());

    from("mqtt:awsiot?host=ssl://{{aws.iot.host}}:8883&subscribeTopicName={{aws.iot.sub.topic}}&sslContext=#awsiotsslcontext").log("Recieved : "+body().convertToString().toString());




}

}

getting the following error :

java.lang.IllegalArgumentException: Could not find a suitable setter for property: sslContext as there isn't a setter method with same type: java.lang.String nor type conversion possible: No type converter available to convert from type: java.lang.String to the required type: javax.net.ssl.SSLContext with value #awsiotsslcontext

I believe this is a simple endpoint configuration issue, but tried various things and nothing seems to work. Having the # with the bean name should have camel to look up in the registry for the bean but here it recognizes it as String ? Any workaround here ?

Upvotes: 0

Views: 524

Answers (1)

UCJava
UCJava

Reputation: 307

This was an issue on camel route configuration; when I configured my route under a @Configuration instead of having under @Component as suggested by the documentation, it doesn't complain about bean definition with '#' in the URI; I would expect in a Spring Boot Application the beans would load before the routes by default:

    @Bean
    RouteBuilder awsIoTRoute() {

        return new RouteBuilder() {

            @Override
            public void configure() throws Exception {

                from("timer://foo?repeatCount=0&delay=5000&fixedRate=true&period=17s")
                    .setBody(simple("TEST MESSAGE"))
                    .to("mqtt:awsIoTPublisher?host=ssl://{{aws.iot.host}}:8883&publishTopicName={{aws.iot.pub.topic}}&clientId={{aws.iot.pub.clientId}}&sslContext=#sslContext")
                    .log("Sent :"+body().convertToString().toString());

                from("mqtt:awsIoTReciever?host=ssl://{{aws.iot.host}}:8883&subscribeTopicName={{aws.iot.sub.topic}}&clientId={{aws.iot.sub.clientId}}&sslContext=#sslContext").log("Recieved : "+body().convertToString());


            }
        };
    }

Upvotes: 0

Related Questions