pub struct DeployResourceRequest<T: DeployResourceState> { /* private fields */ }Expand description
Request to deploy one or more resources to Zeebe
Supports:
- BPMN process definitions
- DMN decision tables
- Custom forms
§Examples
let result = client
.deploy_resource()
.with_resource_file(PathBuf::from("./examples/resources/hello_world.bpmn"))
.read_resource_files()?
.send()
.await?;§Notes
- Deployment is atomic - all resources succeed or none are deployed
- Resources are validated before deployment
§Errors
- PERMISSION_DENIED:
- Deployment to unauthorized tenant
- INVALID_ARGUMENT:
- No resources provided
- Invalid resource content (broken XML, invalid BPMN/DMN)
- Missing/invalid tenant ID with multi-tenancy enabled
- Tenant ID provided with multi-tenancy disabled
Implementations§
Source§impl DeployResourceRequest<Initial>
impl DeployResourceRequest<Initial>
Sourcepub fn with_resource_file(
self,
file_path: PathBuf,
) -> DeployResourceRequest<WithFile>
pub fn with_resource_file( self, file_path: PathBuf, ) -> DeployResourceRequest<WithFile>
Adds a single resource file to the deployment request.
This method allows you to specify a single resource file, such as a BPMN, DMN, or Form file, to be included in the deployment.
§Arguments
file_path- APathBufrepresenting the path to the resource file.
§Returns
A DeployResourceRequest<WithFile> instance with the specified resource file added.
Examples found in repository?
17async fn main() -> Result<(), Box<dyn std::error::Error>> {
18 unsafe { std::env::set_var("RUST_BACKTRACE", "1") };
19
20 let client = zeebe_rs::Client::builder()
21 .with_address("http://localhost", 26500)
22 .with_oauth(
23 String::from("zeebe"),
24 String::from("zecret"),
25 String::from(
26 "http://localhost:18080/auth/realms/camunda-platform/protocol/openid-connect/token",
27 ),
28 String::from("zeebe-api"),
29 Duration::from_secs(30),
30 None,
31 )
32 .build()
33 .await?;
34
35 let _ = client.auth_initialized().await;
36 let result = client
37 .deploy_resource()
38 .with_resource_file(PathBuf::from("./examples/resources/hello_world.bpmn"))
39 .read_resource_files()?
40 .send()
41 .await?;
42
43 println!("{:?}", result);
44
45 let result = client
46 .publish_message()
47 .with_name(String::from("hello_world"))
48 .without_correlation_key()
49 .with_variables(HelloWorld {
50 hello: String::from("foo"),
51 })?
52 .send()
53 .await?;
54
55 println!("{:?}", result);
56
57 sleep(Duration::from_secs(1)).await;
58
59 let result = client
60 .publish_message()
61 .with_name(String::from("hello_message"))
62 .with_correlation_key(String::from("foo"))
63 .send()
64 .await?;
65
66 println!("{:?}", result);
67
68 Ok(())
69}More examples
73async fn main() -> Result<(), Box<dyn std::error::Error>> {
74 unsafe { std::env::set_var("RUST_BACKTRACE", "1") };
75
76 // Default configuration using Camunda's docker compose
77 // https://github.com/camunda/camunda-platform/blob/5dc74fe71667e18fbb5c8d4694068d662d83ad00/README.md
78 let client = Client::builder()
79 .with_address("http://localhost", 26500)
80 .with_oauth(
81 String::from("zeebe"),
82 String::from("zecret"),
83 String::from(
84 "http://localhost:18080/auth/realms/camunda-platform/protocol/openid-connect/token",
85 ),
86 String::from("zeebe-api"),
87 Duration::from_secs(30),
88 None,
89 )
90 .build()
91 .await?;
92
93 // Wait until first OAuth token has been retrieved
94 client.auth_initialized().await;
95
96 // Deploy our pizza ordering process
97 // We just discard the result for brevity
98 let deploy_resource_response = client
99 .deploy_resource()
100 .with_resource_file(PathBuf::from("examples/resources/pizza-order.bpmn"))
101 .read_resource_files()?
102 .send()
103 .await?;
104
105 let process_definition_key =
106 if let Some(deployment) = deploy_resource_response.deployments().first() {
107 match deployment.metadata() {
108 Some(metadata) => match metadata {
109 zeebe_rs::Metadata::Process(process_metadata) => {
110 process_metadata.process_definition_key()
111 }
112 _ => {
113 unreachable!("We're only deploying a bpmn here");
114 }
115 },
116 _ => -1,
117 }
118 } else {
119 -1
120 };
121
122 // Let's define our shared state, how much stock we have
123 let mut initial_stock = HashMap::new();
124 initial_stock.insert(String::from("Pepperoni"), 5);
125 initial_stock.insert(String::from("Margherita"), 8);
126 initial_stock.insert(String::from("Hawaiian"), 3);
127 initial_stock.insert(String::from("Quattro Formaggi"), 0);
128 initial_stock.insert(String::from("Vegetarian"), 6);
129
130 let stock = Arc::new(SharedState(Mutex::new(Stock {
131 items: initial_stock,
132 })));
133
134 // This will share the stock among all the workers confirming orders
135 // counting it down for each order.
136 let confirm_worker = client
137 .worker()
138 .with_request_timeout(Duration::from_secs(10))
139 .with_job_timeout(Duration::from_secs(10))
140 .with_max_jobs_to_activate(4)
141 .with_concurrency_limit(2)
142 .with_job_type(String::from("confirm_order"))
143 .with_state(stock)
144 .with_handler(confirm_order)
145 .with_fetch_variable(String::from("items"))
146 .build();
147
148 // We can reuse the worker builder for sharing some configurations
149 let base_worker = client
150 .worker()
151 .with_request_timeout(Duration::from_secs(10))
152 .with_job_timeout(Duration::from_secs(10));
153
154 let bake_worker = base_worker
155 .clone()
156 .with_max_jobs_to_activate(10)
157 .with_concurrency_limit(10)
158 .with_job_type(String::from("bake_pizzas"))
159 .with_handler(bake_pizzas)
160 .build();
161
162 // Handler can be both function callbacks or closures
163 // Handlers have to share return type for this to work
164 let reject_order_worker = client
165 .worker()
166 .with_request_timeout(Duration::from_secs(10))
167 .with_job_timeout(Duration::from_secs(10))
168 .with_max_jobs_to_activate(5)
169 .with_concurrency_limit(5)
170 .with_job_type(String::from("reject_order"))
171 .with_handler(|_client, _job| async move { Ok::<(), WorkerError<()>>(()) })
172 .build();
173
174 let deliver_worker = client
175 .worker()
176 .with_request_timeout(Duration::from_secs(10))
177 .with_job_timeout(Duration::from_secs(10))
178 .with_max_jobs_to_activate(1)
179 .with_concurrency_limit(1)
180 .with_job_type(String::from("deliver_order"))
181 .with_handler(deliver_order)
182 .build();
183
184 let clarify_address_worker = base_worker
185 .clone()
186 .with_max_jobs_to_activate(5)
187 .with_concurrency_limit(5)
188 .with_job_type(String::from("call_customer"))
189 .with_handler(|client, job| async move {
190 let mut customer = job.data::<Customer>().unwrap();
191
192 //Same guy keeps leaving out his address for some reason
193 customer.address = String::from("1337 Coolsville, USA");
194 if let Ok(req) = client
195 .complete_job()
196 .with_job_key(job.key())
197 .with_variables(customer)
198 {
199 let _ = req.send().await;
200 }
201 })
202 .build();
203
204 tokio::spawn(place_order(
205 client.clone(),
206 process_definition_key,
207 "Jane Doe",
208 "100 Coolsville, USA",
209 true,
210 vec!["Pepperoni"],
211 ));
212
213 tokio::spawn(place_order(
214 client.clone(),
215 process_definition_key,
216 "John Doe",
217 "999 NotCoolsville, USA",
218 false,
219 vec!["Quattro Formaggi"; 100],
220 ));
221
222 tokio::spawn(place_order(
223 client.clone(),
224 process_definition_key,
225 "Lorem Ipsum",
226 "",
227 false,
228 vec!["Hawaiian", "Pepperoni"],
229 ));
230
231 tokio::spawn(place_order(
232 client.clone(),
233 process_definition_key,
234 "George W Bush",
235 "White House",
236 true,
237 vec!["Burger"],
238 ));
239
240 let _ = tokio::join!(
241 confirm_worker.run(),
242 reject_order_worker.run(),
243 bake_worker.run(),
244 deliver_worker.run(),
245 clarify_address_worker.run(),
246 );
247
248 Ok(())
249}Sourcepub fn with_resource_files(
self,
file_paths: Vec<PathBuf>,
) -> DeployResourceRequest<WithFile>
pub fn with_resource_files( self, file_paths: Vec<PathBuf>, ) -> DeployResourceRequest<WithFile>
Adds multiple resource files to the deployment request.
This method allows you to specify multiple resource files, such as BPMN, DMN, or Form files, to be included in the deployment.
§Arguments
file_paths- AVec<PathBuf>containing the paths to the resource files.
§Returns
A DeployResourceRequest<WithFile> instance with the specified resource files added.
Sourcepub fn with_definition(
self,
name: String,
definition: Vec<u8>,
) -> DeployResourceRequest<WithDefinition>
pub fn with_definition( self, name: String, definition: Vec<u8>, ) -> DeployResourceRequest<WithDefinition>
Adds a single resource definition to the deployment request.
This method allows you to specify a single resource definition, including its name and raw content bytes, to be included in the deployment.
§Arguments
name- AStringrepresenting the resource name (e.g.,process.bpmn).definition- AVec<u8>containing the raw content bytes of the resource.
§Returns
A DeployResourceRequest<WithDefinition> instance with the specified resource definition added.
Sourcepub fn with_definitions(
self,
definitions: Vec<(String, Vec<u8>)>,
) -> DeployResourceRequest<WithDefinition>
pub fn with_definitions( self, definitions: Vec<(String, Vec<u8>)>, ) -> DeployResourceRequest<WithDefinition>
Adds multiple resource definitions to the deployment request.
This method allows you to specify multiple resource definitions, each including its name and raw content bytes, to be included in the deployment.
§Arguments
definitions- AVec<(String, Vec<u8>)>containing pairs of resource names and their raw content bytes.
§Returns
A DeployResourceRequest<WithDefinition> instance with the specified resource definitions added.
Source§impl DeployResourceRequest<WithFile>
impl DeployResourceRequest<WithFile>
Sourcepub fn read_resource_files(
self,
) -> Result<DeployResourceRequest<WithDefinition>, ClientError>
pub fn read_resource_files( self, ) -> Result<DeployResourceRequest<WithDefinition>, ClientError>
Reads resource files and transitions to definition state
§Errors
- ResourceLoad: Failed to read file
- MissingName: File name missing
Examples found in repository?
17async fn main() -> Result<(), Box<dyn std::error::Error>> {
18 unsafe { std::env::set_var("RUST_BACKTRACE", "1") };
19
20 let client = zeebe_rs::Client::builder()
21 .with_address("http://localhost", 26500)
22 .with_oauth(
23 String::from("zeebe"),
24 String::from("zecret"),
25 String::from(
26 "http://localhost:18080/auth/realms/camunda-platform/protocol/openid-connect/token",
27 ),
28 String::from("zeebe-api"),
29 Duration::from_secs(30),
30 None,
31 )
32 .build()
33 .await?;
34
35 let _ = client.auth_initialized().await;
36 let result = client
37 .deploy_resource()
38 .with_resource_file(PathBuf::from("./examples/resources/hello_world.bpmn"))
39 .read_resource_files()?
40 .send()
41 .await?;
42
43 println!("{:?}", result);
44
45 let result = client
46 .publish_message()
47 .with_name(String::from("hello_world"))
48 .without_correlation_key()
49 .with_variables(HelloWorld {
50 hello: String::from("foo"),
51 })?
52 .send()
53 .await?;
54
55 println!("{:?}", result);
56
57 sleep(Duration::from_secs(1)).await;
58
59 let result = client
60 .publish_message()
61 .with_name(String::from("hello_message"))
62 .with_correlation_key(String::from("foo"))
63 .send()
64 .await?;
65
66 println!("{:?}", result);
67
68 Ok(())
69}More examples
73async fn main() -> Result<(), Box<dyn std::error::Error>> {
74 unsafe { std::env::set_var("RUST_BACKTRACE", "1") };
75
76 // Default configuration using Camunda's docker compose
77 // https://github.com/camunda/camunda-platform/blob/5dc74fe71667e18fbb5c8d4694068d662d83ad00/README.md
78 let client = Client::builder()
79 .with_address("http://localhost", 26500)
80 .with_oauth(
81 String::from("zeebe"),
82 String::from("zecret"),
83 String::from(
84 "http://localhost:18080/auth/realms/camunda-platform/protocol/openid-connect/token",
85 ),
86 String::from("zeebe-api"),
87 Duration::from_secs(30),
88 None,
89 )
90 .build()
91 .await?;
92
93 // Wait until first OAuth token has been retrieved
94 client.auth_initialized().await;
95
96 // Deploy our pizza ordering process
97 // We just discard the result for brevity
98 let deploy_resource_response = client
99 .deploy_resource()
100 .with_resource_file(PathBuf::from("examples/resources/pizza-order.bpmn"))
101 .read_resource_files()?
102 .send()
103 .await?;
104
105 let process_definition_key =
106 if let Some(deployment) = deploy_resource_response.deployments().first() {
107 match deployment.metadata() {
108 Some(metadata) => match metadata {
109 zeebe_rs::Metadata::Process(process_metadata) => {
110 process_metadata.process_definition_key()
111 }
112 _ => {
113 unreachable!("We're only deploying a bpmn here");
114 }
115 },
116 _ => -1,
117 }
118 } else {
119 -1
120 };
121
122 // Let's define our shared state, how much stock we have
123 let mut initial_stock = HashMap::new();
124 initial_stock.insert(String::from("Pepperoni"), 5);
125 initial_stock.insert(String::from("Margherita"), 8);
126 initial_stock.insert(String::from("Hawaiian"), 3);
127 initial_stock.insert(String::from("Quattro Formaggi"), 0);
128 initial_stock.insert(String::from("Vegetarian"), 6);
129
130 let stock = Arc::new(SharedState(Mutex::new(Stock {
131 items: initial_stock,
132 })));
133
134 // This will share the stock among all the workers confirming orders
135 // counting it down for each order.
136 let confirm_worker = client
137 .worker()
138 .with_request_timeout(Duration::from_secs(10))
139 .with_job_timeout(Duration::from_secs(10))
140 .with_max_jobs_to_activate(4)
141 .with_concurrency_limit(2)
142 .with_job_type(String::from("confirm_order"))
143 .with_state(stock)
144 .with_handler(confirm_order)
145 .with_fetch_variable(String::from("items"))
146 .build();
147
148 // We can reuse the worker builder for sharing some configurations
149 let base_worker = client
150 .worker()
151 .with_request_timeout(Duration::from_secs(10))
152 .with_job_timeout(Duration::from_secs(10));
153
154 let bake_worker = base_worker
155 .clone()
156 .with_max_jobs_to_activate(10)
157 .with_concurrency_limit(10)
158 .with_job_type(String::from("bake_pizzas"))
159 .with_handler(bake_pizzas)
160 .build();
161
162 // Handler can be both function callbacks or closures
163 // Handlers have to share return type for this to work
164 let reject_order_worker = client
165 .worker()
166 .with_request_timeout(Duration::from_secs(10))
167 .with_job_timeout(Duration::from_secs(10))
168 .with_max_jobs_to_activate(5)
169 .with_concurrency_limit(5)
170 .with_job_type(String::from("reject_order"))
171 .with_handler(|_client, _job| async move { Ok::<(), WorkerError<()>>(()) })
172 .build();
173
174 let deliver_worker = client
175 .worker()
176 .with_request_timeout(Duration::from_secs(10))
177 .with_job_timeout(Duration::from_secs(10))
178 .with_max_jobs_to_activate(1)
179 .with_concurrency_limit(1)
180 .with_job_type(String::from("deliver_order"))
181 .with_handler(deliver_order)
182 .build();
183
184 let clarify_address_worker = base_worker
185 .clone()
186 .with_max_jobs_to_activate(5)
187 .with_concurrency_limit(5)
188 .with_job_type(String::from("call_customer"))
189 .with_handler(|client, job| async move {
190 let mut customer = job.data::<Customer>().unwrap();
191
192 //Same guy keeps leaving out his address for some reason
193 customer.address = String::from("1337 Coolsville, USA");
194 if let Ok(req) = client
195 .complete_job()
196 .with_job_key(job.key())
197 .with_variables(customer)
198 {
199 let _ = req.send().await;
200 }
201 })
202 .build();
203
204 tokio::spawn(place_order(
205 client.clone(),
206 process_definition_key,
207 "Jane Doe",
208 "100 Coolsville, USA",
209 true,
210 vec!["Pepperoni"],
211 ));
212
213 tokio::spawn(place_order(
214 client.clone(),
215 process_definition_key,
216 "John Doe",
217 "999 NotCoolsville, USA",
218 false,
219 vec!["Quattro Formaggi"; 100],
220 ));
221
222 tokio::spawn(place_order(
223 client.clone(),
224 process_definition_key,
225 "Lorem Ipsum",
226 "",
227 false,
228 vec!["Hawaiian", "Pepperoni"],
229 ));
230
231 tokio::spawn(place_order(
232 client.clone(),
233 process_definition_key,
234 "George W Bush",
235 "White House",
236 true,
237 vec!["Burger"],
238 ));
239
240 let _ = tokio::join!(
241 confirm_worker.run(),
242 reject_order_worker.run(),
243 bake_worker.run(),
244 deliver_worker.run(),
245 clarify_address_worker.run(),
246 );
247
248 Ok(())
249}Source§impl DeployResourceRequest<WithDefinition>
impl DeployResourceRequest<WithDefinition>
Sourcepub fn with_tenant(
self,
tenant_id: String,
) -> DeployResourceRequest<WithDefinition>
pub fn with_tenant( self, tenant_id: String, ) -> DeployResourceRequest<WithDefinition>
Sourcepub async fn send(self) -> Result<DeployResourceResponse, ClientError>
pub async fn send(self) -> Result<DeployResourceResponse, ClientError>
Sends the deploy resource request to the gateway.
§Returns
A Result containing:
Ok(DeployResourceResponse)on success, which includes:- Deployment key
- List of deployed resources with metadata
- Tenant ID
Err(ClientError)on failure, with possible errors:PERMISSION_DENIED: Deployment to an unauthorized tenant.INVALID_ARGUMENT:- No resources provided.
- Invalid resource content.
- Missing or invalid tenant ID when multi-tenancy is enabled.
- Tenant ID provided when multi-tenancy is disabled.
§Errors
This function will return an error if the request fails due to permission issues or invalid arguments.
Examples found in repository?
17async fn main() -> Result<(), Box<dyn std::error::Error>> {
18 unsafe { std::env::set_var("RUST_BACKTRACE", "1") };
19
20 let client = zeebe_rs::Client::builder()
21 .with_address("http://localhost", 26500)
22 .with_oauth(
23 String::from("zeebe"),
24 String::from("zecret"),
25 String::from(
26 "http://localhost:18080/auth/realms/camunda-platform/protocol/openid-connect/token",
27 ),
28 String::from("zeebe-api"),
29 Duration::from_secs(30),
30 None,
31 )
32 .build()
33 .await?;
34
35 let _ = client.auth_initialized().await;
36 let result = client
37 .deploy_resource()
38 .with_resource_file(PathBuf::from("./examples/resources/hello_world.bpmn"))
39 .read_resource_files()?
40 .send()
41 .await?;
42
43 println!("{:?}", result);
44
45 let result = client
46 .publish_message()
47 .with_name(String::from("hello_world"))
48 .without_correlation_key()
49 .with_variables(HelloWorld {
50 hello: String::from("foo"),
51 })?
52 .send()
53 .await?;
54
55 println!("{:?}", result);
56
57 sleep(Duration::from_secs(1)).await;
58
59 let result = client
60 .publish_message()
61 .with_name(String::from("hello_message"))
62 .with_correlation_key(String::from("foo"))
63 .send()
64 .await?;
65
66 println!("{:?}", result);
67
68 Ok(())
69}More examples
73async fn main() -> Result<(), Box<dyn std::error::Error>> {
74 unsafe { std::env::set_var("RUST_BACKTRACE", "1") };
75
76 // Default configuration using Camunda's docker compose
77 // https://github.com/camunda/camunda-platform/blob/5dc74fe71667e18fbb5c8d4694068d662d83ad00/README.md
78 let client = Client::builder()
79 .with_address("http://localhost", 26500)
80 .with_oauth(
81 String::from("zeebe"),
82 String::from("zecret"),
83 String::from(
84 "http://localhost:18080/auth/realms/camunda-platform/protocol/openid-connect/token",
85 ),
86 String::from("zeebe-api"),
87 Duration::from_secs(30),
88 None,
89 )
90 .build()
91 .await?;
92
93 // Wait until first OAuth token has been retrieved
94 client.auth_initialized().await;
95
96 // Deploy our pizza ordering process
97 // We just discard the result for brevity
98 let deploy_resource_response = client
99 .deploy_resource()
100 .with_resource_file(PathBuf::from("examples/resources/pizza-order.bpmn"))
101 .read_resource_files()?
102 .send()
103 .await?;
104
105 let process_definition_key =
106 if let Some(deployment) = deploy_resource_response.deployments().first() {
107 match deployment.metadata() {
108 Some(metadata) => match metadata {
109 zeebe_rs::Metadata::Process(process_metadata) => {
110 process_metadata.process_definition_key()
111 }
112 _ => {
113 unreachable!("We're only deploying a bpmn here");
114 }
115 },
116 _ => -1,
117 }
118 } else {
119 -1
120 };
121
122 // Let's define our shared state, how much stock we have
123 let mut initial_stock = HashMap::new();
124 initial_stock.insert(String::from("Pepperoni"), 5);
125 initial_stock.insert(String::from("Margherita"), 8);
126 initial_stock.insert(String::from("Hawaiian"), 3);
127 initial_stock.insert(String::from("Quattro Formaggi"), 0);
128 initial_stock.insert(String::from("Vegetarian"), 6);
129
130 let stock = Arc::new(SharedState(Mutex::new(Stock {
131 items: initial_stock,
132 })));
133
134 // This will share the stock among all the workers confirming orders
135 // counting it down for each order.
136 let confirm_worker = client
137 .worker()
138 .with_request_timeout(Duration::from_secs(10))
139 .with_job_timeout(Duration::from_secs(10))
140 .with_max_jobs_to_activate(4)
141 .with_concurrency_limit(2)
142 .with_job_type(String::from("confirm_order"))
143 .with_state(stock)
144 .with_handler(confirm_order)
145 .with_fetch_variable(String::from("items"))
146 .build();
147
148 // We can reuse the worker builder for sharing some configurations
149 let base_worker = client
150 .worker()
151 .with_request_timeout(Duration::from_secs(10))
152 .with_job_timeout(Duration::from_secs(10));
153
154 let bake_worker = base_worker
155 .clone()
156 .with_max_jobs_to_activate(10)
157 .with_concurrency_limit(10)
158 .with_job_type(String::from("bake_pizzas"))
159 .with_handler(bake_pizzas)
160 .build();
161
162 // Handler can be both function callbacks or closures
163 // Handlers have to share return type for this to work
164 let reject_order_worker = client
165 .worker()
166 .with_request_timeout(Duration::from_secs(10))
167 .with_job_timeout(Duration::from_secs(10))
168 .with_max_jobs_to_activate(5)
169 .with_concurrency_limit(5)
170 .with_job_type(String::from("reject_order"))
171 .with_handler(|_client, _job| async move { Ok::<(), WorkerError<()>>(()) })
172 .build();
173
174 let deliver_worker = client
175 .worker()
176 .with_request_timeout(Duration::from_secs(10))
177 .with_job_timeout(Duration::from_secs(10))
178 .with_max_jobs_to_activate(1)
179 .with_concurrency_limit(1)
180 .with_job_type(String::from("deliver_order"))
181 .with_handler(deliver_order)
182 .build();
183
184 let clarify_address_worker = base_worker
185 .clone()
186 .with_max_jobs_to_activate(5)
187 .with_concurrency_limit(5)
188 .with_job_type(String::from("call_customer"))
189 .with_handler(|client, job| async move {
190 let mut customer = job.data::<Customer>().unwrap();
191
192 //Same guy keeps leaving out his address for some reason
193 customer.address = String::from("1337 Coolsville, USA");
194 if let Ok(req) = client
195 .complete_job()
196 .with_job_key(job.key())
197 .with_variables(customer)
198 {
199 let _ = req.send().await;
200 }
201 })
202 .build();
203
204 tokio::spawn(place_order(
205 client.clone(),
206 process_definition_key,
207 "Jane Doe",
208 "100 Coolsville, USA",
209 true,
210 vec!["Pepperoni"],
211 ));
212
213 tokio::spawn(place_order(
214 client.clone(),
215 process_definition_key,
216 "John Doe",
217 "999 NotCoolsville, USA",
218 false,
219 vec!["Quattro Formaggi"; 100],
220 ));
221
222 tokio::spawn(place_order(
223 client.clone(),
224 process_definition_key,
225 "Lorem Ipsum",
226 "",
227 false,
228 vec!["Hawaiian", "Pepperoni"],
229 ));
230
231 tokio::spawn(place_order(
232 client.clone(),
233 process_definition_key,
234 "George W Bush",
235 "White House",
236 true,
237 vec!["Burger"],
238 ));
239
240 let _ = tokio::join!(
241 confirm_worker.run(),
242 reject_order_worker.run(),
243 bake_worker.run(),
244 deliver_worker.run(),
245 clarify_address_worker.run(),
246 );
247
248 Ok(())
249}Trait Implementations§
Auto Trait Implementations§
impl<T> !Freeze for DeployResourceRequest<T>
impl<T> !RefUnwindSafe for DeployResourceRequest<T>
impl<T> Send for DeployResourceRequest<T>where
T: Send,
impl<T> Sync for DeployResourceRequest<T>where
T: Sync,
impl<T> Unpin for DeployResourceRequest<T>where
T: Unpin,
impl<T> !UnwindSafe for DeployResourceRequest<T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request