Add the scheduling module

Three replicas of one application against one PostgreSQL database, proving
duplicate @Scheduled execution and then removing it with ShedLock: 24
executions where 8 were due, then 7 for 7 ticks.

Also measured: @SchedulerLock without @EnableSchedulerLock does nothing and
warns about nothing; spring.task.scheduling.pool.size=1 does not starve a
fixedRate job but delays it and fires 35 of 40 executions in a burst; and a
node whose clock is 40 seconds fast takes a live lock unless the provider
uses usingDbTime().
This commit is contained in:
2026-09-01 23:28:06 +05:30
parent 243cccd4ca
commit 6af6e4a3f1
31 changed files with 1373 additions and 1 deletions

47
scheduling/scripts/postgres.sh Executable file
View File

@@ -0,0 +1,47 @@
#!/usr/bin/env bash
# Starts a throwaway PostgreSQL 14 on port 55432 with no Docker and no root.
#
# On a Debian/Ubuntu machine the .deb packages can simply be downloaded and unpacked into a
# prefix; PostgreSQL does not need to be installed system-wide and refuses to run as root anyway.
# This is how docs/output/ was produced. If you have Docker, docker-compose.yml is easier.
#
# scripts/postgres.sh start|stop|psql
set -euo pipefail
cd "$(dirname "$0")/.."
PREFIX="$PWD/target/pg"
PGROOT="$PREFIX/root"
PGDATA="$PREFIX/data"
export PATH="$PGROOT/usr/lib/postgresql/14/bin:$PATH"
export LD_LIBRARY_PATH="$PGROOT/usr/lib/x86_64-linux-gnu:$PGROOT/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH:-}"
install_pg() {
mkdir -p "$PREFIX/debs" "$PGROOT"
( cd "$PREFIX/debs"
for p in postgresql-14 postgresql-client-14 postgresql-common postgresql-client-common \
libpq5 libllvm14 libicu70 libssl3 libxslt1.1 libxml2 libedit2 libbsd0 libmd0 \
zlib1g liblz4-1 libzstd1 libtinfo6 libncurses6 libcom-err2 libkrb5-3 libk5crypto3 \
libkrb5support0 libgssapi-krb5-2 libkeyutils1 libsasl2-2 libldap-2.5-0 libgnutls30 \
libnettle8 libhogweed6 libgmp10 libp11-kit0 libtasn1-6 libidn2-0 libunistring2 libffi8; do
apt-get download "$p" >/dev/null 2>&1 || true
done
for d in *.deb; do dpkg -x "$d" "$PGROOT" 2>/dev/null || true; done )
}
case "${1:-start}" in
start)
[ -x "$PGROOT/usr/lib/postgresql/14/bin/initdb" ] || install_pg
if [ ! -d "$PGDATA" ]; then
initdb -D "$PGDATA" -U app --auth=trust -E UTF8 >/dev/null
fi
pg_ctl -D "$PGDATA" -o "-p 55432 -k $PREFIX -c listen_addresses=127.0.0.1" \
-l "$PREFIX/pg.log" start >/dev/null 2>&1 || true
for _ in $(seq 1 30); do pg_isready -h 127.0.0.1 -p 55432 >/dev/null 2>&1 && break; sleep 1; done
psql -h 127.0.0.1 -p 55432 -U app -d postgres -tc \
"select 1 from pg_database where datname='shedlockdemo'" | grep -q 1 || \
psql -h 127.0.0.1 -p 55432 -U app -d postgres -q -c "create database shedlockdemo"
pg_isready -h 127.0.0.1 -p 55432
;;
stop) pg_ctl -D "$PGDATA" stop -m fast >/dev/null 2>&1 || true ;;
psql) shift; psql -h 127.0.0.1 -p 55432 -U app -d shedlockdemo "$@" ;;
*) echo "usage: $0 start|stop|psql" >&2; exit 2 ;;
esac