Pligul Rust SDK содержит программную структуру для создания приложений с состоянием состояния, которые можно взаимодействовать с помощью мультиплексированных потоковых API. Он построен на вершине асинхронного времени выполнения Токио, и для любого приложения для плавания требуется время выполнения токио.
Каждое приложение состоит из некоторого числа государственных агентов, каждая из которых работает как отдельная задача Токио и может быть индивидуально адресована URI. У агента может быть как государственное, так и частное государство, которое может быть либо удерживаться исключительно в памяти, либо, необязательно, в постоянном хранилище. Общественное состояние агента состоит из ряда полос, аналогичных поля в записи. Существует несколько видов полос, которые, например, полосы, содержащие отдельные значения, и те, которые содержат карту пар клавишных значений.
Состояние любого полосы можно наблюдать, установив ссылку на нее (либо из другого экземпляра агента, либо из специализированного клиента). Установленная ссылка подтолкнет все обновления в состояние этой полосы абонента, а также позволит подписчику запросить изменения в состоянии (для видов полосы движения, которые поддерживают это). Ссылки работают над подключением к веб-сокетам и мультиплексированы, что означает, что ссылки на несколько полос на одном хосте могут поделиться одним соединением веб-сокета.
Веб -сайт | Руководство разработчика | Сервер API Docs | Клиентский API документы
Внедрение плавальных агентов в ржавчине
Создание приложения сервера плавания
Справочная документация
В следующем примере приложения запускается сервер Swimos, который размещает один маршрут одного агента, где каждый экземпляр агента имеет одиночную полосу, называемую lane . Каждый раз, когда изменения вносятся на переулок, он будет напечатан на консоли сервером.
[ dependencies ]
swimos = { version = " 0.1.1 " , features = [ " server " , " agent " ] } use swimos :: {
agent :: {
agent_lifecycle :: HandlerContext ,
agent_model :: AgentModel ,
event_handler :: { EventHandler , HandlerActionExt } ,
lanes :: ValueLane ,
lifecycle , AgentLaneModel ,
} ,
route :: RoutePattern ,
server :: { until_termination , Server , ServerBuilder } ,
} ;
# [ tokio :: main ]
pub async fn main ( ) -> Result < ( ) , Box < dyn std :: error :: Error > > {
// An agent route consists of the agent definition and a lifecycle.
let model = AgentModel :: new ( ExampleAgent :: default , ExampleLifecycle . into_lifecycle ( ) ) ;
let server = ServerBuilder :: with_plane_name ( "Example Plane" )
. set_bind_addr ( "127.0.0.1:8080" . parse ( ) ? ) // Bind the server to this address.
. add_route ( RoutePattern :: parse_str ( "/examples/{id}" ) ? , model ) // Register the agent we have defined.
. build ( )
. await ? ;
// Run the server until we terminate it with Ctrl-C.
let ( task , handle ) = server . run ( ) ;
let ( ctrl_c_result , server_result ) = tokio :: join! ( until_termination ( handle , None ) , task ) ;
ctrl_c_result? ;
server_result? ;
Ok ( ( ) )
}
// Deriving the `AgentLaneModel` trait makes this type into an agent.
# [ derive ( AgentLaneModel ) ]
struct ExampleAgent {
lane : ValueLane < i32 > ,
}
// Any agent type can have any number of lifecycles defined for it. A lifecycle describes
// how the agent will react to events that occur as it executes.
# [ derive ( Default , Clone , Copy ) ]
struct ExampleLifecycle ;
// The `lifecycle` macro creates an method called `into_lifecycle` for the type, using the
// annotated event handlers methods in the block.
# [ lifecycle ( ExampleAgent ) ]
impl ExampleLifecycle {
# [ on_event ( lane ) ]
fn lane_event (
& self ,
context : HandlerContext < ExampleAgent > ,
value : & i32 ,
) -> impl EventHandler < ExampleAgent > {
let n = * value ;
context . get_agent_uri ( ) . and_then ( move |uri| {
context . effect ( move || {
println ! ( "Received value: {} for 'lane' on agent at URI: {}." , n , uri ) ;
} )
} )
}
} Например, если клиент плавания отправляет обновление со значением 5 , агенту в URI /examples/name для Lane lane , экземпляр ExampleAgent , с использованием ExampleLifecycle , будет запущен на сервере. Значение полосы движения будет установлено на 5 , и следующее будет напечатано на консоли:
Received value: 5 for 'lane' on agent at URI: /examples/name.
Ряд примеров приложений доступен в каталоге example_apps, который демонстрирует отдельные функции, а также более комплексные приложения.
Смотрите Руководство по разработке.
Этот проект лицензирован по лицензии Apache 2.0.