-
Notifications
You must be signed in to change notification settings - Fork 28
Interceptors
On slacker server, you can configure interceptors to add custom, additional functions. Each interceptor receives a request map contains information about the function call. You can read / update / add data to this map and pass it to next interceptor (or server handler).
Slacker ships some predefined interceptors which is common used.
-
slacker.interceptors.stats/function-call-statsis a statistic on how many times each function called via slacker server. The data is exposed via JMX, which you can view with tools like jconsole. -
slacker.interceptors.exectime/exectime-statssummarize call time of most recent 50 calls of each function, and expose via JMX. -
slacker.interceptors.slowwatchdog/slow-watch-doglogs slow function calls and arguments. -
slacker.interceptors.logargs/logargslogs arguments that causes a server side exception.
To add interceptors, using the option :interceptors when you start slacker server.
(start-slacker-server (the-ns 'slapi) 2104
:interceptors logging-interceptor)If you have multiple interceptors, you should combine them with macro slacker.interceptor/interceptors.
(start-slacker-server (the-ns 'slapi) 2104
:interceptors (interceptors logging-interceptor another-interceptor))You are encouraged to write interceptors for your own needs. Slacker has two macros definterceptor and definterceptor+ for interceptor development.
A practical example of the usage:
(definterceptor logging-interceptor
:before (fn [req] (println (str "calling " (:fname req))) req)
:after (fn [req] (println (str "called " (:fname req))) req))Currently, there are two stages :before and :after to intercept the request processing. You can define interceptor for both of them or either one.
definterceptor+ allows you to use arguments to configure interceptors when using it. A code example:
(definterceptor+ logging-interceptor2 [prefix]
:before (fn [req] (println (str prefix "calling " (:fname req))) req)
:after (fn [req] (println (str prefix "called " (:fname req))) req))
(start-slacker-server .... :interceptors (interceptors (logging-interceptor2 "=>>")))You may have more practical example instead :-)
Attributes of the request object available to interceptors are :
- before
-
:content-typecontent type of the request -
:fnamefunction name of the call, as string -
:funcfunction of the call -
:argsa vector of arguements -
:clientclient connection information
-
- after
-
:resultthe data returned by the function call -
:coderesult code.:success,:exceptionor:not-found
-
You are free to add your own properties to request by assoc new key-value pairs to it.