2017-12-20 4 views
1

Ich versuche eine SMS über Apache Camel mit der camel-twilio component zu senden. Da ich die Twilio API nie benutzt habe (weder nativ noch mit Apache Camel), bin ich mir nicht sicher, ob ich die Parameter richtig verstanden habe. Hier ist die Methode, die ich schrieb:Apache Camel: Sende Textnachricht mit Twilio

/** 
* Sends a text message to the given recipient's number (parameter to) 
* 
* @param username: 
*   Twilio username (email) 
* @param password: 
*   Twilio password (in plain text) 
* @param accountSid: 
*   Twilio account sid (from the dashboard) 
* @param from: 
*   registered phone number (starting with country prefix +XX) 
* @param to: 
*   the recipient's phone number (starting with country prefix +XX) 
* @param message: 
*   the message to be sent (plain text) 
* @throws Exception 
*/ 
public static void sendTextMessage(String username, String password, String accountSid, String from, String to, 
     String message) throws Exception { 
    String route = String.format("twilio:message/creator?username=%s&password=%s&accountSid=%s&from=%s&to=%s", 
      username, password, accountSid, from, to); 
    CamelContext context = new DefaultCamelContext(); 
    context.addRoutes(new RouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      from("direct:message").to(route); 
     } 
    }); 
    context.start(); 
    ProducerTemplate producer = context.createProducerTemplate(); 
    producer.sendBody("direct:message", message); 
    context.stop(); 
} 

Die wichtigste Zeile ist die Erstellung der Route, die erste der Methode. Wenn ich diese Methode renne mit Parametern der JavaDoc nach, bekomme ich diesen Fehler:

Caused by: org.apache.camel.RuntimeCamelException: Missing properties for creator, need one or more from [pathAccountSid, mediaUrl, messagingServiceSid, body] 

Also dachte ich, den Parameter messagingServiceSid, hinzufügen meine accountSid wieder Bereitstellung:

String route = String.format("twilio:message/creator?username=%s&password=%s&accountSid=%s&from=%s&to=%s&messagingServiceSid=%s", 
      username, password, accountSid, from, to, accountSid); 

Jetzt bekomme ich Diese Fehlermeldung:

Caused by: java.lang.IllegalArgumentException: No matching method for message/creator, with arguments [messagingServiceSid, from, to] 

Was mache ich falsch?

EDIT: Das sind meine Maven Abhängigkeiten:

<dependencies> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-core</artifactId> 
     <version>2.20.1</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-twilio</artifactId> 
     <version>2.20.1</version> 
    </dependency> 
</dependencies> 

EDIT 2: Die hier geändert und Arbeitsversion des Verfahrens:

/** 
* Sends a text message to the given recipient's number (parameter to) 
* 
* @param accountSid: 
*   Twilio account sid (from the dashboard) 
* @param authToken: 
*   Twilio auth token (from the dashboard) 
* @param from: 
*   registered phone number (starting with country prefix +XX) 
* @param to: 
*   the recipient's phone number (starting with country prefix +XX) 
* @param message: 
*   the message to be sent (plain text) 
* @throws Exception 
*/ 
public static void sendTextMessage(String accountSid, String authToken, String from, String to, String message) 
     throws Exception { 
    CamelContext context = new DefaultCamelContext(); 
    TwilioComponent twilio = context.getComponent("twilio", TwilioComponent.class); 
    twilio.getConfiguration().setUsername(accountSid); 
    twilio.getConfiguration().setPassword(authToken); 
    context.addRoutes(new RouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      from("direct:message") 
        .setHeader("CamelTwilioTo", constant(new PhoneNumber(to))) 
        .setHeader("CamelTwilioFrom", constant(new PhoneNumber(from))) 
        .setHeader("CamelTwilioBody", constant(message)) 
        .to("twilio://message/creator"); 

     } 
    }); 
    context.start(); 
    ProducerTemplate producer = context.createProducerTemplate(); 
    producer.sendBody("direct:message", message); 
    context.stop(); 
} 

Antwort

3

Ich muss sagen, dass effizient mit Kamel zu arbeiten Twilio, müssen Sie ein gutes Verständnis auf Twilio Java API haben. In Ihrem Fall, lassen Sie uns hier mit dem MessageCreator API vertraut:
https://www.twilio.com/docs/libraries/reference/twilio-java/7.17.0/com/twilio/rest/api/v2010/account/MessageCreator.html

das gesagt ist, vor allem, da die username (dh accountSid) und password sollte etwas in einem Kamel-Twilio Komponente geteilt sein, lassen Sie uns gesetzt sie an der Komponente:

TwilioComponent twilio = context.getComponent("twilio", TwilioComponent.class); 
twilio.getConfiguration().setUsername(username); 
twilio.getConfiguration().setPassword(password); 

(Beachten Sie die meiste Zeit der Twilio Benutzernamen und accoundSid auf dasselbe beziehen, so können Sie nur eine von ihnen.)

Sobald der Benutzername/Passwort sind eingerichtet, verwenden wir die MessageCreator. Der einfachste Konstruktor, den Sie verwenden können, wäre MessageCreator(PhoneNumber to, PhoneNumber from, String body), aber da to und fromPhoneNumber Instanzen sein müssen, ist es einfacher, sie als Camel-Nachrichtenheader an den Endpunkt zu übergeben, anstatt sie als Endpunktparameter in den Endpunkt-URI einzubetten. (Hinweis: Jeder der Kamel Twilio Endpunkt-Optionen können mit CamelTwilio Präfix in einem Nachrichten-Header zur Verfügung gestellt werden.)

Dies würde in etwa so aussehen wie folgt zusammen:

public void configure() throws Exception { 
     from("direct:message") 
      .setHeader("CamelTwilioTo", constant(new PhoneNumber(to))) 
      .setHeader("CamelTwilioFrom", constant(new PhoneNumber(from))) 
      .setHeader("CamelTwilioBody", constant(message)) 
      .to("twilio://message/creator"); 
    } 

Note, in diesem Moment, den Endpunkt URI kann so einfach wie twilio://message/creator sein.

Jetzt sollten Sie in der Lage sein, Texte an Twilio zu senden.

FYI, gibt es ein funktionierendes Beispiel für Kamel-Twilio mit Frühlings-Boot:
https://github.com/tadayosi/demo-camel-hawtio-springboot

+1

Wenn ich das Konto sid anstelle des Benutzernamens und der Auth-Token anstelle des Kennworts verwenden, es funktioniert! Ich danke dir sehr! –