2017-08-08 2 views
0

Je tente de tester pub/sub à partir d'un courtier externe (AWs IoT); début du projet d'exemple camel-exemple-spring-boot et ajout de thecamel-mqtt-starter. Tout semble fonctionner correctement jusqu'à ce que j'essaie de définir les routes mqtt. J'ai des problèmes avec la configuration du paramètre url SSLContext:Camel MQTT Options de configuration Paramètre d'URL de route DSL avec valeur de bean ne fonctionnant pas

@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; 
} 
} 

Et puis dans mon constructeur de route:

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




} 

} 

obtenir l'erreur suivante:

java.lang.IllegalArgumentException: Could pas trouver un setter approprié pour la propriété: sslContext car il n'y a pas de méthode setter avec le même type: java.lang.String ou conversion de type possible: No typ e convertisseur disponible pour convertir le type: java.lang.String au type requis: javax.net.ssl.SSLContext avec la valeur #awsiotsslcontext

Je crois que c'est une simple question de configuration des terminaux, mais a essayé divers les choses et rien ne semble fonctionner. Avoir le # avec le nom du haricot devrait avoir camel pour rechercher dans le registre pour le bean mais ici il le reconnaît comme chaîne? Une solution de contournement ici?

Répondre

0

Cela a été un problème sur la configuration de route de chameau; lorsque j'ai configuré mon itinéraire sous une @Configuration au lieu d'avoir @Component comme suggéré par la documentation, il ne se plaint pas de la définition du bean avec '#' dans l'URI; Je m'attendrais à ce que dans une application Spring Boot les beans se chargent avant les routes par défaut:

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


      } 
     }; 
    }