Connected ve disconnected
Controller hook’larını doğru scope ve cancellation fazlarıyla kullanın; disconnected uygunluğunu başarılı connected sonucuna bağlayın.
Controller lifecycle hook'ları bağlantı başına domain davranışını toplar. Presence kaydı veya uygulamaya ait bağlantı takibi için kullanılabilir. Genel bağlantı politikasını tekrar kullanmak istiyorsanız connection middleware uygundur.
Hook’ları yazın#
Örneği src/lifecycle.rs olarak ekleyip crate kökünden dahil edin:
use std::sync::Arc;
use lilyrs::websocket::{CleanupCancellation, DisconnectReason, ExecutionCancellation,
Extensions, WebSocketContext, WebSocketController, WebSocketControllerInitError,
WebSocketControllerTrait, WebSocketLifecycleError, async_trait, websocket_controller};
#[derive(WebSocketController)]
#[namespace("presence")]
struct PresenceController;
#[async_trait]
impl WebSocketControllerTrait for PresenceController {
async fn new(_: Arc<Extensions>) -> Result<Self, WebSocketControllerInitError> { Ok(Self) }
}
#[websocket_controller]
impl PresenceController {
#[connected]
#[timeout(seconds = 5)]
async fn connected(&self, _: WebSocketContext, stopping: ExecutionCancellation)
-> Result<(), WebSocketLifecycleError>
{
if stopping.is_cancelled() {
return Err(WebSocketLifecycleError::rejected("CONNECT_STOPPED"));
}
Ok(()) // Bu başarı disconnected callback'ini uygun hale getirir.
}
#[disconnected]
#[timeout(seconds = 5)]
async fn disconnected(&self, _: WebSocketContext, reason: DisconnectReason,
cleanup: CleanupCancellation) -> Result<(), WebSocketLifecycleError>
{
let _ = (reason, cleanup.is_cancelled());
// Presence kaydını idempotent ve bounded bir servisle temizleyin.
Ok(())
}
}Her hook kendi DI invocation scope'unu kullanır. connected sırasında çözülen Scoped servis disconnected sırasında yeniden kullanılmaz. Gereken owned bağlantı verisini uygun context sınırında saklayın; servis Arc'ını scope dışına taşımayın.
Disconnected ne zaman çalışır?#
connected gerçekten çağrılıp Ok(()) döndüğünde disconnected yükümlülüğü doğar. Yalnızca disconnected tanımlamak her disconnect'te çalışacağını garanti etmez. İşiniz yoksa örnekteki gibi başarılı bir no-op connected yeterlidir.
Bu başarı connected scope disposal'ı beklenmeden kaydedilir. Daha sonra disposal hatası oluşması callback'in başarılı dönüşünü hiç olmamış saymaz. Cleanup kodu bu tür kısmi durumları idempotent ele almalıdır.
Execution ve cleanup#
connected execution fazındadır ve ExecutionCancellation alabilir. disconnected cleanup fazındadır ve CleanupCancellation alır. Ters fazdaki tipler compile-time reddedilir. Lifecycle hook'ları payload consumer alamaz ve Result<(), WebSocketLifecycleError> döndürür.
Controller timeout'u mesaj default'udur; lifecycle hook süresi kendi attribute'u veya connection_lifecycle_timeout_secs üzerinden seçilir. Cleanup sinyali başka işi iptal ettirme yetkisi vermez. Eski Cancellation adı execution alias'ıdır; yeni örneklerde kullanılmaz.
Kapanan bağlantıya gönderim#
Disconnected çalışırken caller socket terminal durumdadır. Caller'a send başarısı beklemeyin. Başka sağlıklı bağlantıya bounded bildirim denenebilir, fakat kaynak temizliğini bu bildirimin teslimine bağlamayın.
Örnekteki presence temizliği açıklama satırıdır; gerçek store ve cleanup uygulamasını siz eklersiniz. Yarım kalabilen callback'leri, süre aşımını ve shutdown sonucunu test edin.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.