diff --git a/java/CHANGELOG.md b/java/CHANGELOG.md index b466f8fa6..190a030a7 100644 --- a/java/CHANGELOG.md +++ b/java/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0] - 2026-11-02 + ### Added - **Breaking:** Added `client.jobs()` for job reads, cancellation, completion, deletion, retries, and updates, removing the corresponding flat `Client` methods. Insertions remain on `Client`. [PR #1569](https://github.com/riverqueue/river/pull/1569). diff --git a/java/README.md b/java/README.md index fb24542f4..9c4eb9183 100644 --- a/java/README.md +++ b/java/README.md @@ -6,7 +6,7 @@ retry, or work them using the same database. ## Installation -Java 21 or newer is required. Add `com.riverqueue:river:0.2.0` and a JDBC driver to your application's dependencies. Jackson 3 is included transitively. +Java 21 or newer is required. Add `com.riverqueue:river:0.3.0` and a JDBC driver to your application's dependencies. Jackson 3 is included transitively. ```xml @@ -21,7 +21,7 @@ Java 21 or newer is required. Add `com.riverqueue:river:0.2.0` and a JDBC driver com.riverqueue river - 0.2.0 + 0.3.0 org.postgresql @@ -96,7 +96,7 @@ jbang app install --name river-java --java 21 \ --java-options=--enable-native-access=ALL-UNNAMED \ --repos https://riverqueue.com/maven --repos central \ --main com.riverqueue.cli.MigrationCli \ - com.riverqueue:river-cli:0.2.0 + com.riverqueue:river-cli:0.3.0 export PATH="$HOME/.jbang/bin:$PATH" export DATABASE_URL=postgres://localhost/myapp # For SQLite: export DATABASE_URL=jdbc:sqlite:/absolute/path/myapp.db @@ -162,7 +162,7 @@ cat > pom.xml <<'EOF' 4.0.0 localriver-cli-install1 riverhttps://riverqueue.com/maven - com.riverqueueriver-cli0.2.0 + com.riverqueueriver-cli0.3.0 EOF mvn --batch-mode --no-transfer-progress \ diff --git a/java/cli/pom.xml b/java/cli/pom.xml index 043d91527..e065d6c34 100644 --- a/java/cli/pom.xml +++ b/java/cli/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - com.riverqueueriver-java0.2.0../pom.xml - river-cli0.2.0 + com.riverqueueriver-java0.3.0../pom.xml + river-cli0.3.0 River Java migration CLI Executable database migration tool for River on Postgres and SQLite - com.riverqueueriver0.2.0 + com.riverqueueriver0.3.0 org.postgresqlpostgresql org.xerialsqlite-jdbc org.junit.jupiterjunit-jupitertest diff --git a/java/cli/src/test/java/com/riverqueue/cli/ExecutableIT.java b/java/cli/src/test/java/com/riverqueue/cli/ExecutableIT.java index 086b75d18..e1cc64bc2 100644 --- a/java/cli/src/test/java/com/riverqueue/cli/ExecutableIT.java +++ b/java/cli/src/test/java/com/riverqueue/cli/ExecutableIT.java @@ -52,7 +52,7 @@ private String command(boolean executableJar, String... args) throws Exception { @ParameterizedTest @ValueSource(booleans = {false, true}) void thinJarRunsWithRuntimeDependencies(boolean executableJar) throws Exception { - assertEquals("river 0.2.0", command(executableJar, "--version").strip()); + assertEquals("river 0.3.0", command(executableJar, "--version").strip()); assertTrue(command(executableJar, "migrate-up").contains("008 [up]")); assertTrue(command(executableJar, "migrate-list").contains("applied")); assertTrue( diff --git a/java/conformance/bin/build.py b/java/conformance/bin/build.py index 69e6b9115..14fbfec8c 100644 --- a/java/conformance/bin/build.py +++ b/java/conformance/bin/build.py @@ -13,9 +13,9 @@ with (artifacts.parent / "build.lock").open("w") as lock: fcntl.flock(lock, fcntl.LOCK_EX) subprocess.run(["mvn", "-q", "-f", str(root / "pom.xml"), "package", "-DskipTests"], check=True) - jar = root / "conformance/target/river-conformance-0.2.0.jar" + jar = root / "conformance/target/river-conformance-0.3.0.jar" # A stale shaded jar can otherwise silently retain an older dependency's classes. - with zipfile.ZipFile(root / "river/target/river-0.2.0.jar") as library, zipfile.ZipFile(jar) as bundled: + with zipfile.ZipFile(root / "river/target/river-0.3.0.jar") as library, zipfile.ZipFile(jar) as bundled: for entry in library.namelist(): if entry.startswith("com/riverqueue/") and not entry.endswith("/"): if library.read(entry) != bundled.read(entry): diff --git a/java/conformance/bin/run.py b/java/conformance/bin/run.py index df7daeca3..945d4c9cb 100644 --- a/java/conformance/bin/run.py +++ b/java/conformance/bin/run.py @@ -53,7 +53,7 @@ def main(): manifest_path = reference / "conformance/manifest.json" manifest = json.loads(manifest_path.read_text()) manifest["implementations"]["java"] = { - "package": "com.riverqueue:river", "registry": "maven", "version": "0.2.0" + "package": "com.riverqueue:river", "registry": "maven", "version": "0.3.0" } manifest_path.write_text(json.dumps(manifest, indent=2) + "\n") environment = os.environ | { diff --git a/java/conformance/candidate.json b/java/conformance/candidate.json index 0abbd45fb..72f31bc9c 100644 --- a/java/conformance/candidate.json +++ b/java/conformance/candidate.json @@ -14,7 +14,7 @@ "postgres-full-v1", "sqlite-runtime-v1" ], - "version": "0.2.0", + "version": "0.3.0", "start_options": [ "elect_interval_ms", "rescuer_interval_ms", diff --git a/java/conformance/pom.xml b/java/conformance/pom.xml index e493ebffc..0393b3e74 100644 --- a/java/conformance/pom.xml +++ b/java/conformance/pom.xml @@ -1,6 +1,6 @@ 4.0.0 - com.riverqueueriver-java0.2.0 + com.riverqueueriver-java0.3.0 river-conformance diff --git a/java/conformance/src/main/java/com/riverqueue/conformance/Adapter.java b/java/conformance/src/main/java/com/riverqueue/conformance/Adapter.java index aa4b2bcd5..56d330cf6 100644 --- a/java/conformance/src/main/java/com/riverqueue/conformance/Adapter.java +++ b/java/conformance/src/main/java/com/riverqueue/conformance/Adapter.java @@ -212,7 +212,7 @@ private JsonNode handle(String method, JsonNode params, String rawParams) throws database.dialect() == Database.Dialect.POSTGRES ? "postgres" : "sqlite"), Map.entry("capabilities", capabilities), Map.entry("implementation", "java"), - Map.entry("implementation_version", "0.2.0"), + Map.entry("implementation_version", "0.3.0"), Map.entry("methods", methods), Map.entry("migration_lines", Map.of("main", 8)), Map.entry("profile", profile), diff --git a/java/conformance/src/main/resources/manifest.json b/java/conformance/src/main/resources/manifest.json index 567192429..dbcd2df23 100644 --- a/java/conformance/src/main/resources/manifest.json +++ b/java/conformance/src/main/resources/manifest.json @@ -50,7 +50,7 @@ "java": { "package": "com.riverqueue:river", "registry": "maven", - "version": "0.2.0" + "version": "0.3.0" } }, "migration": { diff --git a/java/pom.xml b/java/pom.xml index 5e32b3081..b4418e09c 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.riverqueue river-java - 0.2.0 + 0.3.0 pom River for Java Transactional jobs on Postgres and SQLite, interoperable with River clients in other languages diff --git a/java/river/pom.xml b/java/river/pom.xml index b02d94704..4700c4b2c 100644 --- a/java/river/pom.xml +++ b/java/river/pom.xml @@ -1,6 +1,6 @@ 4.0.0 - com.riverqueueriver-java0.2.0 + com.riverqueueriver-java0.3.0 river River for Java library Transactional jobs interoperable with River clients in other languages diff --git a/rust/CHANGELOG.md b/rust/CHANGELOG.md index 852c84a68..58ea18e38 100644 --- a/rust/CHANGELOG.md +++ b/rust/CHANGELOG.md @@ -10,6 +10,8 @@ Changes to River for Go are recorded in the [repository changelog](../CHANGELOG. ## [Unreleased] +## [0.5.0] - 2026-11-02 + ### Changed - **Breaking:** Replace Chrono with Jiff 0.2 throughout the Rust API. Job timestamps, insertion options, retry hooks, periodic schedules, and test helpers now use `jiff::Timestamp`; River re-exports Jiff as `riverqueue::jiff`. Database formats and canonical timestamp JSON remain unchanged. [PR #1567](https://github.com/riverqueue/river/pull/1567). diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 16f0758bd..0fb487342 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -953,7 +953,7 @@ dependencies = [ [[package]] name = "riverqueue" -version = "0.4.0" +version = "0.5.0" dependencies = [ "anyhow", "async-trait", @@ -977,7 +977,7 @@ dependencies = [ [[package]] name = "riverqueue-cli" -version = "0.4.0" +version = "0.5.0" dependencies = [ "riverqueue", "riverqueue-migrate", @@ -989,7 +989,7 @@ dependencies = [ [[package]] name = "riverqueue-macros" -version = "0.4.0" +version = "0.5.0" dependencies = [ "proc-macro2", "quote", @@ -1001,7 +1001,7 @@ dependencies = [ [[package]] name = "riverqueue-migrate" -version = "0.4.0" +version = "0.5.0" dependencies = [ "serde_json", "sqlx", @@ -1011,7 +1011,7 @@ dependencies = [ [[package]] name = "riverqueue-test" -version = "0.4.0" +version = "0.5.0" dependencies = [ "jiff", "riverqueue", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 38ce080f3..dbaa123dd 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -15,7 +15,7 @@ homepage = "https://riverqueue.com" license = "MPL-2.0" repository = "https://github.com/riverqueue/river" rust-version = "1.95" -version = "0.4.0" +version = "0.5.0" [workspace.dependencies] async-trait = "0.1.92" diff --git a/rust/README.md b/rust/README.md index 8aa30e428..a9ede8254 100644 --- a/rust/README.md +++ b/rust/README.md @@ -6,7 +6,7 @@ River is a fast, reliable background job system backed by Postgres or SQLite. It ```toml [dependencies] -riverqueue = "0.4.0" +riverqueue = "0.5.0" serde = { version = "1", features = ["derive"] } serde_json = "1" tokio = { version = "1", features = ["macros", "rt-multi-thread", "signal"] } @@ -23,7 +23,7 @@ Rust version is 1.95. | `tzdb` | no | IANA zone names such as `America/New_York` in cron `CRON_TZ=` and `TZ=` prefixes | For SQLite alone, use -`riverqueue = { version = "0.4.0", default-features = false, features = ["sqlite"] }`. +`riverqueue = { version = "0.5.0", default-features = false, features = ["sqlite"] }`. River's API uses types from SQLx (pools and transactions), Jiff (timestamps), `serde_json` (metadata, outputs, and other JSON values), and diff --git a/rust/riverqueue-cli/Cargo.toml b/rust/riverqueue-cli/Cargo.toml index 16179de70..81088d69c 100644 --- a/rust/riverqueue-cli/Cargo.toml +++ b/rust/riverqueue-cli/Cargo.toml @@ -26,8 +26,8 @@ path = "src/main.rs" doc = false [dependencies] -riverqueue = { path = "../riverqueue", version = "=0.4.0", default-features = false } -riverqueue-migrate = { path = "../riverqueue-migrate", version = "=0.4.0", default-features = false } +riverqueue = { path = "../riverqueue", version = "=0.5.0", default-features = false } +riverqueue-migrate = { path = "../riverqueue-migrate", version = "=0.5.0", default-features = false } serde.workspace = true sqlx = { workspace = true, features = ["tls-rustls"] } tokio = { workspace = true, features = ["macros", "rt-multi-thread", "signal"] } diff --git a/rust/riverqueue-test/Cargo.toml b/rust/riverqueue-test/Cargo.toml index 3d5bf04bb..c5dacbd95 100644 --- a/rust/riverqueue-test/Cargo.toml +++ b/rust/riverqueue-test/Cargo.toml @@ -24,12 +24,12 @@ sqlite = ["riverqueue/sqlite"] [dependencies] jiff.workspace = true -riverqueue = { path = "../riverqueue", version = "=0.4.0", default-features = false } +riverqueue = { path = "../riverqueue", version = "=0.5.0", default-features = false } serde_json.workspace = true tokio-util.workspace = true [dev-dependencies] -riverqueue-migrate = { path = "../riverqueue-migrate", version = "=0.4.0", default-features = false, features = ["sqlite"] } +riverqueue-migrate = { path = "../riverqueue-migrate", version = "=0.5.0", default-features = false, features = ["sqlite"] } serde.workspace = true sqlx.workspace = true tokio.workspace = true diff --git a/rust/riverqueue/Cargo.toml b/rust/riverqueue/Cargo.toml index 5c0ea17e3..2339a5c1a 100644 --- a/rust/riverqueue/Cargo.toml +++ b/rust/riverqueue/Cargo.toml @@ -31,8 +31,8 @@ base64.workspace = true futures-util.workspace = true jiff.workspace = true jiff-sqlx = { version = "0.2.0", default-features = false, optional = true } -riverqueue-migrate = { path = "../riverqueue-migrate", version = "=0.4.0", default-features = false } -riverqueue-macros = { path = "../riverqueue-macros", version = "=0.4.0" } +riverqueue-migrate = { path = "../riverqueue-migrate", version = "=0.5.0", default-features = false } +riverqueue-macros = { path = "../riverqueue-macros", version = "=0.5.0" } rand = { workspace = true } serde.workspace = true serde_json.workspace = true @@ -45,7 +45,7 @@ tracing.workspace = true [dev-dependencies] anyhow = "1.0.104" -riverqueue-migrate = { path = "../riverqueue-migrate", version = "=0.4.0", features = ["postgres", "sqlite"] } +riverqueue-migrate = { path = "../riverqueue-migrate", version = "=0.5.0", features = ["postgres", "sqlite"] } serde.workspace = true tracing-subscriber = { version = "0.3.20", default-features = false, features = ["registry", "std"] } # Fault-injection tests proxy database connections. diff --git a/rust/riverqueue/README.md b/rust/riverqueue/README.md index a618f8a51..e3ef62cad 100644 --- a/rust/riverqueue/README.md +++ b/rust/riverqueue/README.md @@ -12,7 +12,7 @@ The [mixed deployment guide](https://docs.rs/riverqueue/latest/riverqueue/guide/ ```toml [dependencies] -riverqueue = "0.4.0" +riverqueue = "0.5.0" serde = { version = "1", features = ["derive"] } serde_json = "1" tokio = { version = "1", features = ["macros", "rt-multi-thread", "signal"] } @@ -29,7 +29,7 @@ Rust version is 1.95. | `tzdb` | no | IANA zone names such as `America/New_York` in cron `CRON_TZ=` and `TZ=` prefixes | For SQLite alone, use -`riverqueue = { version = "0.4.0", default-features = false, features = ["sqlite"] }`. +`riverqueue = { version = "0.5.0", default-features = false, features = ["sqlite"] }`. River's API uses types from SQLx (pools and transactions), Jiff (timestamps), `serde_json` (metadata, outputs, and other JSON values), and