2013/02/10

restart-bind とか使ってカッコよく再接続したいのだけど

最近 Common Lisp で MongoDB のドライバを書いたりしている。

restart-bind とか使ってカッコよく再接続したいのだけど、 try catch のエラーハンドリングから生長できない・・・

(defmacro with-reconnect-around (connection &key (max-retry-count 10) (retry-sleep 3))
(let ((retry-count (gensym "retry-count")))
`(loop for ,retry-count from 0
do (handler-case (progn
(unless (zerop ,retry-count)
(establish-connection ,connection))
(return (call-next-method)))
(error (e)
(when (< ,max-retry-count ,retry-count)
(signal e))
(warn "reconnecting... ~a" e)
(sleep ,retry-sleep)
(close ,connection))))))

(defmethod send :around ((self replica-set) op size function)
(with-reconnect-around self))

(defmethod send ((connection connection) op size function)
送信処理...)

このあたりを読んで、勉強しましょ。