2016-08-04 8 views
0

Ich habe zwei jdbc Abschnitte in meiner Konfig gemacht, aber ich möchte immer zuerst actionA und dann actionB ausführen, es ist wichtig für mich. Wie kann ich das machen?Logstash sequentielle Thread-Ausführung Fluss

Hier ist meine config:

input { 
    jdbc { 
     type => "actionA" 
     jdbc_validate_connection => true 
     jdbc_connection_string => "jdbc:oracle:thin:@mycomp:1522/db1" 
     ... 
     statement => "SELECT ID FROM my_table WHERE delete='Y'" 
     } 

    jdbc { 
     type => "actionB" 
     jdbc_validate_connection => true 
     jdbc_connection_string => "jdbc:oracle:thin:@mycomp:1522/db1" 
     ... 
     statement => "UPDATE my_table SET delete='T' WHERE delete='Y'" 
     } 
} 
output { 
    stdout { codec => rubydebug } 
    if [type] == "actionA" { 
     elasticsearch { 
      action => "delete" 
      index => "contacts" 
      document_type => "contact" 
      document_id => "%{id}" 
      hosts => ["http://localhost:9200"] 
     } 
    } 
    if [type] == "actionB" { } 


} 

Vielen Dank im Voraus

Jay

Antwort

0

Sie können die schedule Parameter nutzen und actionA immer vor actionB laufen lassen, z.B. indem actionA Lauf jeder geraden Minuten (0, 2, 4, 6, ...) und Lauf actionB jede ungerade Minuten (1, 3, 5, ...)

input { 
    jdbc { 
     type => "actionA" 
     jdbc_validate_connection => true 
     jdbc_connection_string => "jdbc:oracle:thin:@mycomp:1522/db1" 
     ... 
     schedule => "*/2 * * * *" # run every even minutes 
     statement => "SELECT ID FROM my_table WHERE delete='Y'" 
     } 

    jdbc { 
     type => "actionB" 
     jdbc_validate_connection => true 
     jdbc_connection_string => "jdbc:oracle:thin:@mycomp:1522/db1" 
     ... 
     schedule => "1-59/2 * * * *" # run every odd minutes 
     statement => "UPDATE my_table SET delete='T' WHERE delete='Y'" 
     } 
} 
+0

Es ist eine gute Variante und ich habe darüber nachgedacht. Aber wenn SELECT aus irgendeinem Grund mehr Zeit braucht? Wie sicher ist diese Lösung? Vielleicht ist es möglich, auf die Ausführung der Aktion A zu warten? – Frank

+0

Sie können das Delta zwischen beiden Aktionen immer erhöhen. Wie oft brauchst du sie sowieso? – Val

+0

Ich muss es jede Stunde laufen. Aber ich denke, es ist keine Unternehmenslösung, weil es keine Garantie dafür gibt, dass actionB immer nach actionA durchgeführt wird. Tatsächlich wird actionA in den meisten Situationen sehr schnell laufen und es ist keine gute Idee, z.B. 10 Minuten für ActionB. Ich denke, die beste Lösung wird ein Skript sein, das auf die Beendigung von actionA wartet und dann actionB startet und dieses Skript mit Hilfe von CRONE startet. – Frank

0

es einen Trick dafür ist, .

Legen Sie Ihre Aktionen in separaten Dateien, so dass jede Datei sieht wie folgt aus:

# action_X.conf 
input { 
    jdbc { 
     # ... 
    } 
} 
output { 
    # ... 
} 

Dann logstash ausführen manuell für jede Datei:

logstash -f action_a.conf 
logstash -f action_b.conf 

Um in regelmäßigen Abständen wiederholen Sie die oben genannten Befehle setzen könnte in einem Shell-Skript und fügen dieses Skript der crontab hinzu.