To create a worker, define a struct for the worker itself and a separate struct for its arguments. The argument struct must implement Serialize and Deserialize. Implement the Worker<Args> trait for your worker struct. You can also define default worker options, such as the queue name, via the opts() method.
use tracing::info;
use sidekiq::Result;
#[derive(Clone)]
struct PaymentReportWorker {}
impl PaymentReportWorker {
fn new() -> Self {
Self { }
}
async fn send_report(&self, user_guid: String) -> Result<()> {
info!({"user_guid" = user_guid}, "Sending payment report to user");
Ok(())
}
}
#[derive(Deserialize, Debug, Serialize)]
struct PaymentReportArgs {
user_guid: String,
}
#[async_trait]
impl Worker<PaymentReportArgs> for PaymentReportWorker {
// Default worker options
fn opts() -> sidekiq::WorkerOpts<Self> {
sidekiq::WorkerOpts::new().queue("yolo")
}
// Worker implementation
async fn perform(&self, args: PaymentReportArgs) -> Result<()> {
self.send_report(args.user_guid).await
}
}