diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6575a3..d1e8389 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: rust: [stable, beta] include: - os: ubuntu-latest - rust: nightly + rust: nightly-2026-04-16 steps: - name: Checkout sources uses: actions/checkout@v6 @@ -117,6 +117,8 @@ jobs: - name: Install Rust toolchain uses: dtolnay/rust-toolchain@nightly + with: + toolchain: nightly-2026-04-16 - name: Cache cargo registry uses: actions/cache@v5 @@ -141,9 +143,11 @@ jobs: - name: Install Rust nightly toolchain uses: dtolnay/rust-toolchain@nightly + with: + toolchain: nightly-2026-04-16 - name: Install cargo-udeps uses: taiki-e/install-action@cargo-udeps - name: Check for unused dependencies - run: cargo +nightly udeps --all-targets --all-features + run: cargo udeps --all-targets --all-features diff --git a/.sqlx/query-19f0e0d51f9d556ce19268c4d1f7b655b4828da876bf5adf0ca2f71ffc1cb908.json b/.sqlx/query-19f0e0d51f9d556ce19268c4d1f7b655b4828da876bf5adf0ca2f71ffc1cb908.json index 4053f38..d7cdf9b 100644 --- a/.sqlx/query-19f0e0d51f9d556ce19268c4d1f7b655b4828da876bf5adf0ca2f71ffc1cb908.json +++ b/.sqlx/query-19f0e0d51f9d556ce19268c4d1f7b655b4828da876bf5adf0ca2f71ffc1cb908.json @@ -119,6 +119,15 @@ "flags": "BLOB | BINARY", "max_size": 4294967295 } + }, + { + "ordinal": 13, + "name": "idempotency_key", + "type_info": { + "type": "VarString", + "flags": "", + "max_size": 144 + } } ], "parameters": { @@ -137,6 +146,7 @@ true, false, false, + true, true ] }, diff --git a/.sqlx/query-3bb5cd05cbbf2683e7e8cbf1e7d41c3b590693cac3fd619e69765cf25709ed70.json b/.sqlx/query-3bb5cd05cbbf2683e7e8cbf1e7d41c3b590693cac3fd619e69765cf25709ed70.json index c936ccc..1a05c30 100644 --- a/.sqlx/query-3bb5cd05cbbf2683e7e8cbf1e7d41c3b590693cac3fd619e69765cf25709ed70.json +++ b/.sqlx/query-3bb5cd05cbbf2683e7e8cbf1e7d41c3b590693cac3fd619e69765cf25709ed70.json @@ -119,6 +119,15 @@ "flags": "BLOB | BINARY", "max_size": 4294967295 } + }, + { + "ordinal": 13, + "name": "idempotency_key", + "type_info": { + "type": "VarString", + "flags": "", + "max_size": 144 + } } ], "parameters": { @@ -137,6 +146,7 @@ true, false, false, + true, true ] }, diff --git a/.sqlx/query-80546dfd433ebfe58f79903be7e75586c08bfbd7089219ff4a16f2760c0e15a6.json b/.sqlx/query-80546dfd433ebfe58f79903be7e75586c08bfbd7089219ff4a16f2760c0e15a6.json index 44c1dd0..9d738bc 100644 --- a/.sqlx/query-80546dfd433ebfe58f79903be7e75586c08bfbd7089219ff4a16f2760c0e15a6.json +++ b/.sqlx/query-80546dfd433ebfe58f79903be7e75586c08bfbd7089219ff4a16f2760c0e15a6.json @@ -119,6 +119,15 @@ "flags": "BLOB | BINARY", "max_size": 4294967295 } + }, + { + "ordinal": 13, + "name": "idempotency_key", + "type_info": { + "type": "VarString", + "flags": "", + "max_size": 144 + } } ], "parameters": { @@ -137,6 +146,7 @@ true, false, false, + true, true ] }, diff --git a/.sqlx/query-9139571d58e99737feb2a5e2674e4c50736e50ebac765e46127ff4cdc5b8ef46.json b/.sqlx/query-9139571d58e99737feb2a5e2674e4c50736e50ebac765e46127ff4cdc5b8ef46.json index 3d5a06b..d816a77 100644 --- a/.sqlx/query-9139571d58e99737feb2a5e2674e4c50736e50ebac765e46127ff4cdc5b8ef46.json +++ b/.sqlx/query-9139571d58e99737feb2a5e2674e4c50736e50ebac765e46127ff4cdc5b8ef46.json @@ -119,6 +119,15 @@ "flags": "BLOB | BINARY", "max_size": 4294967295 } + }, + { + "ordinal": 13, + "name": "idempotency_key", + "type_info": { + "type": "VarString", + "flags": "", + "max_size": 144 + } } ], "parameters": { @@ -137,6 +146,7 @@ true, false, false, + true, true ] }, diff --git a/.sqlx/query-80c9fc6c2af68bc15d7c1afbb19f86afbde77d768513f0246770dbb070a31b9b.json b/.sqlx/query-c049cf1078a393b011f7ed808472dcc3c3dbda40cb27ff74bd5ab8f263980c73.json similarity index 51% rename from .sqlx/query-80c9fc6c2af68bc15d7c1afbb19f86afbde77d768513f0246770dbb070a31b9b.json rename to .sqlx/query-c049cf1078a393b011f7ed808472dcc3c3dbda40cb27ff74bd5ab8f263980c73.json index 3527202..ac9d5b5 100644 --- a/.sqlx/query-80c9fc6c2af68bc15d7c1afbb19f86afbde77d768513f0246770dbb070a31b9b.json +++ b/.sqlx/query-c049cf1078a393b011f7ed808472dcc3c3dbda40cb27ff74bd5ab8f263980c73.json @@ -1,12 +1,12 @@ { "db_name": "MySQL", - "query": "INSERT INTO\n jobs(\n job,\n id,\n job_type,\n status,\n attempts,\n max_attempts,\n run_at,\n priority,\n metadata\n )\nVALUES\n (\n ?,\n ?,\n ?,\n 'Pending',\n 0,\n ?,\n ?,\n ?,\n ?\n )\n", + "query": "INSERT INTO\n jobs(\n job,\n id,\n job_type,\n status,\n attempts,\n max_attempts,\n run_at,\n priority,\n metadata,\n idempotency_key\n )\nVALUES\n (\n ?,\n ?,\n ?,\n 'Pending',\n 0,\n ?,\n ?,\n ?,\n ?,\n ?\n )\n", "describe": { "columns": [], "parameters": { - "Right": 7 + "Right": 8 }, "nullable": [] }, - "hash": "80c9fc6c2af68bc15d7c1afbb19f86afbde77d768513f0246770dbb070a31b9b" + "hash": "c049cf1078a393b011f7ed808472dcc3c3dbda40cb27ff74bd5ab8f263980c73" } diff --git a/.sqlx/query-cc96cbeae966723d957c58094937ae5d14660a312028f0673a5862330dfaa87d.json b/.sqlx/query-cc96cbeae966723d957c58094937ae5d14660a312028f0673a5862330dfaa87d.json index 980cc3b..0e4fa88 100644 --- a/.sqlx/query-cc96cbeae966723d957c58094937ae5d14660a312028f0673a5862330dfaa87d.json +++ b/.sqlx/query-cc96cbeae966723d957c58094937ae5d14660a312028f0673a5862330dfaa87d.json @@ -119,6 +119,15 @@ "flags": "BLOB | BINARY", "max_size": 4294967295 } + }, + { + "ordinal": 13, + "name": "idempotency_key", + "type_info": { + "type": "VarString", + "flags": "", + "max_size": 144 + } } ], "parameters": { @@ -137,6 +146,7 @@ true, false, false, + true, true ] }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a52e7f..58c7984 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- _feat_: idempotency for tasks (#56) + ## [1.0.0-rc.7] - 2026-04-11 - _bump_: introducing apalis-mysql v1.0.0-rc.7 diff --git a/Cargo.lock b/Cargo.lock index 7f78b5f..258208c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -84,9 +84,9 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "apalis" -version = "1.0.0-rc.7" +version = "1.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ca73a2477b3e6cf2650296c0441149ba50c40506b5aeb8ba75399e81181ce0" +checksum = "7780d1e7082500a4fdb463b0a6fc1c00e4012cd9b2af101c26fcabbb2f390f2c" dependencies = [ "apalis-core", "futures-util", @@ -98,9 +98,9 @@ dependencies = [ [[package]] name = "apalis-codec" -version = "0.1.0-rc.7" +version = "0.1.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f45e8249032bc5ed2c515471eca7913282190d8d8e7679cebf9b8fc6af40400a" +checksum = "c506e7f00c7c9c38eeb02290b3ec6328695f0614a257faefaeb8e8286746a665" dependencies = [ "apalis-core", "serde", @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "apalis-core" -version = "1.0.0-rc.7" +version = "1.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc053b8daf9235fd974cf2a7d7f8ed7ee8108ba1736d3ecce20529d26c32f66" +checksum = "797af42a40f6bc297365f2fed187b74d089c63641f57ce2a5e0f629db560cb47" dependencies = [ "futures-channel", "futures-core", @@ -151,9 +151,9 @@ dependencies = [ [[package]] name = "apalis-sql" -version = "1.0.0-rc.7" +version = "1.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5adc4a7c146226036d44baed2862dc2ee22b7299d19e7c4941fd27e1267a45a" +checksum = "09b555912820da093b004a055105af258df116edcea761db6b759d01aabac2ec" dependencies = [ "apalis-core", "chrono", @@ -165,9 +165,9 @@ dependencies = [ [[package]] name = "apalis-workflow" -version = "0.1.0-rc.7" +version = "0.1.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d223e7ce6a21e22c4da5ff9a5b82e57578544a73dda04718f8a2801dd13847" +checksum = "9392c07db462a5c0befec5d6685a37d9ec2424a244b7e7e021208c5c9544cef0" dependencies = [ "apalis-core", "futures", @@ -362,9 +362,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" dependencies = [ "serde_core", ] @@ -411,9 +411,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.60" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ "find-msvc-tools", "shlex", @@ -496,9 +496,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crossbeam-queue" @@ -1122,9 +1122,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1176,9 +1176,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "log", @@ -1189,9 +1189,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", @@ -1200,9 +1200,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ "cfg-if", "futures-util", @@ -1236,9 +1236,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.184" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libm" @@ -1252,10 +1252,10 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "libc", "plain", - "redox_syscall 0.7.4", + "redox_syscall 0.7.5", ] [[package]] @@ -1359,7 +1359,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] @@ -1414,15 +1414,14 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.76" +version = "0.10.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" +checksum = "bf0b434746ee2832f4f0baf10137e1cabb18cbe6912c69e2e33263c45250f542" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "foreign-types", "libc", - "once_cell", "openssl-macros", "openssl-sys", ] @@ -1446,9 +1445,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.112" +version = "0.9.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" +checksum = "158fe5b292746440aa6e7a7e690e55aeb72d41505e2804c23c6973ad0e9c9781" dependencies = [ "cc", "libc", @@ -1515,18 +1514,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "cbf0d9e68100b3a7989b4901972f265cd542e560a3a8a724e1e20322f4d06ce9" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "a990e22f43e84855daf260dded30524ef4a9021cc7541c26540500a50b624389" dependencies = [ "proc-macro2", "quote", @@ -1579,9 +1578,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "plain" @@ -1627,9 +1626,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] @@ -1700,9 +1699,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -1711,9 +1710,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -1763,16 +1762,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] name = "redox_syscall" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" +checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -1858,7 +1857,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.12.1", @@ -1867,9 +1866,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "once_cell", "ring", @@ -1881,18 +1880,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.11" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -1932,7 +1931,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation", "core-foundation-sys", "libc", @@ -2203,7 +2202,7 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64", - "bitflags 2.11.0", + "bitflags 2.11.1", "byteorder", "bytes", "chrono", @@ -2225,7 +2224,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rand 0.8.5", + "rand 0.8.6", "rsa", "serde", "sha1", @@ -2247,7 +2246,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64", - "bitflags 2.11.0", + "bitflags 2.11.1", "byteorder", "chrono", "crc", @@ -2265,7 +2264,7 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand 0.8.5", + "rand 0.8.6", "serde", "serde_json", "sha2", @@ -2446,9 +2445,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.51.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -2557,9 +2556,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ulid" @@ -2567,7 +2566,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", "serde", "web-time", ] @@ -2667,11 +2666,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -2680,7 +2679,7 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] @@ -2691,9 +2690,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -2704,9 +2703,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.68" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ "js-sys", "wasm-bindgen", @@ -2714,9 +2713,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2724,9 +2723,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -2737,9 +2736,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -2772,7 +2771,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "hashbrown 0.15.5", "indexmap", "semver", @@ -2794,14 +2793,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.6", + "webpki-roots 1.0.7", ] [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] @@ -3054,6 +3053,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -3103,7 +3108,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.11.1", "indexmap", "log", "serde", diff --git a/Cargo.toml b/Cargo.toml index 612ec8b..025cd79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,11 +24,11 @@ chrono = ["apalis-sql/chrono", "sqlx/chrono"] time = ["apalis-sql/time", "sqlx/time"] [dependencies] -apalis-core = { version = "1.0.0-rc.7", default-features = false, features = [ +apalis-core = { version = "1.0.0-rc.9", default-features = false, features = [ "sleep", ] } -apalis-sql = { version = "1.0.0-rc.7", default-features = false } -apalis-codec = { version = "0.1.0-rc.7", features = [ +apalis-sql = { version = "1.0.0-rc.9", default-features = false } +apalis-codec = { version = "0.1.0-rc.9", features = [ "json", ] } serde = { version = "1", features = ["derive"], default-features = false } @@ -53,8 +53,8 @@ features = ["mysql", "json"] [dev-dependencies] tokio = { version = "1", features = ["macros", "rt-multi-thread"] } -apalis = { version = "1.0.0-rc.7" } -apalis-workflow = { version = "0.1.0-rc.7" } +apalis = { version = "1.0.0-rc.9" } +apalis-workflow = { version = "0.1.0-rc.9" } futures-util = "0.3.31" env_logger = "0.11" diff --git a/deny.toml b/deny.toml index 9a56ce1..1355ee6 100644 --- a/deny.toml +++ b/deny.toml @@ -40,6 +40,7 @@ skip-tree = [ { name = "rand" }, { name = "rand_chacha" }, { name = "rand_core" }, + { name = "redox_syscall" }, ] [sources] diff --git a/examples/unique_jobs.rs b/examples/unique_jobs.rs new file mode 100644 index 0000000..1c9c348 --- /dev/null +++ b/examples/unique_jobs.rs @@ -0,0 +1,36 @@ +use apalis::prelude::*; +use apalis_mysql::MySqlStorage; +use sqlx::MySqlPool; + +#[tokio::main] +async fn main() { + let dedupe_key = "a5bc4337-7789-4feb-b421-88c7231bac10"; + + let pool = MySqlPool::connect(&std::env::var("DATABASE_URL").unwrap()) + .await + .unwrap(); + MySqlStorage::setup(&pool).await.unwrap(); + let mut backend = MySqlStorage::new(&pool); + + let task_1 = TaskBuilder::new(42) + .with_idempotency_key(dedupe_key) + .build(); + + let task_2 = TaskBuilder::new(43) + .with_idempotency_key(dedupe_key) + .build(); + + backend.push_task(task_1).await.unwrap(); + backend.push_task(task_2).await.unwrap(); + + async fn task(task: u32, worker: WorkerContext) -> Result<(), BoxDynError> { + apalis_core::timer::sleep(std::time::Duration::from_secs(1)).await; + assert_eq!(task, 42); + worker.stop()?; + Ok(()) + } + let worker = WorkerBuilder::new("rango-tango") + .backend(backend) + .build(task); + worker.run().await.unwrap(); +} diff --git a/examples/with_ui.rs b/examples/with_ui.rs deleted file mode 100644 index f328e4d..0000000 --- a/examples/with_ui.rs +++ /dev/null @@ -1 +0,0 @@ -fn main() {} diff --git a/migrations/20260508124246_idempotency_key.sql b/migrations/20260508124246_idempotency_key.sql new file mode 100644 index 0000000..852017c --- /dev/null +++ b/migrations/20260508124246_idempotency_key.sql @@ -0,0 +1,7 @@ + +ALTER TABLE + jobs +ADD + COLUMN idempotency_key varchar(36); + +CREATE UNIQUE INDEX idx_jobs_idempotency_key ON jobs(job_type, idempotency_key); diff --git a/queries/task/sink.sql b/queries/task/sink.sql index 50fd419..fc9bc01 100644 --- a/queries/task/sink.sql +++ b/queries/task/sink.sql @@ -8,7 +8,8 @@ INSERT INTO max_attempts, run_at, priority, - metadata + metadata, + idempotency_key ) VALUES ( @@ -20,5 +21,6 @@ VALUES ?, ?, ?, + ?, ? ) diff --git a/src/from_row.rs b/src/from_row.rs index bd3972b..872d1e9 100644 --- a/src/from_row.rs +++ b/src/from_row.rs @@ -14,6 +14,7 @@ pub(crate) struct MySqlTaskRow { pub(crate) lock_by: Option, pub(crate) done_at: Option, pub(crate) priority: Option, + pub(crate) idempotency_key: Option, pub(crate) metadata: Option, } @@ -45,6 +46,7 @@ impl TryInto for MySqlTaskRow { lock_by: self.lock_by, done_at: self.done_at, priority: self.priority.map(|v| v as usize), + idempotency_key: self.idempotency_key, metadata: self.metadata, }) } diff --git a/src/queries/list_tasks.rs b/src/queries/list_tasks.rs index c4669bd..6380d13 100644 --- a/src/queries/list_tasks.rs +++ b/src/queries/list_tasks.rs @@ -21,10 +21,10 @@ where { fn list_tasks( &self, - queue: &str, filter: &Filter, ) -> impl Future>, Self::Error>> + Send { - let queue = queue.to_owned(); + let queue = self.config().queue().to_string(); + let pool = self.pool.clone(); let limit = filter.limit() as i32; let offset = filter.offset() as i32; diff --git a/src/queries/list_workers.rs b/src/queries/list_workers.rs index 2fba461..0642f19 100644 --- a/src/queries/list_workers.rs +++ b/src/queries/list_workers.rs @@ -24,11 +24,8 @@ where Error = sqlx::Error, >, { - fn list_workers( - &self, - queue: &str, - ) -> impl Future, Self::Error>> + Send { - let queue = queue.to_string(); + fn list_workers(&self) -> impl Future, Self::Error>> + Send { + let queue = self.config().queue().to_string(); let pool = self.pool.clone(); let limit = 100; let offset = 0; diff --git a/src/queries/metrics.rs b/src/queries/metrics.rs index 4f8af9e..1cf9b6d 100644 --- a/src/queries/metrics.rs +++ b/src/queries/metrics.rs @@ -40,12 +40,9 @@ where Ok(rec) } } - fn fetch_by_queue( - &self, - queue_id: &str, - ) -> impl Future, Self::Error>> + Send { + fn fetch_by_queue(&self) -> impl Future, Self::Error>> + Send { let pool = self.pool.clone(); - let queue_id = queue_id.to_owned(); + let queue_id = self.config().queue().to_string(); async move { let rec = sqlx::query_file_as!( StatisticRow, diff --git a/src/sink.rs b/src/sink.rs index df8bcfb..6b56e42 100644 --- a/src/sink.rs +++ b/src/sink.rs @@ -60,6 +60,7 @@ pub async fn push_tasks( // Use specified queue if specified, otherwise use default let job_type = cfg.queue().to_string(); let meta = serde_json::to_string(&task.parts.ctx.meta()).unwrap_or_default(); + let idempotency_key = task.parts.idempotency_key; sqlx::query_file!( "queries/task/sink.sql", args, @@ -68,7 +69,8 @@ pub async fn push_tasks( max_attempts, run_at, priority, - meta + meta, + idempotency_key ) .execute(&mut *tx) .await?; diff --git a/supply-chain/config.toml b/supply-chain/config.toml index d6d12d2..ae80993 100644 --- a/supply-chain/config.toml +++ b/supply-chain/config.toml @@ -41,23 +41,23 @@ version = "1.0.102" criteria = "safe-to-deploy" [[exemptions.apalis]] -version = "1.0.0-rc.7" +version = "1.0.0-rc.9" criteria = "safe-to-run" [[exemptions.apalis-codec]] -version = "0.1.0-rc.7" +version = "0.1.0-rc.9" criteria = "safe-to-deploy" [[exemptions.apalis-core]] -version = "1.0.0-rc.7" +version = "1.0.0-rc.9" criteria = "safe-to-deploy" [[exemptions.apalis-sql]] -version = "1.0.0-rc.7" +version = "1.0.0-rc.9" criteria = "safe-to-deploy" [[exemptions.apalis-workflow]] -version = "0.1.0-rc.7" +version = "0.1.0-rc.9" criteria = "safe-to-run" [[exemptions.async-channel]] @@ -125,7 +125,7 @@ version = "1.3.2" criteria = "safe-to-deploy" [[exemptions.bitflags]] -version = "2.11.0" +version = "2.11.1" criteria = "safe-to-deploy" [[exemptions.block-buffer]] @@ -149,7 +149,7 @@ version = "1.11.1" criteria = "safe-to-deploy" [[exemptions.cc]] -version = "1.2.60" +version = "1.2.62" criteria = "safe-to-deploy" [[exemptions.cfg-if]] @@ -189,7 +189,7 @@ version = "3.4.0" criteria = "safe-to-deploy" [[exemptions.crc-catalog]] -version = "2.4.0" +version = "2.5.0" criteria = "safe-to-deploy" [[exemptions.crossbeam-queue]] @@ -453,7 +453,7 @@ version = "1.1.0" criteria = "safe-to-deploy" [[exemptions.idna_adapter]] -version = "1.2.1" +version = "1.2.2" criteria = "safe-to-deploy" [[exemptions.indexmap]] @@ -477,15 +477,15 @@ version = "1.0.18" criteria = "safe-to-deploy" [[exemptions.jiff]] -version = "0.2.23" +version = "0.2.24" criteria = "safe-to-run" [[exemptions.jiff-static]] -version = "0.2.23" +version = "0.2.24" criteria = "safe-to-run" [[exemptions.js-sys]] -version = "0.3.95" +version = "0.3.98" criteria = "safe-to-deploy" [[exemptions.kv-log-macro]] @@ -501,7 +501,7 @@ version = "0.1.0" criteria = "safe-to-deploy" [[exemptions.libc]] -version = "0.2.184" +version = "0.2.186" criteria = "safe-to-deploy" [[exemptions.libm]] @@ -581,7 +581,7 @@ version = "1.70.2" criteria = "safe-to-run" [[exemptions.openssl]] -version = "0.10.76" +version = "0.10.79" criteria = "safe-to-deploy" [[exemptions.openssl-macros]] @@ -593,7 +593,7 @@ version = "0.2.1" criteria = "safe-to-deploy" [[exemptions.openssl-sys]] -version = "0.9.112" +version = "0.9.115" criteria = "safe-to-deploy" [[exemptions.parking]] @@ -621,11 +621,11 @@ version = "0.8.3" criteria = "safe-to-run" [[exemptions.pin-project]] -version = "1.1.11" +version = "1.1.12" criteria = "safe-to-deploy" [[exemptions.pin-project-internal]] -version = "1.1.11" +version = "1.1.12" criteria = "safe-to-deploy" [[exemptions.pin-project-lite]] @@ -649,7 +649,7 @@ version = "0.10.2" criteria = "safe-to-deploy" [[exemptions.pkg-config]] -version = "0.3.32" +version = "0.3.33" criteria = "safe-to-deploy" [[exemptions.plain]] @@ -669,7 +669,7 @@ version = "1.13.1" criteria = "safe-to-run" [[exemptions.portable-atomic-util]] -version = "0.2.6" +version = "0.2.7" criteria = "safe-to-run" [[exemptions.potential_utf]] @@ -705,11 +705,11 @@ version = "6.0.0" criteria = "safe-to-deploy" [[exemptions.rand]] -version = "0.8.5" +version = "0.8.6" criteria = "safe-to-deploy" [[exemptions.rand]] -version = "0.9.2" +version = "0.9.4" criteria = "safe-to-deploy" [[exemptions.rand_chacha]] @@ -733,7 +733,7 @@ version = "0.5.18" criteria = "safe-to-deploy" [[exemptions.redox_syscall]] -version = "0.7.4" +version = "0.7.5" criteria = "safe-to-deploy" [[exemptions.regex]] @@ -765,15 +765,15 @@ version = "1.1.4" criteria = "safe-to-deploy" [[exemptions.rustls]] -version = "0.23.37" +version = "0.23.40" criteria = "safe-to-deploy" [[exemptions.rustls-pki-types]] -version = "1.14.0" +version = "1.14.1" criteria = "safe-to-deploy" [[exemptions.rustls-webpki]] -version = "0.103.11" +version = "0.103.13" criteria = "safe-to-deploy" [[exemptions.rustversion]] @@ -953,7 +953,7 @@ version = "0.1.1" criteria = "safe-to-deploy" [[exemptions.tokio]] -version = "1.51.1" +version = "1.52.3" criteria = "safe-to-deploy" [[exemptions.tokio-macros]] @@ -993,7 +993,7 @@ version = "0.1.36" criteria = "safe-to-deploy" [[exemptions.typenum]] -version = "1.19.0" +version = "1.20.0" criteria = "safe-to-deploy" [[exemptions.ulid]] @@ -1057,7 +1057,7 @@ version = "0.11.1+wasi-snapshot-preview1" criteria = "safe-to-deploy" [[exemptions.wasip2]] -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" criteria = "safe-to-deploy" [[exemptions.wasip3]] @@ -1069,23 +1069,23 @@ version = "0.1.0" criteria = "safe-to-deploy" [[exemptions.wasm-bindgen]] -version = "0.2.118" +version = "0.2.121" criteria = "safe-to-deploy" [[exemptions.wasm-bindgen-futures]] -version = "0.4.68" +version = "0.4.71" criteria = "safe-to-deploy" [[exemptions.wasm-bindgen-macro]] -version = "0.2.118" +version = "0.2.121" criteria = "safe-to-deploy" [[exemptions.wasm-bindgen-macro-support]] -version = "0.2.118" +version = "0.2.121" criteria = "safe-to-deploy" [[exemptions.wasm-bindgen-shared]] -version = "0.2.118" +version = "0.2.121" criteria = "safe-to-deploy" [[exemptions.wasm-encoder]] @@ -1109,7 +1109,7 @@ version = "0.26.11" criteria = "safe-to-deploy" [[exemptions.webpki-roots]] -version = "1.0.6" +version = "1.0.7" criteria = "safe-to-deploy" [[exemptions.whoami]] @@ -1236,6 +1236,10 @@ criteria = "safe-to-deploy" version = "0.51.0" criteria = "safe-to-deploy" +[[exemptions.wit-bindgen]] +version = "0.57.1" +criteria = "safe-to-deploy" + [[exemptions.wit-bindgen-core]] version = "0.51.0" criteria = "safe-to-deploy"