最近 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)
送信処理...)
- Lisp, the Universe and Everything: cl-redis: Separation of Concerns in Library Design
- ``Condition Handling in the Lisp Language Family'' c by Kent Pitman (2001)
このあたりを読んで、勉強しましょ。
0 件のコメント:
コメントを投稿