DRbObject не является DRbUndumped
Что это значит? Это значит, что если мы передаем посредством dRuby из процесса A процессу B объект, принадлежащий процессу C, при работе с ним B будет обращаться непосредственно к C. Если сможет, конечно, ведь легко может статься, что и B и C имеют доступ к A, но не имеют друг к другу. Тогда получим исключение.
Впрочем, нет никаких проблем заставить A проксировать этот объект для B: obj.extend(DRbUndumped)
на стороне A — и дело в шляпе.
Как проверить доступность DRbObject?
Встроенного метода, проверяющего, что объект DRbObject
в действительности живой и готов к работе, почему-то нет. Но его легко написать:
class DRb::DRbObject def available? self.respond_to? :class rescue DRb::DRbConnError false end end
Здесь мы пользуемся тем, что: а) DRb::DRbObject#respond_to?
всегда обращается к удаленному объекту, а не проверяет сам себя; б) метод class
определен у каждого объекта, т.е. при доступности вызов вернет true
; и в) при недоступности генерируется вполне конкретное исключение.
Это все, может быть, неочевидное, но вполне нормальное поведение. А вот следующее наблюдение мне представляется багом...
К какому сервису относится объект?
Предположим, у нас один процесс поднимает несколько сервисов DRb. Ну, например, один основной на TCP, а второй — управляющий на UnixSockets (см. мой гем
drctrl
). А затем обращается по DRb куда-то наружу и передает туда undumped-объект... Так вот: объект этот будет привязан не к тому протоколу, по которому идет обращение, а к последнему запущенному сервису.
Чтобы это исправить, нужно вручную выставить свойство DRb::primary_server
... Впрочем, в своем геме я сегодня это учел и исправил.
Комментариев нет:
Отправить комментарий