pub struct BlockingManagedClient { /* private fields */ }Expand description
Blocking completion owner for one unified managed Tokio task.
This owner runs exactly one ManagedClient task on one dedicated OS thread
with its own current-thread Tokio runtime. Dropping a live owner requests a
graceful stop and synchronously joins that worker, so drop may block while
bounded managed cleanup completes.
Implementations§
Source§impl BlockingManagedClient
impl BlockingManagedClient
Sourcepub fn start(
config: ManagedClientConfig,
targets: Vec<ManagedTargetConfig>,
) -> Result<Self, BlockingManagedStartError>
pub fn start( config: ManagedClientConfig, targets: Vec<ManagedTargetConfig>, ) -> Result<Self, BlockingManagedStartError>
Validate configuration, create a dedicated runtime, and start its worker.
Sourcepub fn start_with_subscription(
config: ManagedClientConfig,
targets: Vec<ManagedTargetConfig>,
) -> Result<(Self, ManagedEventSubscription), BlockingManagedStartError>
pub fn start_with_subscription( config: ManagedClientConfig, targets: Vec<ManagedTargetConfig>, ) -> Result<(Self, ManagedEventSubscription), BlockingManagedStartError>
Validate configuration, subscribe to presentation events, and start a dedicated managed worker.
The returned subscription exists before the managed task receives its first poll, so it cannot miss startup events because of subscription ordering.
Examples found in repository?
27fn main() {
28 let config = ManagedClientConfig {
29 client: ClientConfig {
30 open: OpenPolicy {
31 timeouts: vec![Duration::from_millis(300)],
32 ..Default::default()
33 },
34 request: SessionRequest {
35 duration: None,
36 interval: Duration::from_millis(200),
37 ..Default::default()
38 },
39 ..Default::default()
40 },
41 completion: ManagedCompletionPolicy::ExplicitStop,
42 ..Default::default()
43 };
44 let targets = vec![ManagedTargetConfig::new("local", "127.0.0.1:2112")];
45
46 let (owner, mut events) = match BlockingManagedClient::start_with_subscription(config, targets)
47 {
48 Ok(started) => started,
49 Err(err) => {
50 eprintln!("failed to start managed client: {err}");
51 return;
52 }
53 };
54
55 let stop_after = Duration::from_secs(1);
56 let deadline = std::time::Instant::now() + stop_after;
57 while std::time::Instant::now() < deadline {
58 match events.try_recv() {
59 Ok(event) => print_event(&event),
60 Err(_) => std::thread::sleep(Duration::from_millis(50)),
61 }
62 }
63
64 // `stop()` requests the stop synchronously; the returned receipt is only
65 // useful for awaiting durable acknowledgement, which this blocking
66 // example does not need.
67 std::mem::drop(owner.handle().stop());
68 match owner.join() {
69 Ok(outcome) => println!("managed run ended: {:?}", outcome.end_reason),
70 Err(err) => eprintln!("managed worker did not join cleanly: {err}"),
71 }
72}Sourcepub fn handle(&self) -> ManagedClientHandle
pub fn handle(&self) -> ManagedClientHandle
Return a cloned managed control and observation capability.
Examples found in repository?
27fn main() {
28 let config = ManagedClientConfig {
29 client: ClientConfig {
30 open: OpenPolicy {
31 timeouts: vec![Duration::from_millis(300)],
32 ..Default::default()
33 },
34 request: SessionRequest {
35 duration: None,
36 interval: Duration::from_millis(200),
37 ..Default::default()
38 },
39 ..Default::default()
40 },
41 completion: ManagedCompletionPolicy::ExplicitStop,
42 ..Default::default()
43 };
44 let targets = vec![ManagedTargetConfig::new("local", "127.0.0.1:2112")];
45
46 let (owner, mut events) = match BlockingManagedClient::start_with_subscription(config, targets)
47 {
48 Ok(started) => started,
49 Err(err) => {
50 eprintln!("failed to start managed client: {err}");
51 return;
52 }
53 };
54
55 let stop_after = Duration::from_secs(1);
56 let deadline = std::time::Instant::now() + stop_after;
57 while std::time::Instant::now() < deadline {
58 match events.try_recv() {
59 Ok(event) => print_event(&event),
60 Err(_) => std::thread::sleep(Duration::from_millis(50)),
61 }
62 }
63
64 // `stop()` requests the stop synchronously; the returned receipt is only
65 // useful for awaiting durable acknowledgement, which this blocking
66 // example does not need.
67 std::mem::drop(owner.handle().stop());
68 match owner.join() {
69 Ok(outcome) => println!("managed run ended: {:?}", outcome.end_reason),
70 Err(err) => eprintln!("managed worker did not join cleanly: {err}"),
71 }
72}Sourcepub fn join(self) -> Result<ManagedOutcome, BlockingManagedJoinError>
pub fn join(self) -> Result<ManagedOutcome, BlockingManagedJoinError>
Wait synchronously for the managed task’s authoritative outcome.
Examples found in repository?
27fn main() {
28 let config = ManagedClientConfig {
29 client: ClientConfig {
30 open: OpenPolicy {
31 timeouts: vec![Duration::from_millis(300)],
32 ..Default::default()
33 },
34 request: SessionRequest {
35 duration: None,
36 interval: Duration::from_millis(200),
37 ..Default::default()
38 },
39 ..Default::default()
40 },
41 completion: ManagedCompletionPolicy::ExplicitStop,
42 ..Default::default()
43 };
44 let targets = vec![ManagedTargetConfig::new("local", "127.0.0.1:2112")];
45
46 let (owner, mut events) = match BlockingManagedClient::start_with_subscription(config, targets)
47 {
48 Ok(started) => started,
49 Err(err) => {
50 eprintln!("failed to start managed client: {err}");
51 return;
52 }
53 };
54
55 let stop_after = Duration::from_secs(1);
56 let deadline = std::time::Instant::now() + stop_after;
57 while std::time::Instant::now() < deadline {
58 match events.try_recv() {
59 Ok(event) => print_event(&event),
60 Err(_) => std::thread::sleep(Duration::from_millis(50)),
61 }
62 }
63
64 // `stop()` requests the stop synchronously; the returned receipt is only
65 // useful for awaiting durable acknowledgement, which this blocking
66 // example does not need.
67 std::mem::drop(owner.handle().stop());
68 match owner.join() {
69 Ok(outcome) => println!("managed run ended: {:?}", outcome.end_reason),
70 Err(err) => eprintln!("managed worker did not join cleanly: {err}"),
71 }
72}