2015-05-08 3 views
3

Я новичок в Римане и Клоюре. Все, что я хочу сделать, - отправить уведомления по электронной почте трем группам электронной почты, когда истекает срок действия TTL. Я создал какое-то конфигурационный файл, в котором я храню список писем:clojure.lang.LazySeq нельзя отнести к clojure.lang.IFn

{ 
    :email_group_1 (
        "[email protected]" 
        "[email protected]" 
       ) 
    :email_group_2 (
        "[email protected]" 
       ) 
} 

Моего риманов конфигурация выглядит следующим образом:

(logging/init {:console true}) 
(import org.apache.log4j.Level) 
(logging/set-level Level/DEBUG) 

(require '[clojure.java.io :as io]) 
(import '[java.io PushbackReader]) 

(let [host "0.0.0.0"] 
    (tcp-server {:host host :port 60001}) 
    (udp-server {:host host}) 
    (ws-server {:host host :port 60003})) 
(repl-server {:host "127.0.0.1"}) 

(def cwd (System/getProperty "user.dir")) 

(def emails 
    (with-open [r (io/reader (str cwd "/etc/emails.clj"))] 
      (read (PushbackReader. r)))) 

(periodically-expire 5) 

(def email (mailer)) 

(defn notify [& egroups] 
    (for [egroup egroups] 
    (rollup 1 60 (apply email (emails egroup))))) 

(let [index (index)] 
    (streams 
    (default :ttl 60 
     index 

     (expired 
      (where (service "service_connect_active") 
        #(info "expired" %) 
        (notify :email_group_1 :email_group_2)))))) 

Код выглядит хорошо (для меня), но когда эта услуги expired Я получаю следующую ошибку:

09:45:39 riemann.1  | INFO [2015-05-08 10:45:39,313] Thread-5 - riemann.config - expired {:ttl 60, :time 357766884827/250, :state expired, :service service_connect_active, :host ava.local} 
09:45:39 riemann.1  | WARN [2015-05-08 10:45:39,319] Thread-5 - riemann.config - [email protected] threw 
09:45:39 riemann.1  | java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IFn 
09:45:39 riemann.1  | at riemann.config$eval66$stream__70$fn__75.invoke(riemann.development.config:34) 
09:45:39 riemann.1  | at riemann.config$eval66$stream__70.invoke(riemann.development.config:45) 
09:45:39 riemann.1  | at riemann.streams$match$stream__3514$fn__3525.invoke(streams.clj:1209) 
09:45:39 riemann.1  | at riemann.streams$match$stream__3514.invoke(streams.clj:1209) 
09:45:39 riemann.1  | at riemann.streams$default$stream__3731$fn__3742.invoke(streams.clj:1328) 
09:45:39 riemann.1  | at riemann.streams$default$stream__3731.invoke(streams.clj:1328) 
09:45:39 riemann.1  | at riemann.core$stream_BANG_$fn__4415.invoke(core.clj:19) 
09:45:39 riemann.1  | at riemann.core$stream_BANG_.invoke(core.clj:18) 
09:45:39 riemann.1  | at riemann.core$reaper$worker__4529$fn__4539.invoke(core.clj:303) 
09:45:39 riemann.1  | at riemann.core$reaper$worker__4529.invoke(core.clj:297) 
09:45:39 riemann.1  | at riemann.service.ThreadService$thread_service_runner__1973$fn__1974.invoke(service.clj:71) 
09:45:39 riemann.1  | at riemann.service.ThreadService$thread_service_runner__1973.invoke(service.clj:70) 
09:45:39 riemann.1  | at clojure.lang.AFn.run(AFn.java:22) 
09:45:39 riemann.1  | at java.lang.Thread.run(Thread.java:745) 

Может кто-то мне помочь? Благодарю.

+0

Откуда возникает функция почтовой программы из вашей конфигурации Riemann? – tnoda

+1

@tnoda mailer является публичной переменной Riemann. Дополнительная информация здесь [http://riemann.io/api/riemann.email.html#var-mailer](http://riemann.io/api/riemann.email.html#var-mailer) –

ответ

2

«не может быть приведен к clojure.lang.IFn» ошибка неизменно указывает на то, что ожидает функция отдается то, что не может рассматриваться как таковые ...

(defn notify [& egroups] 
    (for [egroup egroups] 
    (rollup 1 60 (apply email (emails egroup))))) 

Это возвращающего для -генерированный LazySeq потоков сворачивания, а не фактический поток (в Riemann поток - это IFn). Поэтому, когда Риман пытается вызвать поток как IFn вашей ошибку ...

Как о чем-то вроде:

(defn notify [& egroups] 
    (rollup 1 60 (apply email (mapcat emails egroups)))) 

Здесь мы просто преобразовать список групп в список писем авансового и затем получить с нашей жизнью.

В качестве альтернативы, если вы действительно хотите несколько потоков (избегая разделяемых строк: например,), примените их к накопительному пакету.

(defn notify [& egroups] 
    (apply rollup 1 60 (map email (map emails groups)))) 

Надеюсь, что это поможет, у меня, очевидно, нет всей вашей конфигурации.

+1

Я так жаль :) Я никогда не задавал вопросов в StackOverflow, поэтому я не знал некоторых правил. Поскольку у меня слишком маленькая репутация сайта, я не могу проголосовать за ваш ответ: (Но я очень ценю вашу помощь! –

Смежные вопросы