diff --git a/.github/workflows/java-ci.yaml b/.github/workflows/java-ci.yaml new file mode 100644 index 00000000..967d74cc --- /dev/null +++ b/.github/workflows/java-ci.yaml @@ -0,0 +1,376 @@ +name: Java CI + +on: + push: + branches: + - main + - 2.x + pull_request: + +permissions: + contents: read + +concurrency: + group: java-ci-${{ github.ref }} + cancel-in-progress: true + +env: + REDIS_RUNNING: "true" + USER_NAME: rqueue + TERM: dumb + JVM_OPTS: -Xmx8g + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: gradle + + - name: Expose Java 21 to Gradle toolchains + run: | + echo "JAVA_HOME=$JAVA_HOME" >> "$GITHUB_ENV" + echo "ORG_GRADLE_JAVA_INSTALLATIONS_PATHS=$JAVA_HOME" >> "$GITHUB_ENV" + java -version + javac -version + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Resolve dependencies + run: ./gradlew dependencies + + - name: Compile main sources + run: ./gradlew compileJava + + - name: Compile test sources + run: ./gradlew compileTestJava + + unit_test: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: gradle + + - name: Expose Java 21 to Gradle toolchains + run: | + echo "JAVA_HOME=$JAVA_HOME" >> "$GITHUB_ENV" + echo "ORG_GRADLE_JAVA_INSTALLATIONS_PATHS=$JAVA_HOME" >> "$GITHUB_ENV" + java -version + javac -version + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Run unit tests + run: ./gradlew test -DincludeTags=unit + + - name: Upload JaCoCo exec data + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-unit + path: "**/build/reports/jacoco/*.exec" + if-no-files-found: error + + - name: Upload JUnit reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: unit-test-results + path: | + rqueue-spring-boot-starter/build/reports/junit/xml + rqueue-spring/build/reports/junit/xml + rqueue-core/build/reports/junit/xml + if-no-files-found: ignore + + producer_only_test: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: gradle + + - name: Expose Java 21 to Gradle toolchains + run: | + echo "JAVA_HOME=$JAVA_HOME" >> "$GITHUB_ENV" + echo "ORG_GRADLE_JAVA_INSTALLATIONS_PATHS=$JAVA_HOME" >> "$GITHUB_ENV" + java -version + javac -version + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Install Redis + run: | + sudo apt-get update + sudo apt-get install -y redis-server + redis-cli --version + + - name: Run producer-only tests + run: ./gradlew test -DincludeTags=producerOnly + + - name: Upload JaCoCo exec data + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-producer + path: "**/build/reports/jacoco/*.exec" + if-no-files-found: error + + - name: Upload JUnit reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: producer-test-results + path: | + rqueue-spring-boot-starter/build/reports/junit/xml + rqueue-spring/build/reports/junit/xml + rqueue-core/build/reports/junit/xml + if-no-files-found: ignore + + integration_test: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: gradle + + - name: Expose Java 21 to Gradle toolchains + run: | + echo "JAVA_HOME=$JAVA_HOME" >> "$GITHUB_ENV" + echo "ORG_GRADLE_JAVA_INSTALLATIONS_PATHS=$JAVA_HOME" >> "$GITHUB_ENV" + java -version + javac -version + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Install Redis + run: | + sudo apt-get update + sudo apt-get install -y redis-server + redis-cli --version + + - name: Run integration tests + run: ./gradlew test -DincludeTags=integration -DexcludeTags=redisCluster,producerOnly,local + + - name: Upload JaCoCo exec data + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-integration + path: "**/build/reports/jacoco/*.exec" + if-no-files-found: error + + - name: Upload JUnit reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: integration-test-results + path: | + rqueue-spring-boot-starter/build/reports/junit/xml + rqueue-spring/build/reports/junit/xml + rqueue-core/build/reports/junit/xml + if-no-files-found: ignore + + redis_cluster_test: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: gradle + + - name: Expose Java 21 to Gradle toolchains + run: | + echo "JAVA_HOME=$JAVA_HOME" >> "$GITHUB_ENV" + echo "ORG_GRADLE_JAVA_INSTALLATIONS_PATHS=$JAVA_HOME" >> "$GITHUB_ENV" + java -version + javac -version + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Install Redis + run: | + sudo apt-get update + sudo apt-get install -y redis-server + redis-cli --version + + - name: Setup Redis Cluster + run: | + mkdir 9000 9001 9002 9003 9004 9005 + printf "port 9000 \ncluster-enabled yes \ncluster-config-file nodes.conf \ncluster-node-timeout 5000 \nappendonly yes" >> 9000/redis.conf + printf "port 9001 \ncluster-enabled yes \ncluster-config-file nodes.conf \ncluster-node-timeout 5000 \nappendonly yes" >> 9001/redis.conf + printf "port 9002 \ncluster-enabled yes \ncluster-config-file nodes.conf \ncluster-node-timeout 5000 \nappendonly yes" >> 9002/redis.conf + printf "port 9003 \ncluster-enabled yes \ncluster-config-file nodes.conf \ncluster-node-timeout 5000 \nappendonly yes" >> 9003/redis.conf + printf "port 9004 \ncluster-enabled yes \ncluster-config-file nodes.conf \ncluster-node-timeout 5000 \nappendonly yes" >> 9004/redis.conf + printf "port 9005 \ncluster-enabled yes \ncluster-config-file nodes.conf \ncluster-node-timeout 5000 \nappendonly yes" >> 9005/redis.conf + (cd 9000 && redis-server ./redis.conf) & + (cd 9001 && redis-server ./redis.conf) & + (cd 9002 && redis-server ./redis.conf) & + (cd 9003 && redis-server ./redis.conf) & + (cd 9004 && redis-server ./redis.conf) & + (cd 9005 && redis-server ./redis.conf) & + sleep 30 + yes yes | redis-cli --cluster create 127.0.0.1:9000 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 --cluster-replicas 1 + + - name: Run Redis cluster tests + run: ./gradlew test -DincludeTags=redisCluster + + - name: Upload JaCoCo exec data + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-redis-cluster + path: "**/build/reports/jacoco/*.exec" + if-no-files-found: error + + - name: Upload JUnit reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: redis-cluster-test-results + path: | + rqueue-spring-boot-starter/build/reports/junit/xml + rqueue-spring/build/reports/junit/xml + rqueue-core/build/reports/junit/xml + if-no-files-found: ignore + + reactive_integration_test: + needs: build + runs-on: ubuntu-latest + env: + RQUEUE_REACTIVE_ENABLED: "true" + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: gradle + + - name: Expose Java 21 to Gradle toolchains + run: | + echo "JAVA_HOME=$JAVA_HOME" >> "$GITHUB_ENV" + echo "ORG_GRADLE_JAVA_INSTALLATIONS_PATHS=$JAVA_HOME" >> "$GITHUB_ENV" + java -version + javac -version + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Install Redis + run: | + sudo apt-get update + sudo apt-get install -y redis-server + redis-cli --version + + - name: Run reactive integration tests + run: ./gradlew test -DincludeTags=integration -DexcludeTags=redisCluster,producerOnly,local + + - name: Upload JaCoCo exec data + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-reactive + path: "**/build/reports/jacoco/*.exec" + if-no-files-found: error + + - name: Upload JUnit reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: reactive-integration-test-results + path: | + rqueue-spring-boot-starter/build/reports/junit/xml + rqueue-spring/build/reports/junit/xml + rqueue-core/build/reports/junit/xml + if-no-files-found: ignore + + coverage_report: + needs: + - unit_test + - producer_only_test + - integration_test + - redis_cluster_test + - reactive_integration_test + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: gradle + + - name: Expose Java 21 to Gradle toolchains + run: | + echo "JAVA_HOME=$JAVA_HOME" >> "$GITHUB_ENV" + echo "ORG_GRADLE_JAVA_INSTALLATIONS_PATHS=$JAVA_HOME" >> "$GITHUB_ENV" + java -version + javac -version + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Download coverage artifacts + uses: actions/download-artifact@v4 + with: + pattern: coverage-* + path: coverage-artifacts + merge-multiple: false + + - name: Generate merged coverage report + run: ./gradlew coverageReportOnly + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: | + build/reports/jacoco/test/jacocoTestReport.xml + build/reports/jacoco/coverageReportOnly/html + if-no-files-found: ignore diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml index 233ef15e..9e9d8d2a 100644 --- a/.github/workflows/pages.yaml +++ b/.github/workflows/pages.yaml @@ -46,7 +46,7 @@ jobs: - name: Setup Ruby uses: ruby/setup-ruby@v1 # Update to latest version as needed with: - ruby-version: '3.1' # Not needed with a .ruby-version file + ruby-version: '3.2' # Keep this aligned with docs/.ruby-version and nokogiri's Ruby requirement bundler-cache: true # runs 'bundle install' and caches installed gems automatically cache-version: 0 # Increment this number if you need to re-download cached gems working-directory: '${{ github.workspace }}/docs' @@ -65,4 +65,4 @@ jobs: path: 'docs/_site/' - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v3 \ No newline at end of file + uses: actions/deploy-pages@v3 diff --git a/.github/workflows/pr-format.yaml b/.github/workflows/pr-format.yaml new file mode 100644 index 00000000..20995a97 --- /dev/null +++ b/.github/workflows/pr-format.yaml @@ -0,0 +1,56 @@ +name: Format PR Code + +on: + pull_request: + types: + - opened + - synchronize + - reopened + - ready_for_review + +permissions: + contents: write + +jobs: + format: + if: github.event.pull_request.head.repo.full_name == github.repository + runs-on: ubuntu-latest + + steps: + - name: Checkout PR branch + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.ref }} + fetch-depth: 0 + + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "21" + cache: gradle + + - name: Expose Java 21 to Gradle toolchains + run: | + echo "JAVA_HOME=$JAVA_HOME" >> "$GITHUB_ENV" + echo "ORG_GRADLE_JAVA_INSTALLATIONS_PATHS=$JAVA_HOME" >> "$GITHUB_ENV" + java -version + javac -version + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Format Java sources + run: ./gradlew formatJava + + - name: Commit formatted changes + run: | + if git diff --quiet; then + echo "No formatting changes detected" + exit 0 + fi + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add -A + git commit -m "Apply Palantir Java Format" + git push diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 975272e3..0c86551b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,3 @@ -[![Build Status](https://circleci.com/gh/sonus21/rqueue/tree/master.svg?style=shield)](https://circleci.com/gh/sonus21/rqueue/tree/master) [![Coverage Status](https://coveralls.io/repos/github/sonus21/rqueue/badge.svg?branch=master)](https://coveralls.io/github/sonus21/rqueue?branch=master) [![Maven Central](https://img.shields.io/maven-central/v/com.github.sonus21/rqueue-core)](https://repo1.maven.org/maven2/com/github/sonus21/rqueue-core) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) @@ -23,6 +22,8 @@ * Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. +* Format Java sources before opening the PR with `./gradlew formatJava`. + #### **Did you fix whitespace, format code, or make a purely cosmetic patch?** diff --git a/README.md b/README.md index 61451f98..9ea25fc7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@

Rqueue: Redis Queue, Task Queue, Scheduled Queue for Spring and Spring Boot

-[![Build Status](https://circleci.com/gh/sonus21/rqueue/tree/master.svg?style=shield)](https://circleci.com/gh/sonus21/rqueue/tree/master) [![Coverage Status](https://coveralls.io/repos/github/sonus21/rqueue/badge.svg?branch=master)](https://coveralls.io/github/sonus21/rqueue?branch=master) [![Maven Central](https://img.shields.io/maven-central/v/com.github.sonus21/rqueue-core)](https://repo1.maven.org/maven2/com/github/sonus21/rqueue-core) [![Javadoc](https://javadoc.io/badge2/com.github.sonus21/rqueue-core/javadoc.svg)](https://javadoc.io/doc/com.github.sonus21/rqueue-core) @@ -53,7 +52,7 @@ well, where all services code is in Spring. ### Requirements * Spring 5+, 6+, 7+ -* Java 1.8+,17 +* Java 1.8+,17, 21 * Spring boot 2+,3+,4+ * Lettuce client for Redis cluster * Read master preference for Redis cluster @@ -68,8 +67,8 @@ Release Version: [Maven central](https://search.maven.org/search?q=g:com.github. **NOTE:** -* For spring boot 2.x use Rqueue 2.x -* For spring boot 3.x use Rqueue 3.x +* For Spring Boot 3.x use Rqueue 3.x +* For Spring Boot 4.x use Rqueue 4.x Get the latest one from [Maven central](https://search.maven.org/search?q=g:com.github.sonus21%20AND%20a:rqueue-spring-boot-starter) @@ -77,14 +76,14 @@ from [Maven central](https://search.maven.org/search?q=g:com.github.sonus21%20AN * Add dependency * Gradle ```groovy - implementation 'com.github.sonus21:rqueue-spring-boot-starter:2.13.1-RELEASE' + implementation 'com.github.sonus21:rqueue-spring-boot-starter:4.0.0-RELEASE' ``` * Maven ```xml com.github.sonus21 rqueue-spring-boot-starter - 2.13.1-RELEASE + 4.0.0-RELEASE ``` @@ -96,9 +95,8 @@ from [Maven central](https://search.maven.org/search?q=g:com.github.sonus21%20AN **NOTE** -* For spring framework 5.x use rqueue-spring 2.x -* For spring framework 6.x use rqueue-spring 3.x -* For spring framework 7.x use rqueue-spring 4.x +* For Spring Framework 6.x use Rqueue 3.x +* For Spring Framework 7.x use Rqueue 4.x Get the latest one from [Maven central](https://search.maven.org/search?q=g:com.github.sonus21%20AND%20a:rqueue-spring) @@ -106,14 +104,14 @@ from [Maven central](https://search.maven.org/search?q=g:com.github.sonus21%20AN * Add Dependency * Gradle ```groovy - implementation 'com.github.sonus21:rqueue-spring:2.13.1-RELEASE' + implementation 'com.github.sonus21:rqueue-spring:4.0.0-RELEASE' ``` * Maven ```xml com.github.sonus21 rqueue-spring - 2.13.1-RELEASE + 4.0.0-RELEASE ``` * Add annotation `EnableRqueue` on application config class @@ -329,7 +327,7 @@ gradle to start with. In root `build.gradle` file comment out spring related ver environment variables for Spring versions. You can use [module, class and other diagrams](https://sourcespy.com/github/sonus21rqueue/) to familiarise yourself with the project. -**Please format your code with Google Java formatter.** +**Please format your code with Palantir Java Format using `./gradlew formatJava`.** ## Links diff --git a/.circleci/config.yml b/archive/circleci/config.yml similarity index 84% rename from .circleci/config.yml rename to archive/circleci/config.yml index b4b59a71..3b6cf974 100644 --- a/.circleci/config.yml +++ b/archive/circleci/config.yml @@ -1,3 +1,6 @@ +# Archived CircleCI configuration kept for reference after migration to GitHub Actions. +# Active CI lives under .github/workflows/. +# # Java Gradle CircleCI 2.0 configuration file # # Check https://circleci.com/docs/2.0/language-java/ for more details @@ -11,26 +14,10 @@ aliases: environment: &environment environment: - SPRING_BOOT_VERSION: 2.2.0.RELEASE - SPRING_VERSION: 5.2.0.RELEASE - SPRING_DATA_VERSION: 2.2.0.RELEASE - MICROMETER_VERSION: 1.3.2 - RQUEUE_REACTIVE_ENABLED: "false" - - environment_v0: &environment_v0 - environment: - SPRING_BOOT_VERSION: 2.0.6.RELEASE - SPRING_VERSION: 5.0.10.RELEASE - SPRING_DATA_VERSION: 2.0.6.RELEASE - MICROMETER_VERSION: 1.1.0 RQUEUE_REACTIVE_ENABLED: "false" reactive_environment: &reactive_environment environment: - SPRING_BOOT_VERSION: 2.2.0.RELEASE - SPRING_VERSION: 5.2.0.RELEASE - SPRING_DATA_VERSION: 2.2.0.RELEASE - MICROMETER_VERSION: 1.3.2 RQUEUE_REACTIVE_ENABLED: "true" @@ -104,10 +91,6 @@ aliases: executor: rqueue-executor <<: *environment - default_v0: &default_vo - executor: rqueue-executor - <<: *environment_v0 - reactive: &reactive executor: rqueue-executor <<: *reactive_environment @@ -121,23 +104,30 @@ executors: working_directory: ~/repo environment: - # Customize the JVM maximum heap limit - JVM_OPTS: -Xmx6400m + JVM_OPTS: -Xmx8g TERM: dumb ORG_GRADLE_PROJECT_mavenCentralUsername: xxx ORG_GRADLE_PROJECT_mavenCentralPassword: xxx USER_NAME: rqueue REDIS_RUNNING: "true" +java_21: &java_21 + run: + name: Use Java 21 + command: | + sudo apt-get update + sudo apt-get install -y openjdk-21-jdk + java -version + javac -version + build_steps: &build_steps steps: - checkout + - *java_21 - restore_cache: keys: - v1-dependencies-{{ checksum "build.gradle" }} - # fallback to using the latest cache if no exact match is found - v1-dependencies- - - run: ./gradlew dependencies - save_cache: paths: @@ -145,11 +135,15 @@ build_steps: &build_steps key: v1-dependencies-{{ checksum "build.gradle" }} - run: ./gradlew compileJava - run: ./gradlew compileTestJava - - *persist_to_workspace + - persist_to_workspace: + root: . + paths: + - . unit_test_steps: &unit_test_steps steps: - *attach_workspace + - *java_21 - run: ./gradlew codeCoverageReport -DincludeTags=unit - *persist_to_workspace - *copy_logs @@ -160,6 +154,7 @@ unit_test_steps: &unit_test_steps producer_test_steps: &producer_test_steps steps: - *attach_workspace + - *java_21 - *redis_dep - run: ./gradlew codeCoverageReport -DincludeTags=producerOnly - *persist_to_workspace @@ -171,6 +166,7 @@ producer_test_steps: &producer_test_steps integration_test_steps: &integration_test_steps steps: - *attach_workspace + - *java_21 - *redis_dep - run: ./gradlew codeCoverageReport -DincludeTags=integration -DexcludeTags=redisCluster,producerOnly,local - *persist_to_workspace @@ -182,6 +178,7 @@ integration_test_steps: &integration_test_steps redis_custer_test_steps: &redis_cluster_test_steps steps: - *attach_workspace + - *java_21 - *redis_dep - *redis_cluster_setup - run: ./gradlew codeCoverageReport -DincludeTags=redisCluster @@ -194,6 +191,7 @@ redis_custer_test_steps: &redis_cluster_test_steps report_code_coverage_steps: &report_code_coverage_steps steps: - *attach_workspace + - *java_21 - run: ./gradlew coverallsJacoco - *copy_logs - *copy_test_results @@ -205,26 +203,14 @@ jobs: <<: *default <<: *build_steps - build_v0: - <<: *default_vo - <<: *build_steps - unit_test: <<: *default <<: *unit_test_steps - unit_test_v0: - <<: *default_vo - <<: *unit_test_steps - producer_only_test: <<: *default <<: *producer_test_steps - producer_only_test_v0: - <<: *default_vo - <<: *producer_test_steps - integration_test: <<: *default <<: *integration_test_steps @@ -233,26 +219,14 @@ jobs: <<: *reactive <<: *integration_test_steps - integration_test_v0: - <<: *default_vo - <<: *integration_test_steps - redis_custer_test: <<: *default <<: *redis_cluster_test_steps - redis_custer_test_v0: - <<: *default_vo - <<: *redis_cluster_test_steps - report_code_coverage: <<: *default <<: *report_code_coverage_steps - report_code_coverage_v0: - <<: *default_vo - <<: *report_code_coverage_steps - workflows: main: jobs: diff --git a/build.gradle b/build.gradle index 37126b8a..0974c07e 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,14 @@ plugins { id "com.github.nbaztec.coveralls-jacoco" version "1.2.20" } +configurations { + palantirJavaFormat +} + +dependencies { + palantirJavaFormat "com.palantir.javaformat:palantir-java-format:2.69.0" +} + allprojects { apply plugin: "idea" apply plugin: "java-library" @@ -13,8 +21,11 @@ allprojects { apply plugin: "org.gradle.test-retry" java { - sourceCompatibility = "17" - targetCompatibility = "17" + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } repositories { @@ -38,7 +49,7 @@ ext { jupiterVersion = "5.5.0" mockitoVersion = "3.5.0" hamcrestVersion = "2.2" - jacocoVersion = "0.8.8" + jacocoVersion = "0.8.12" embeddedRedisVersion = "1.4.3" h2Version = "2.1.214" tomcatVersion = "10.1.4" @@ -119,12 +130,32 @@ def publishedProjects = subprojects.findAll({ subproject -> subproject.pluginManager.hasPlugin("java") && !subproject.name.endsWith("example") && !subproject.name.contains("test") }) +def coverageExcludes = [ + "com/github/sonus21/rqueue/exception", + "com/github/sonus21/rqueue/models/response", + "com/github/sonus21/rqueue/core/RqueueMessageSender*", + "com/github/sonus21/rqueue/utils/PrefixLogger*", + "com/github/sonus21/rqueue/utils/StackTraceUtil*", + "com/github/sonus21/rqueue/core/ScheduledTaskDetail*", +] + +def filteredCoverageClassDirectories = providers.provider { + files(publishedProjects.collect { subproject -> + subproject.sourceSets.main.output.classesDirs.files.collect { classesDir -> + fileTree(classesDir) { + exclude coverageExcludes + } + } + }) +} + task codeCoverageReport(type: JacocoReport, group: "verification", description: "Generate code coverage report") { - executionData fileTree(project.rootDir.absolutePath).include("**/build/reports/jacoco/*.exec") + executionData fileTree(project.rootDir.absolutePath).include("**/build/reports/jacoco/*.exec", "**/coverage-artifacts/**/*.exec") publishedProjects.each { sourceSets it.sourceSets.main } + classDirectories.setFrom(filteredCoverageClassDirectories) reports { xml.required = System.getenv("CIRCLECI") == "true" @@ -132,26 +163,29 @@ task codeCoverageReport(type: JacocoReport, group: "verification", description: html.required = System.getenv("CIRCLECI") != "true" xml.outputLocation = file("${buildDir}/reports/jacoco/test/jacocoTestReport.xml") } - - afterEvaluate { - classDirectories.setFrom(files(classDirectories.files.collect { - fileTree(dir: it, - exclude: [ - "com/github/sonus21/rqueue/exception", - "com/github/sonus21/rqueue/models/response", - "com/github/sonus21/rqueue/core/RqueueMessageSender*", - "com/github/sonus21/rqueue/utils/PrefixLogger*", - "com/github/sonus21/rqueue/utils/StackTraceUtil*", - "com/github/sonus21/rqueue/core/ScheduledTaskDetail*", - ] - ) - })) - } dependsOn(subprojects*.test) doLast {} test.useTestNG() } +tasks.register("coverageReportOnly", JacocoReport) { + group = "verification" + description = "Generate code coverage report from existing JaCoCo execution data." + executionData fileTree(project.rootDir.absolutePath).include("**/build/reports/jacoco/*.exec", "**/coverage-artifacts/**/*.exec") + + publishedProjects.each { + sourceSets it.sourceSets.main + } + classDirectories.setFrom(filteredCoverageClassDirectories) + + reports { + xml.required = true + csv.required = false + html.required = true + xml.outputLocation = file("${buildDir}/reports/jacoco/test/jacocoTestReport.xml") + } +} + jacoco { toolVersion = "${jacocoVersion}" @@ -171,3 +205,49 @@ coverallsJacoco { it.sourceSets.main.allSource.srcDirs } } + +def javaFormatSources = providers.provider { + files(subprojects.collect { subproject -> + subproject.fileTree(subproject.projectDir) { + include "src/**/*.java" + } + }).files.findAll { it.exists() } +} + +tasks.register("formatJava", JavaExec) { + group = "formatting" + description = "Formats all Java sources with Palantir Java Format." + classpath = configurations.palantirJavaFormat + mainClass = "com.palantir.javaformat.java.Main" + jvmArgs( + "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" + ) + doFirst { + args = ["--replace"] + javaFormatSources.get().collect { it.absolutePath } + } +} + +tasks.register("checkFormatJava", JavaExec) { + group = "verification" + description = "Checks whether all Java sources are formatted with Palantir Java Format." + classpath = configurations.palantirJavaFormat + mainClass = "com.palantir.javaformat.java.Main" + jvmArgs( + "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", + "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" + ) + doFirst { + args = ["--dry-run", "--set-exit-if-changed"] + javaFormatSources.get().collect { it.absolutePath } + } +} + +tasks.named("check") { + dependsOn(tasks.named("checkFormatJava")) +} diff --git a/docs/.ruby-version b/docs/.ruby-version index fd2a0186..944880fa 100644 --- a/docs/.ruby-version +++ b/docs/.ruby-version @@ -1 +1 @@ -3.1.0 +3.2.0 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1b0af43d..d328973d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -46,10 +46,10 @@ This release fixes a critical bug where task multiplication caused excessive Red resource usage. For details, see issue #[193]. -## Release [3.0.1] 17-Jan-2022 +## Release [4.0.0] 17-Jan-2022 -We're so excited to release Rqueue `3.0.1`. This release supports the Java 17, Spring Boot 3.x and -Spring Framework 6.x +We're so excited to release Rqueue `4.0.0`. This release supports Java 21, +Spring Boot 4.x and Spring Framework 7.x. ### [2.13.0] - 25-Dec-2022 ### Fixes @@ -382,9 +382,7 @@ Breaking change, for migration [see](./migration#1x-to-2x) [2.13.1]: https://repo1.maven.org/maven2/com/github/sonus21/rqueue-core/2.13.1-RELEASE -[3.0.1]: https://repo1.maven.org/maven2/com/github/sonus21/rqueue-core/3.0.0-RELEASE - -[3.1.0]: https://repo1.maven.org/maven2/com/github/sonus21/rqueue-core/3.1.0-RELEASE +[4.0.0]: https://repo1.maven.org/maven2/com/github/sonus21/rqueue-core/4.0.0-RELEASE [122]: https://github.com/sonus21/rqueue/issues/122 [193]: https://github.com/sonus21/rqueue/issues/193 diff --git a/docs/Gemfile b/docs/Gemfile index e2adad6a..322f83b1 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -1,4 +1,5 @@ source "https://rubygems.org" +ruby ">= 3.2.0" # Hello! This is where you manage which Jekyll version is used to run. # When you want to use a different version, change it below, save the # file and run `bundle install`. Run Jekyll with `bundle exec`, like so: diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index c60de44a..b00b227a 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -196,7 +196,7 @@ The `DefaultRqueueMessageConverter` handles serialization for most use cases, bu may fail if classes are not shared between producing and consuming applications. To avoid shared dependencies, consider using JSON-based converters like `com.github.sonus21.rqueue.converter.JsonMessageConverter` or Spring's -`MappingJackson2MessageConverter`. These serialize payloads into JSON, improving +`JacksonJsonMessageConverter`. These serialize payloads into JSON, improving interoperability. Other serialization formats like MessagePack or Protocol Buffers (ProtoBuf) can also @@ -209,4 +209,3 @@ be implemented based on your requirements. subsequent poll. The default value is `1`. If increased to `N`, the message will be retried `N` times consecutively within the same polling cycle. - diff --git a/docs/index.md b/docs/index.md index 7d7835d0..d84d524a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -50,8 +50,9 @@ frameworks. ### Requirements -* Spring 5+, 6+, 7+ -* Spring Boot 2+, 3+, 4+ +* Spring 6+, 7+ +* Spring Boot 3+, 4+ +* Java 21+ * Spring Reactive * Lettuce client for Redis cluster * Read master preference for Redis cluster @@ -80,17 +81,16 @@ Redis Cluster compatibility. Failure to do so may prevent the application from s ### Spring Boot {: .warning } -Use Rqueue Spring Boot Starter 4.x for Spring Boot 4.x, 3.x for Spring Boot 3.x, -and 2.x for Spring Boot 2.x. +Use Rqueue Spring Boot Starter 4.x for Spring Boot 4.x, and 3.x for Spring Boot 3.x. Download the latest version from [Maven Central][Boot Maven Central] and add the dependency to your project: -#### Spring Boot 2.x Setup +#### Spring Boot 4.x Setup * Gradle ```groovy - implementation 'com.github.sonus21:rqueue-spring-boot-starter:2.13.1-RELEASE' + implementation 'com.github.sonus21:rqueue-spring-boot-starter:4.0.0-RELEASE' ``` * Maven @@ -98,23 +98,7 @@ dependency to your project: com.github.sonus21 rqueue-spring-boot-starter - 2.13.1-RELEASE - - ``` - -#### Spring Boot 3.x Setup - -* Gradle - ```groovy - implementation 'com.github.sonus21:rqueue-spring-boot-starter:3.1.0-RELEASE' - ``` - -* Maven - ```xml - - com.github.sonus21 - rqueue-spring-boot-starter - 3.1.0-RELEASE + 4.0.0-RELEASE ``` @@ -123,33 +107,16 @@ dependency to your project: ### Spring Framework {: .warning } -Use Rqueue Spring 4.x for Spring Framework 7.x, 3.x for Spring Framework 6.x, -and 2.x for Spring Framework 5.x. +Use Rqueue Spring 4.x for Spring Framework 7.x, and 3.x for Spring Framework 6.x. Download the latest version from [Maven Central][Maven Central] and add the dependency to your project: -#### Spring Framework 5.x Setup - -* Gradle - ```groovy - implementation 'com.github.sonus21:rqueue-spring:2.13.1-RELEASE' - ``` - -* Maven - ```xml - - com.github.sonus21 - rqueue-spring - 2.13.1-RELEASE - - ``` - -#### Spring Framework 6.x Setup +#### Spring Framework 7.x Setup * Gradle ```groovy - implementation 'com.github.sonus21:rqueue-spring:3.1.0-RELEASE' + implementation 'com.github.sonus21:rqueue-spring:4.0.0-RELEASE' ``` * Maven @@ -157,7 +124,7 @@ dependency to your project: com.github.sonus21 rqueue-spring - 3.1.0-RELEASE + 4.0.0-RELEASE ``` diff --git a/docs/message-handling/queue-priority.md b/docs/message-handling/queue-priority.md index 665973b6..86d725f7 100644 --- a/docs/message-handling/queue-priority.md +++ b/docs/message-handling/queue-priority.md @@ -8,15 +8,18 @@ permalink: /priority --- Queue prioritization ensures that critical tasks are handled before lower-priority -ones. Rqueue supports two modes of priority handling: +ones. Rqueue supports three modes of priority handling: 1. **Weighted**: Polling frequency is based on numeric weights assigned to queues. -2. **Strict**: Higher-priority queues are always polled first. +2. **Strict**: Higher-priority queues are polled first, but starvation is considered + so lower-priority queues still get polling opportunities. +3. **Hard Strict**: Messages are always fetched from the highest-priority queue first, + moving top-down only when that queue has no available message. ### Configuring Priority To enable priority handling: -- Set `priorityMode` in the container factory to `STRICT` or `WEIGHTED`. +- Set `priorityMode` in the container factory to `WEIGHTED`, `STRICT`, or `HARD_STRICT`. - Use the `priority` field in the `@RqueueListener` annotation to assign weights or levels. - Use the `priorityGroup` field to group multiple related queues. By default, queues with specified priorities are added to a default group. @@ -49,19 +52,32 @@ For implementation details, see [WeightedPriorityPoller][WeightedPriorityPoller] ### Strict Priority -In strict mode, the poller always attempts to fetch messages from the highest-priority -queue first. +In strict mode, the poller prefers the highest-priority queue first, but it also +considers starvation so every queue continues to get polling chances over time. - The poller starts with Q1. - If Q1 is empty, it moves to Q2, then Q3. -- If a queue is empty, it becomes inactive for the duration of the +- If a queue is empty, it becomes inactive for the duration of the **polling interval**. -- To prevent total starvation of lower-priority queues, inactive queues become - eligible for polling again after a maximum of 1 minute, even if higher-priority - queues still have work. +- If messages are not fetched from a lower-priority queue for a certain interval, + that queue becomes eligible again so it can be polled even while higher-priority + queues continue to receive traffic. +- This gives lower-priority queues a chance to make progress and prevents permanent + starvation. For implementation details, see [StrictPriorityPoller][StrictPriorityPoller]. +### Hard Strict Priority + +In hard strict mode, the poller always follows a top-down priority order. + +- The poller starts with the highest-priority queue. +- It continues to fetch from that queue as long as messages are available. +- It moves to the next queue only when the current higher-priority queue has no + message available. +- This approach keeps the queue order fully top-down and may starve lower-priority + queues while higher-priority queues continue to receive traffic. + ### Additional Configuration * **`rqueue.add.default.queue.with.queue.level.priority`**: Determines if a "default" diff --git a/rqueue-core/build.gradle b/rqueue-core/build.gradle index 11829d29..ff0a78c6 100644 --- a/rqueue-core/build.gradle +++ b/rqueue-core/build.gradle @@ -40,7 +40,6 @@ mavenPublishing { } dependencies { - // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core api "tools.jackson.core:jackson-core:${jacksonVersion}" api "tools.jackson.core:jackson-databind:${jacksonVersion}" api "com.fasterxml.jackson.core:jackson-annotations:${jacksonAnnotationsVersion}" @@ -71,4 +70,4 @@ processResources { def contents = "Version: $version\n" new File(resourcesDir, "META-INF/RQUEUE.MF").text = contents } -} \ No newline at end of file +} diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/MessageListener.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/MessageListener.java index 0c6e3400..0376dc91 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/MessageListener.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/MessageListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/RqueueHandler.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/RqueueHandler.java index 6cd1ba34..36fc07c5 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/RqueueHandler.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/RqueueHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/RqueueListener.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/RqueueListener.java index 097ba36c..fc799d9f 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/RqueueListener.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/annotation/RqueueListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2024 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/ReactiveRqueueRedisTemplate.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/ReactiveRqueueRedisTemplate.java index 1bb179f2..4901590f 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/ReactiveRqueueRedisTemplate.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/ReactiveRqueueRedisTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/RqueueLockManager.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/RqueueLockManager.java index fc512444..a6dc1645 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/RqueueLockManager.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/RqueueLockManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/RqueueRedisTemplate.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/RqueueRedisTemplate.java index 936721af..a51ea14e 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/RqueueRedisTemplate.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/RqueueRedisTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -165,16 +165,14 @@ public void rename(List oldKeys, List newKeys) { } log.debug( "Pipeline result: {}", - RedisUtils.executePipeLine( - redisTemplate, - (connection, keySerializer, valueSerializer) -> { - for (int i = 0; i < srcKeys.size(); i++) { - // TODO fix cross slot error? - byte[] src = keySerializer.serialize(srcKeys.get(i)); - byte[] dst = keySerializer.serialize(dstKeys.get(i)); - connection.rename(src, dst); - } - })); + RedisUtils.executePipeLine(redisTemplate, (connection, keySerializer, valueSerializer) -> { + for (int i = 0; i < srcKeys.size(); i++) { + // TODO fix cross slot error? + byte[] src = keySerializer.serialize(srcKeys.get(i)); + byte[] dst = keySerializer.serialize(dstKeys.get(i)); + connection.rename(src, dst); + } + })); if (srcKeys.size() != oldKeys.size()) { List diff = new LinkedList<>(oldKeys); diff.removeAll(srcKeys); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/impl/RqueueLockManagerImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/impl/RqueueLockManagerImpl.java index 710ef315..ae5d8888 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/impl/RqueueLockManagerImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/common/impl/RqueueLockManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/MetricsProperties.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/MetricsProperties.java index dea2e81b..36926f38 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/MetricsProperties.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/MetricsProperties.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2025 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -18,11 +18,9 @@ import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Tags; - import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; - import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.StringUtils; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueConfig.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueConfig.java index e671a64f..f487d08f 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueConfig.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueListenerBaseConfig.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueListenerBaseConfig.java index d4154902..7bda3979 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueListenerBaseConfig.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueListenerBaseConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -168,9 +168,8 @@ protected RqueueMessageTemplate getMessageTemplate(RqueueConfig rqueueConfig) { if (simpleRqueueListenerContainerFactory.getRqueueMessageTemplate() != null) { return simpleRqueueListenerContainerFactory.getRqueueMessageTemplate(); } - simpleRqueueListenerContainerFactory.setRqueueMessageTemplate( - new RqueueMessageTemplateImpl( - rqueueConfig.getConnectionFactory(), rqueueConfig.getReactiveRedisConnectionFactory())); + simpleRqueueListenerContainerFactory.setRqueueMessageTemplate(new RqueueMessageTemplateImpl( + rqueueConfig.getConnectionFactory(), rqueueConfig.getReactiveRedisConnectionFactory())); return simpleRqueueListenerContainerFactory.getRqueueMessageTemplate(); } @@ -266,7 +265,7 @@ public RqueueInternalPubSubChannel rqueueInternalPubSubChannel( RqueueConfig rqueueConfig, RqueueBeanProvider rqueueBeanProvider, @Qualifier("stringRqueueRedisTemplate") - RqueueRedisTemplate stringRqueueRedisTemplate) { + RqueueRedisTemplate stringRqueueRedisTemplate) { return new RqueueInternalPubSubChannel( rqueueRedisListenerContainerFactory, rqueueMessageListenerContainer, diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueSchedulerConfig.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueSchedulerConfig.java index 32883179..becdb743 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueSchedulerConfig.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueSchedulerConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueWebConfig.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueWebConfig.java index 9e8a05ff..934f35a4 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueWebConfig.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/RqueueWebConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/SimpleRqueueListenerContainerFactory.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/SimpleRqueueListenerContainerFactory.java index b5d85f8c..9d214e5d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/SimpleRqueueListenerContainerFactory.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/config/SimpleRqueueListenerContainerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2025 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -306,13 +306,11 @@ public RqueueMessageListenerContainer createMessageListenerContainer() { notNull(redisConnectionFactory, "redisConnectionFactory must not be null"); notNull(messageConverterProvider, "messageConverterProvider must not be null"); if (rqueueMessageTemplate == null) { - rqueueMessageTemplate = - new RqueueMessageTemplateImpl( - getRedisConnectionFactory(), getReactiveRedisConnectionFactory()); + rqueueMessageTemplate = new RqueueMessageTemplateImpl( + getRedisConnectionFactory(), getReactiveRedisConnectionFactory()); } - RqueueMessageListenerContainer messageListenerContainer = - new RqueueMessageListenerContainer( - getRqueueMessageHandler(messageConverterProvider), rqueueMessageTemplate); + RqueueMessageListenerContainer messageListenerContainer = new RqueueMessageListenerContainer( + getRqueueMessageHandler(messageConverterProvider), rqueueMessageTemplate); messageListenerContainer.setAutoStartup(autoStartup); if (taskExecutor != null) { messageListenerContainer.setTaskExecutor(taskExecutor); @@ -352,7 +350,8 @@ public RqueueMessageListenerContainer createMessageListenerContainer() { messageListenerContainer.setMessageHeaders(messageHeaders); } if (hardStrictPriorityPollerProperties != null) { - messageListenerContainer.setHardStrictPriorityPollerProperties(hardStrictPriorityPollerProperties); + messageListenerContainer.setHardStrictPriorityPollerProperties( + hardStrictPriorityPollerProperties); } return messageListenerContainer; } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/DefaultMessageConverterProvider.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/DefaultMessageConverterProvider.java index 665b4d56..3c4c57d7 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/DefaultMessageConverterProvider.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/DefaultMessageConverterProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/GenericMessageConverter.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/GenericMessageConverter.java index c2fccea2..8a21ef5b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/GenericMessageConverter.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/GenericMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/JsonMessageConverter.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/JsonMessageConverter.java index 3ee447d3..79fad251 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/JsonMessageConverter.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/JsonMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; -import org.springframework.messaging.converter.JacksonJsonMessageConverter; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.support.GenericMessage; import tools.jackson.core.JacksonException; @@ -37,7 +36,7 @@ *

Target class is null till the time method arguments are not resolved, once method arguments * are resolved then it will become non-null. * - * @see JacksonJsonMessageConverter + * @see org.springframework.messaging.converter.JacksonJsonMessageConverter */ @Slf4j public class JsonMessageConverter implements MessageConverter { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/MessageConverterProvider.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/MessageConverterProvider.java index abb3b3ae..8467618e 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/MessageConverterProvider.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/MessageConverterProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import com.github.sonus21.rqueue.core.DefaultRqueueMessageConverter; import org.springframework.messaging.Message; import org.springframework.messaging.converter.CompositeMessageConverter; +import org.springframework.messaging.converter.JacksonJsonMessageConverter; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.converter.SmartMessageConverter; @@ -40,6 +41,7 @@ * @see CompositeMessageConverter * @see SmartMessageConverter * @see DefaultRqueueMessageConverter + * @see JacksonJsonMessageConverter * @see MappingJackson2MessageConverter */ public interface MessageConverterProvider { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/RqueueRedisSerializer.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/RqueueRedisSerializer.java index b37388bc..c82b94ce 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/RqueueRedisSerializer.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/converter/RqueueRedisSerializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -68,11 +68,15 @@ private static class RqueueRedisSerDes implements RedisSerializer { private ObjectMapper mapper; RqueueRedisSerDes() { - this.mapper = SerializationUtils.createObjectMapper().rebuild() + this.mapper = SerializationUtils.createObjectMapper() + .rebuild() .addModule(new SimpleModule().addSerializer(new NullValueSerializer())) - .activateDefaultTyping(BasicPolymorphicTypeValidator.builder() - .allowIfSubType(Object.class) - .build(), DefaultTyping.NON_FINAL, As.PROPERTY) + .activateDefaultTyping( + BasicPolymorphicTypeValidator.builder() + .allowIfSubType(Object.class) + .build(), + DefaultTyping.NON_FINAL, + As.PROPERTY) .build(); } @@ -111,7 +115,9 @@ private static class NullValueSerializer extends StdSerializer { } @Override - public void serialize(NullValue value, JsonGenerator jsonGenerator, SerializationContext provider) throws JacksonException { + public void serialize( + NullValue value, JsonGenerator jsonGenerator, SerializationContext provider) + throws JacksonException { jsonGenerator.writeStartObject(); jsonGenerator.writeStringProperty(classIdentifier, NullValue.class.getName()); jsonGenerator.writeEndObject(); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/DefaultRqueueMessageConverter.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/DefaultRqueueMessageConverter.java index 0825f786..506b72d0 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/DefaultRqueueMessageConverter.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/DefaultRqueueMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/EndpointRegistry.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/EndpointRegistry.java index 3dd16976..8c496659 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/EndpointRegistry.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/EndpointRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -39,8 +39,7 @@ public final class EndpointRegistry { private static final Object lock = new Object(); private static final Map queueNameToDetail = new HashMap<>(); - private EndpointRegistry() { - } + private EndpointRegistry() {} /** * Get QueueDetail for the given queue. If queue is having priority than it should be called with @@ -95,11 +94,10 @@ public static void delete() { public static List getActiveQueues() { synchronized (lock) { - List queues = - queueNameToDetail.values().stream() - .filter(QueueDetail::isActive) - .map(QueueDetail::getName) - .collect(Collectors.toList()); + List queues = queueNameToDetail.values().stream() + .filter(QueueDetail::isActive) + .map(QueueDetail::getName) + .collect(Collectors.toList()); lock.notifyAll(); return queues; } @@ -107,10 +105,9 @@ public static List getActiveQueues() { public static List getActiveQueueDetails() { synchronized (lock) { - List queueDetails = - queueNameToDetail.values().stream() - .filter(QueueDetail::isActive) - .collect(Collectors.toList()); + List queueDetails = queueNameToDetail.values().stream() + .filter(QueueDetail::isActive) + .collect(Collectors.toList()); lock.notifyAll(); return queueDetails; } @@ -118,10 +115,9 @@ public static List getActiveQueueDetails() { public static Map getActiveQueueMap() { synchronized (lock) { - Map queueDetails = - queueNameToDetail.values().stream() - .filter(QueueDetail::isActive) - .collect(Collectors.toMap(QueueDetail::getName, Function.identity())); + Map queueDetails = queueNameToDetail.values().stream() + .filter(QueueDetail::isActive) + .collect(Collectors.toMap(QueueDetail::getName, Function.identity())); lock.notifyAll(); return queueDetails; } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/Job.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/Job.java index 840d10c0..6f22d358 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/Job.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/Job.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/MessageScheduler.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/MessageScheduler.java index 2998b6ad..83d20cc9 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/MessageScheduler.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/MessageScheduler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import com.github.sonus21.rqueue.models.event.RqueueBootstrapEvent; import com.github.sonus21.rqueue.utils.Constants; import com.github.sonus21.rqueue.utils.ThreadUtils; +import com.google.common.annotations.VisibleForTesting; import java.time.Duration; import java.util.Arrays; import java.util.List; @@ -33,7 +34,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.ScheduledFuture; -import com.google.common.annotations.VisibleForTesting; import org.slf4j.Logger; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.annotation.Autowired; @@ -48,14 +48,17 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -public abstract class MessageScheduler implements DisposableBean, - ApplicationListener { +public abstract class MessageScheduler + implements DisposableBean, ApplicationListener { private final Object monitor = new Object(); + @Autowired protected RqueueSchedulerConfig rqueueSchedulerConfig; + @Autowired protected RqueueConfig rqueueConfig; + private RedisScript redisScript; private DefaultScriptExecutor defaultScriptExecutor; private Map queueRunningState; @@ -66,12 +69,14 @@ public abstract class MessageScheduler implements DisposableBean, protected RedisScheduleTriggerHandler redisScheduleTriggerHandler; private ThreadPoolTaskScheduler scheduler; + @Autowired private RqueueRedisListenerContainerFactory rqueueRedisListenerContainerFactory; @Autowired @Qualifier("rqueueRedisLongTemplate") private RedisTemplate redisTemplate; + private Map errorCount; protected abstract Logger getLogger(); @@ -152,13 +157,13 @@ private void waitForRunningQueuesToStop() { scheduledFuture, rqueueSchedulerConfig.getTerminationWaitTime(), "An exception occurred while stopping scheduler queue '{}'", - queueName - ); + queueName); } } private void stopQueue(String queueName) { - Assert.isTrue(queueRunningState.containsKey(queueName), + Assert.isTrue( + queueRunningState.containsKey(queueName), "Queue with name '" + queueName + "' does not exist"); queueRunningState.put(queueName, false); } @@ -305,7 +310,7 @@ private List scriptKeys() { private Object[] scriptArgs() { long currentTime = System.currentTimeMillis(); - return new Object[]{currentTime, getMessageCount(), processingQueue ? 1 : 0}; + return new Object[] {currentTime, getMessageCount(), processingQueue ? 1 : 0}; } private boolean shouldSkip(long currentTime) { @@ -342,5 +347,4 @@ public String getName() { return this.name; } } - } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ProcessingQueueMessageScheduler.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ProcessingQueueMessageScheduler.java index 276a0903..e89035a8 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ProcessingQueueMessageScheduler.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ProcessingQueueMessageScheduler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -19,11 +19,9 @@ import static java.lang.Long.max; import com.github.sonus21.rqueue.listener.QueueDetail; -import java.time.Duration; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import com.github.sonus21.rqueue.utils.Constants; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ReactiveRqueueMessageEnqueuer.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ReactiveRqueueMessageEnqueuer.java index cdbe0ecc..e989003b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ReactiveRqueueMessageEnqueuer.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ReactiveRqueueMessageEnqueuer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RedisScheduleTriggerHandler.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RedisScheduleTriggerHandler.java index 4fb41d1b..ea94695d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RedisScheduleTriggerHandler.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RedisScheduleTriggerHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -18,17 +18,16 @@ import com.github.sonus21.rqueue.config.RqueueSchedulerConfig; import com.github.sonus21.rqueue.utils.ThreadUtils; import com.google.common.annotations.VisibleForTesting; -import org.slf4j.Logger; -import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.connection.MessageListener; -import org.springframework.data.redis.listener.ChannelTopic; - import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.function.Function; +import org.slf4j.Logger; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.listener.ChannelTopic; class RedisScheduleTriggerHandler { @@ -41,17 +40,23 @@ class RedisScheduleTriggerHandler { @VisibleForTesting Map queueNameToLastRunTime; + @VisibleForTesting Map> queueNameToFuture; + @VisibleForTesting Map channelNameToQueueName; + @VisibleForTesting MessageListener messageListener; - RedisScheduleTriggerHandler(Logger logger, + RedisScheduleTriggerHandler( + Logger logger, RqueueRedisListenerContainerFactory rqueueRedisListenerContainerFactory, - RqueueSchedulerConfig rqueueSchedulerConfig, List queueNames, - Function> scheduler, Function channelNameProducer) { + RqueueSchedulerConfig rqueueSchedulerConfig, + List queueNames, + Function> scheduler, + Function channelNameProducer) { this.queueNames = queueNames; this.rqueueSchedulerConfig = rqueueSchedulerConfig; this.rqueueRedisListenerContainerFactory = rqueueRedisListenerContainerFactory; @@ -80,8 +85,12 @@ void startQueue(String queueName) { void stopQueue(String queueName) { Future future = queueNameToFuture.get(queueName); - ThreadUtils.waitForTermination(logger, future, rqueueSchedulerConfig.getTerminationWaitTime(), - "An exception occurred while stopping scheduler queue '{}'", queueName); + ThreadUtils.waitForTermination( + logger, + future, + rqueueSchedulerConfig.getTerminationWaitTime(), + "An exception occurred while stopping scheduler queue '{}'", + queueName); queueNameToLastRunTime.put(queueName, 0L); queueNameToFuture.remove(queueName); unsubscribeFromRedis(queueName); @@ -90,8 +99,8 @@ void stopQueue(String queueName) { private void unsubscribeFromRedis(String queueName) { String channelName = channelNameProducer.apply(queueName); logger.debug("Queue {} unsubscribe from channel {}", queueName, channelName); - rqueueRedisListenerContainerFactory.removeMessageListener(messageListener, - new ChannelTopic(channelName)); + rqueueRedisListenerContainerFactory.removeMessageListener( + messageListener, new ChannelTopic(channelName)); channelNameToQueueName.put(channelName, queueName); } @@ -99,15 +108,14 @@ private void subscribeToRedisTopic(String queueName) { String channelName = channelNameProducer.apply(queueName); channelNameToQueueName.put(channelName, queueName); logger.debug("Queue {} subscribe to channel {}", queueName, channelName); - rqueueRedisListenerContainerFactory.addMessageListener(messageListener, - new ChannelTopic(channelName)); + rqueueRedisListenerContainerFactory.addMessageListener( + messageListener, new ChannelTopic(channelName)); } protected long getMinDelay() { return rqueueSchedulerConfig.minMessageMoveDelay(); } - /** * This MessageListener listen the event from Redis, its expected that the event should be only * raised when elements in the ZSET are lagging behind current time. @@ -126,8 +134,8 @@ private void schedule(String queueName, long currentTime) { private void handleMessage(String queueName, long startTime) { long currentTime = System.currentTimeMillis(); if (startTime > currentTime) { - logger.warn("Received message body is not correct queue: {}, time: {}", queueName, - startTime); + logger.warn( + "Received message body is not correct queue: {}, time: {}", queueName, startTime); return; } long lastRunTime = queueNameToLastRunTime.get(queueName); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RedisScriptFactory.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RedisScriptFactory.java index b3f7b900..17cf4a09 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RedisScriptFactory.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RedisScriptFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueBeanProvider.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueBeanProvider.java index 914cc89b..f0512f57 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueBeanProvider.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueBeanProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -36,14 +36,19 @@ public class RqueueBeanProvider { @Autowired private RqueueMessageMetadataService rqueueMessageMetadataService; + @Autowired private RqueueSystemConfigDao rqueueSystemConfigDao; + @Autowired private RqueueJobDao rqueueJobDao; + @Autowired private RqueueWebConfig rqueueWebConfig; + @Autowired private ApplicationEventPublisher applicationEventPublisher; + @Autowired private RqueueLockManager rqueueLockManager; @@ -54,8 +59,10 @@ public class RqueueBeanProvider { private RqueueMessageHandler rqueueMessageHandler; private MessageProcessor preExecutionMessageProcessor; + @Autowired private RqueueMessageTemplate rqueueMessageTemplate; + @Autowired private RqueueConfig rqueueConfig; } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueEndpointManager.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueEndpointManager.java index 78902122..c08627a6 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueEndpointManager.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueEndpointManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueInternalPubSubChannel.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueInternalPubSubChannel.java index c7c73b8c..55539d78 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueInternalPubSubChannel.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueInternalPubSubChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -132,10 +132,9 @@ private void handlePauseEvent(PauseUnpauseQueueRequest request) { String lockKey = Constants.getQueueCrudLockKey(rqueueConfig, request.getName()); String lockValue = UUID.randomUUID().toString(); try { - boolean acquired = - rqueueBeanProvider - .getRqueueLockManager() - .acquireLock(lockKey, lockValue, Duration.ofMillis(100)); + boolean acquired = rqueueBeanProvider + .getRqueueLockManager() + .acquireLock(lockKey, lockValue, Duration.ofMillis(100)); if (acquired) { rqueueMessageListenerContainer.pauseUnpauseQueue(request.getName(), request.isPause()); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessage.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessage.java index 1017198a..10c958b9 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessage.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageEnqueuer.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageEnqueuer.java index a116048a..903ccc60 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageEnqueuer.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageEnqueuer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageManager.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageManager.java index 009642ac..2cdb1ae8 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageManager.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -209,5 +209,4 @@ boolean moveMessageFromDeadLetterToQueue( * @return success or failure */ boolean moveMessageFromDeadLetterToQueue(String deadLetterQueueName, String queueName); - } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageTemplate.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageTemplate.java index caf2e25f..ff3fc097 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageTemplate.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueMessageTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueRedisListenerContainerFactory.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueRedisListenerContainerFactory.java index 1b6cf3ed..f615164f 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueRedisListenerContainerFactory.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/RqueueRedisListenerContainerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ public class RqueueRedisListenerContainerFactory @Autowired private RqueueSchedulerConfig rqueueSchedulerConfig; + @Autowired private RqueueConfig rqueueConfig; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ScheduledQueueMessageScheduler.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ScheduledQueueMessageScheduler.java index ac660b09..beedce52 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ScheduledQueueMessageScheduler.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/ScheduledQueueMessageScheduler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/context/Context.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/context/Context.java index a9210ce4..b1fec501 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/context/Context.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/context/Context.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/context/DefaultContext.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/context/DefaultContext.java index 4e99179e..513c1f21 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/context/DefaultContext.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/context/DefaultContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/BaseMessageSender.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/BaseMessageSender.java index 3002a204..55ff06c8 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/BaseMessageSender.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/BaseMessageSender.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -51,9 +51,15 @@ abstract class BaseMessageSender { protected final MessageHeaders messageHeaders; protected final MessageConverter messageConverter; protected final RqueueMessageTemplate messageTemplate; - @Autowired protected RqueueStringDao rqueueStringDao; - @Autowired protected RqueueConfig rqueueConfig; - @Autowired protected RqueueMessageMetadataService rqueueMessageMetadataService; + + @Autowired + protected RqueueStringDao rqueueStringDao; + + @Autowired + protected RqueueConfig rqueueConfig; + + @Autowired + protected RqueueMessageMetadataService rqueueMessageMetadataService; BaseMessageSender( RqueueMessageTemplate messageTemplate, @@ -113,15 +119,14 @@ protected String pushMessage( Long delayInMilliSecs, boolean isUnique) { QueueDetail queueDetail = EndpointRegistry.get(queueName); - RqueueMessage rqueueMessage = - buildMessage( - messageConverter, - queueName, - messageId, - message, - retryCount, - delayInMilliSecs, - messageHeaders); + RqueueMessage rqueueMessage = buildMessage( + messageConverter, + queueName, + messageId, + message, + retryCount, + delayInMilliSecs, + messageHeaders); try { storeMessageMetadata(rqueueMessage, delayInMilliSecs, false, isUnique); enqueue(queueDetail, rqueueMessage, delayInMilliSecs, false); @@ -139,20 +144,16 @@ protected String pushMessage( } protected String pushPeriodicMessage( - String queueName, - String messageId, - Object message, - long periodInMilliSeconds) { + String queueName, String messageId, Object message, long periodInMilliSeconds) { QueueDetail queueDetail = EndpointRegistry.get(queueName); - RqueueMessage rqueueMessage = - buildPeriodicMessage( - messageConverter, - queueName, - messageId, - message, - null, - periodInMilliSeconds, - messageHeaders); + RqueueMessage rqueueMessage = buildPeriodicMessage( + messageConverter, + queueName, + messageId, + message, + null, + periodInMilliSeconds, + messageHeaders); try { storeMessageMetadata(rqueueMessage, periodInMilliSeconds, false, false); enqueue(queueDetail, rqueueMessage, periodInMilliSeconds, false); @@ -165,7 +166,8 @@ protected String pushPeriodicMessage( protected Object deleteAllMessages(QueueDetail queueDetail) { return MessageSweeper.getInstance(rqueueConfig, messageTemplate, rqueueMessageMetadataService) - .deleteAllMessages(MessageDeleteRequest.builder().queueDetail(queueDetail).build()); + .deleteAllMessages( + MessageDeleteRequest.builder().queueDetail(queueDetail).build()); } protected void registerQueueInternal(String queueName, String... priorities) { @@ -177,33 +179,30 @@ protected void registerQueueInternal(String queueName, String... priorities) { priorityMap.put(priority, 1); } - QueueDetail queueDetail = - QueueDetail.builder() - .name(queueName) - .active(false) - .queueName(rqueueConfig.getQueueName(queueName)) - .scheduledQueueName(rqueueConfig.getScheduledQueueName(queueName)) - .scheduledQueueChannelName(rqueueConfig.getScheduledQueueChannelName(queueName)) - .processingQueueName(rqueueConfig.getProcessingQueueName(queueName)) - .processingQueueChannelName(rqueueConfig.getProcessingQueueChannelName(queueName)) - .priority(priorityMap) - .build(); + QueueDetail queueDetail = QueueDetail.builder() + .name(queueName) + .active(false) + .queueName(rqueueConfig.getQueueName(queueName)) + .scheduledQueueName(rqueueConfig.getScheduledQueueName(queueName)) + .scheduledQueueChannelName(rqueueConfig.getScheduledQueueChannelName(queueName)) + .processingQueueName(rqueueConfig.getProcessingQueueName(queueName)) + .processingQueueChannelName(rqueueConfig.getProcessingQueueChannelName(queueName)) + .priority(priorityMap) + .build(); EndpointRegistry.register(queueDetail); for (String priority : priorities) { String suffix = PriorityUtils.getSuffix(priority); - queueDetail = - QueueDetail.builder() - .name(queueName + suffix) - .active(false) - .queueName(rqueueConfig.getQueueName(queueName) + suffix) - .scheduledQueueName(rqueueConfig.getScheduledQueueName(queueName) + suffix) - .scheduledQueueChannelName( - rqueueConfig.getScheduledQueueChannelName(queueName) + suffix) - .processingQueueName(rqueueConfig.getProcessingQueueName(queueName) + suffix) - .processingQueueChannelName( - rqueueConfig.getProcessingQueueChannelName(queueName) + suffix) - .priority(Collections.singletonMap(DEFAULT_PRIORITY_KEY, 1)) - .build(); + queueDetail = QueueDetail.builder() + .name(queueName + suffix) + .active(false) + .queueName(rqueueConfig.getQueueName(queueName) + suffix) + .scheduledQueueName(rqueueConfig.getScheduledQueueName(queueName) + suffix) + .scheduledQueueChannelName(rqueueConfig.getScheduledQueueChannelName(queueName) + suffix) + .processingQueueName(rqueueConfig.getProcessingQueueName(queueName) + suffix) + .processingQueueChannelName( + rqueueConfig.getProcessingQueueChannelName(queueName) + suffix) + .priority(Collections.singletonMap(DEFAULT_PRIORITY_KEY, 1)) + .build(); EndpointRegistry.register(queueDetail); } } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/MessageSweeper.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/MessageSweeper.java index 9f3d7509..b8279c84 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/MessageSweeper.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/MessageSweeper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -199,10 +199,9 @@ private List getMessageIds(DeleteJobData data) { public void delete(DeleteJobData data) { for (List subIds : ListUtils.partition(getMessageIds(data), batchSize)) { - List messageMetaIds = - subIds.stream() - .map(e -> RqueueMessageUtils.getMessageMetaId(queueName, e)) - .collect(Collectors.toList()); + List messageMetaIds = subIds.stream() + .map(e -> RqueueMessageUtils.getMessageMetaId(queueName, e)) + .collect(Collectors.toList()); rqueueMessageMetadataService.deleteAll(messageMetaIds); log.debug("Deleted {} messages meta", messageMetaIds.size()); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/ReactiveRqueueMessageEnqueuerImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/ReactiveRqueueMessageEnqueuerImpl.java index bf752c0b..78769118 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/ReactiveRqueueMessageEnqueuerImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/ReactiveRqueueMessageEnqueuerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2025 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -26,15 +26,13 @@ import com.github.sonus21.rqueue.exception.DuplicateMessageException; import com.github.sonus21.rqueue.listener.QueueDetail; import com.github.sonus21.rqueue.utils.PriorityUtils; +import java.util.function.Function; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.converter.MessageConverter; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.function.BiFunction; -import java.util.function.Function; - @Slf4j public class ReactiveRqueueMessageEnqueuerImpl extends BaseMessageSender implements ReactiveRqueueMessageEnqueuer { @@ -57,37 +55,34 @@ private Mono pushReactiveMessage( boolean isUnique, Function> monoConverter) { QueueDetail queueDetail = EndpointRegistry.get(queueName); - RqueueMessage rqueueMessage = - builder.build( - messageConverter, - queueName, - messageId, - message, - retryCount, - delayInMilliSecs, - messageHeaders); + RqueueMessage rqueueMessage = builder.build( + messageConverter, + queueName, + messageId, + message, + retryCount, + delayInMilliSecs, + messageHeaders); try { Mono storeResult = (Mono) storeMessageMetadata(rqueueMessage, delayInMilliSecs, true, isUnique); - return storeResult.flatMap( - success -> { - if (Boolean.TRUE.equals(success)) { - Object result = enqueue(queueDetail, rqueueMessage, delayInMilliSecs, true); - Mono enqueueMono; - if (result instanceof Flux) { - enqueueMono = ((Flux) result).next(); - } else if (result instanceof Mono) { - enqueueMono = (Mono) result; - } else { - return Mono.error( - new IllegalStateException( - "Unexpected enqueue result type: " + result.getClass())); - } - return enqueueMono.flatMap(ignore -> monoConverter.apply(rqueueMessage)); - } else { - return Mono.error(new DuplicateMessageException(rqueueMessage.getId())); - } - }); + return storeResult.flatMap(success -> { + if (Boolean.TRUE.equals(success)) { + Object result = enqueue(queueDetail, rqueueMessage, delayInMilliSecs, true); + Mono enqueueMono; + if (result instanceof Flux) { + enqueueMono = ((Flux) result).next(); + } else if (result instanceof Mono) { + enqueueMono = (Mono) result; + } else { + return Mono.error( + new IllegalStateException("Unexpected enqueue result type: " + result.getClass())); + } + return enqueueMono.flatMap(ignore -> monoConverter.apply(rqueueMessage)); + } else { + return Mono.error(new DuplicateMessageException(rqueueMessage.getId())); + } + }); } catch (Exception e) { log.error( "Failed to enqueue message [{}] to queue [{}]", rqueueMessage.getId(), queueName, e); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueEndpointManagerImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueEndpointManagerImpl.java index 4f4e7f48..44197ad3 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueEndpointManagerImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueEndpointManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ public class RqueueEndpointManagerImpl extends BaseMessageSender implements Rque @Autowired private RqueueUtilityService rqueueUtilityService; + @Autowired private RqueueSystemConfigDao rqueueSystemConfigDao; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageEnqueuerImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageEnqueuerImpl.java index e4f4fc04..c1fabab5 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageEnqueuerImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageEnqueuerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -27,12 +27,11 @@ import com.github.sonus21.rqueue.core.RqueueMessageEnqueuer; import com.github.sonus21.rqueue.core.RqueueMessageTemplate; import com.github.sonus21.rqueue.utils.PriorityUtils; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.converter.MessageConverter; -import java.util.Objects; - @Slf4j public class RqueueMessageEnqueuerImpl extends BaseMessageSender implements RqueueMessageEnqueuer { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageManagerImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageManagerImpl.java index 9e63256b..9de4e7c6 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageManagerImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -25,7 +25,6 @@ import com.github.sonus21.rqueue.core.RqueueMessageManager; import com.github.sonus21.rqueue.core.RqueueMessageTemplate; import com.github.sonus21.rqueue.core.support.RqueueMessageUtils; -import com.github.sonus21.rqueue.exception.LockCanNotBeAcquired; import com.github.sonus21.rqueue.listener.QueueDetail; import com.github.sonus21.rqueue.listener.RqueueMessageHeaders; import com.github.sonus21.rqueue.models.MessageMoveResult; @@ -34,7 +33,6 @@ import java.time.Duration; import java.util.ArrayList; import java.util.List; -import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.Message; @@ -82,9 +80,8 @@ public Object getMessage(String queueName, String id) { if (rqueueMessage == null) { return null; } - Message message = - MessageBuilder.createMessage( - rqueueMessage.getMessage(), RqueueMessageHeaders.emptyMessageHeaders()); + Message message = MessageBuilder.createMessage( + rqueueMessage.getMessage(), RqueueMessageHeaders.emptyMessageHeaders()); return messageConverter.fromMessage(message, null); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageTemplateImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageTemplateImpl.java index f121e775..2a2d5b03 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageTemplateImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/impl/RqueueMessageTemplateImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -66,10 +66,9 @@ public RqueueMessageTemplateImpl( if (reactiveRedisConnectionFactory != null) { this.reactiveRedisTemplate = new ReactiveRqueueRedisTemplate<>(reactiveRedisConnectionFactory); - this.reactiveScriptExecutor = - new DefaultReactiveScriptExecutor<>( - reactiveRedisConnectionFactory, - RedisUtils.redisSerializationContextProvider.getSerializationContext()); + this.reactiveScriptExecutor = new DefaultReactiveScriptExecutor<>( + reactiveRedisConnectionFactory, + RedisUtils.redisSerializationContextProvider.getSerializationContext()); } else { this.reactiveScriptExecutor = null; this.reactiveRedisTemplate = null; @@ -89,13 +88,12 @@ public List pop( } long currentTime = System.currentTimeMillis(); RedisScript> script = getScript(ScriptType.DEQUEUE_MESSAGE); - List messages = - scriptExecutor.execute( - script, - Arrays.asList(queueName, processingQueueName, processingChannelName), - currentTime, - currentTime + visibilityTimeout, - count); + List messages = scriptExecutor.execute( + script, + Arrays.asList(queueName, processingQueueName, processingChannelName), + currentTime, + currentTime + visibilityTimeout, + count); log.debug("Pop Queue: {}, N: {}, Messages: {}", queueName, count, messages); return messages; } @@ -153,13 +151,12 @@ public void moveMessageWithDelay( tgtZsetName, tgt); RedisScript script = getScript(ScriptType.MOVE_MESSAGE_TO_ZSET); - Long response = - scriptExecutor.execute( - script, - Arrays.asList(srcZsetName, tgtZsetName), - src, - tgt, - System.currentTimeMillis() + delay); + Long response = scriptExecutor.execute( + script, + Arrays.asList(srcZsetName, tgtZsetName), + src, + tgt, + System.currentTimeMillis() + delay); if (response == null) { log.error("Duplicate processing for the message {}", src); } @@ -247,9 +244,8 @@ public MessageMoveResult moveMessageListToZset( int remainingMessages = maxMessage; while (messagesInList > 0 && remainingMessages > 0) { long messageCount = Math.min(remainingMessages, Constants.MAX_MESSAGES); - messagesInList = - scriptExecutor.execute( - script, Arrays.asList(sourceList, destinationZset), messageCount, score); + messagesInList = scriptExecutor.execute( + script, Arrays.asList(sourceList, destinationZset), messageCount, score); remainingMessages -= messageCount; } return new MessageMoveResult(maxMessage - remainingMessages, true); @@ -267,13 +263,8 @@ public MessageMoveResult moveMessageZsetToZset( int remainingMessages = maxMessage; while (messageInZset > 0 && remainingMessages > 0) { long messageCount = Math.min(remainingMessages, Constants.MAX_MESSAGES); - messageInZset = - scriptExecutor.execute( - script, - Arrays.asList(sourceZset, destinationZset), - messageCount, - newScore, - fixedScore); + messageInZset = scriptExecutor.execute( + script, Arrays.asList(sourceZset, destinationZset), messageCount, newScore, fixedScore); remainingMessages -= messageCount; } return new MessageMoveResult(maxMessage - remainingMessages, true); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/ContextMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/ContextMiddleware.java index 56547d7f..dcd993a1 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/ContextMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/ContextMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/HandlerMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/HandlerMiddleware.java index ff8d7e06..027053fe 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/HandlerMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/HandlerMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -38,15 +38,14 @@ public HandlerMiddleware(RqueueMessageHandler rqueueMessageHandler) { public void handle(Job job, Callable next) throws Exception { Execution execution = job.getLatestExecution(); RqueueMessage rqueueMessage = job.getRqueueMessage(); - Message message = - MessageBuilder.createMessage( - rqueueMessage.getMessage(), - buildMessageHeaders( - job.getQueueDetail().getName(), - rqueueMessage, - job, - execution, - rqueueMessage.getMessageHeaders())); + Message message = MessageBuilder.createMessage( + rqueueMessage.getMessage(), + buildMessageHeaders( + job.getQueueDetail().getName(), + rqueueMessage, + job, + execution, + rqueueMessage.getMessageHeaders())); rqueueMessageHandler.handleMessage(message); } } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/LockMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/LockMiddleware.java index 98fddba0..f6e738f2 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/LockMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/LockMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/LoggingMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/LoggingMiddleware.java index 814ce219..45bfe96b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/LoggingMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/LoggingMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/Middleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/Middleware.java index d3847c7b..c18f0a16 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/Middleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/Middleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/PermissionMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/PermissionMiddleware.java index 97688a45..9ac759d9 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/PermissionMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/PermissionMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/ProfilerMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/ProfilerMiddleware.java index 9a0f1df7..f1980f2d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/ProfilerMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/ProfilerMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/RateLimiterMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/RateLimiterMiddleware.java index 2e897d1c..68474fc0 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/RateLimiterMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/RateLimiterMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/RedisLockMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/RedisLockMiddleware.java index 2bbdd4ff..4601ea67 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/RedisLockMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/RedisLockMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/TimeProviderMiddleware.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/TimeProviderMiddleware.java index cc2d3939..0a81f3d8 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/TimeProviderMiddleware.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/middleware/TimeProviderMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/support/MessageProcessor.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/support/MessageProcessor.java index 076d3ff8..6240df2a 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/support/MessageProcessor.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/support/MessageProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/support/RqueueMessageUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/support/RqueueMessageUtils.java index 20845c77..967ad14f 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/support/RqueueMessageUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/core/support/RqueueMessageUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -33,8 +33,7 @@ public final class RqueueMessageUtils { private static final String META_DATA_KEY_PREFIX = "__rq::m-mdata::"; - private RqueueMessageUtils() { - } + private RqueueMessageUtils() {} public static String getMessageMetaId(String queueName, String messageId) { return META_DATA_KEY_PREFIX + queueName + REDIS_KEY_SEPARATOR + messageId; @@ -72,15 +71,14 @@ public static RqueueMessage buildPeriodicMessage( } else { throw new MessageConversionException("Message payload is neither String nor byte[]"); } - RqueueMessage rqueueMessage = - RqueueMessage.builder() - .id(UUID.randomUUID().toString()) - .queueName(queueName) - .message(strMessage) - .processAt(processAt) - .retryCount(retryCount) - .period(period) - .build(); + RqueueMessage rqueueMessage = RqueueMessage.builder() + .id(UUID.randomUUID().toString()) + .queueName(queueName) + .message(strMessage) + .processAt(processAt) + .retryCount(retryCount) + .period(period) + .build(); if (messageId != null) { rqueueMessage.setId(messageId); } @@ -113,15 +111,14 @@ public static RqueueMessage buildMessage( } else { throw new MessageConversionException("Message payload is neither String nor byte[]"); } - RqueueMessage rqueueMessage = - RqueueMessage.builder() - .retryCount(retryCount) - .queuedTime(queuedTime) - .id(UUID.randomUUID().toString()) - .queueName(queueName) - .message(strMessage) - .processAt(processAt) - .build(); + RqueueMessage rqueueMessage = RqueueMessage.builder() + .retryCount(retryCount) + .queuedTime(queuedTime) + .id(UUID.randomUUID().toString()) + .queueName(queueName) + .message(strMessage) + .processAt(processAt) + .build(); if (messageId != null) { rqueueMessage.setId(messageId); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueJobDao.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueJobDao.java index 88c237d8..7a9b3123 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueJobDao.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueJobDao.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueMessageMetadataDao.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueMessageMetadataDao.java index 05be7034..e1821564 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueMessageMetadataDao.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueMessageMetadataDao.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2025 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueQStatsDao.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueQStatsDao.java index 14f263ff..01c2fc8b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueQStatsDao.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueQStatsDao.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueStringDao.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueStringDao.java index fa07895d..09c330e8 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueStringDao.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueStringDao.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueSystemConfigDao.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueSystemConfigDao.java index b94ad66c..b741a707 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueSystemConfigDao.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/RqueueSystemConfigDao.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueJobDaoImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueJobDaoImpl.java index 86cea047..91500b86 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueJobDaoImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueJobDaoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueMessageMetadataDaoImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueMessageMetadataDaoImpl.java index ba6c2fa0..1fa8e961 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueMessageMetadataDaoImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueMessageMetadataDaoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2025 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -58,14 +58,14 @@ public List findAll(Collection ids) { } @Override - public void save(MessageMetadata messageMetadata, Duration duration,boolean checkUniqueNess) { + public void save(MessageMetadata messageMetadata, Duration duration, boolean checkUniqueNess) { Assert.notNull(messageMetadata.getId(), "messageMetadata id cannot be null"); - if(checkUniqueNess){ - Boolean value = template.setIfAbsent(messageMetadata.getId(), messageMetadata, duration); - if(Boolean.FALSE.equals(value)){ - throw new DuplicateMessageException(messageMetadata.getId()); - } - return; + if (checkUniqueNess) { + Boolean value = template.setIfAbsent(messageMetadata.getId(), messageMetadata, duration); + if (Boolean.FALSE.equals(value)) { + throw new DuplicateMessageException(messageMetadata.getId()); + } + return; } template.set(messageMetadata.getId(), messageMetadata, duration); } @@ -81,10 +81,14 @@ public void deleteAll(Collection ids) { } @Override - public Mono saveReactive(MessageMetadata messageMetadata, Duration ttl, boolean isUnique) { + public Mono saveReactive( + MessageMetadata messageMetadata, Duration ttl, boolean isUnique) { Assert.notNull(messageMetadata.getId(), "messageMetadata id cannot be null"); - if(isUnique){ - return reactiveRedisTemplate.template().opsForValue().setIfAbsent(messageMetadata.getId(), messageMetadata, ttl); + if (isUnique) { + return reactiveRedisTemplate + .template() + .opsForValue() + .setIfAbsent(messageMetadata.getId(), messageMetadata, ttl); } return reactiveRedisTemplate .template() diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueQStatsDaoImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueQStatsDaoImpl.java index 0d61ca32..9f44e517 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueQStatsDaoImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueQStatsDaoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueStringDaoImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueStringDaoImpl.java index 3494a761..e3735437 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueStringDaoImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueStringDaoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -54,14 +54,12 @@ public RqueueStringDaoImpl(RqueueConfig rqueueConfig) { @SuppressWarnings("unchecked") public Map> readFromLists(List keys) { Map> out = new HashMap<>(); - List redisOut = - RedisUtils.executePipeLine( - redisTemplate.getRedisTemplate(), - ((connection, keySerializer, valueSerializer) -> { - for (String key : keys) { - connection.lRange(Objects.requireNonNull(keySerializer.serialize(key)), 0, -1); - } - })); + List redisOut = RedisUtils.executePipeLine( + redisTemplate.getRedisTemplate(), ((connection, keySerializer, valueSerializer) -> { + for (String key : keys) { + connection.lRange(Objects.requireNonNull(keySerializer.serialize(key)), 0, -1); + } + })); for (int i = 0; i < keys.size(); i++) { List values = (List) redisOut.get(i); if (!CollectionUtils.isEmpty(values)) { @@ -79,8 +77,7 @@ public List readFromList(String key) { @Override public void appendToListWithListExpiry(String listName, String data, Duration duration) { RedisUtils.executePipeLine( - redisTemplate.getRedisTemplate(), - (connection, keySerializer, valueSerializer) -> { + redisTemplate.getRedisTemplate(), (connection, keySerializer, valueSerializer) -> { byte[] key = keySerializer.serialize(listName); byte[] value = valueSerializer.serialize(data); connection.rPush(key, value); @@ -127,8 +124,7 @@ public Object delete(Collection keys) { public Object deleteAndSet( Collection keysToBeRemoved, Map objectsToBeStored) { return RedisUtils.executePipeLine( - redisTemplate.getRedisTemplate(), - ((connection, keySerializer, valueSerializer) -> { + redisTemplate.getRedisTemplate(), ((connection, keySerializer, valueSerializer) -> { // potential cross slot error for (String key : keysToBeRemoved) { connection.del(keySerializer.serialize(key)); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueSystemConfigDaoImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueSystemConfigDaoImpl.java index 6aebe424..34a55d29 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueSystemConfigDaoImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/dao/impl/RqueueSystemConfigDaoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/DuplicateMessageException.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/DuplicateMessageException.java index df78a755..e5f7520f 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/DuplicateMessageException.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/DuplicateMessageException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2025 Sonu Kumar + * Copyright (c) 2015-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/LockCanNotBeAcquired.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/LockCanNotBeAcquired.java index 4284c29a..3f57482f 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/LockCanNotBeAcquired.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/LockCanNotBeAcquired.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/OverrideException.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/OverrideException.java index e6c14bb7..532ad277 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/OverrideException.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/OverrideException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/ProcessingException.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/ProcessingException.java index d2162ba1..0315d512 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/ProcessingException.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/ProcessingException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/QueueDoesNotExist.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/QueueDoesNotExist.java index 7fcdc86c..d5a20505 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/QueueDoesNotExist.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/QueueDoesNotExist.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/TimedOutException.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/TimedOutException.java index f899ee98..a246933b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/TimedOutException.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/TimedOutException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/UnknownSwitchCase.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/UnknownSwitchCase.java index fab37c76..6c00667e 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/UnknownSwitchCase.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/exception/UnknownSwitchCase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/DefaultRqueuePoller.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/DefaultRqueuePoller.java index 8d8359b4..b9c3806d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/DefaultRqueuePoller.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/DefaultRqueuePoller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2024 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -81,7 +81,9 @@ private void logNotAvailable() { if (Objects.isNull(lastNotAvailableAt)) { lastNotAvailableAt = System.currentTimeMillis(); } else if (System.currentTimeMillis() - lastNotAvailableAt > maxNotAvailableDelay) { - log(Level.ERROR, "deadlock?? frozen?? stuck?? No Threads are available in last {}", + log( + Level.ERROR, + "deadlock?? frozen?? stuck?? No Threads are available in last {}", null, Duration.ofMillis(maxNotAvailableDelay)); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/HardStrictPriorityPoller.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/HardStrictPriorityPoller.java index 41e627fa..54386b2a 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/HardStrictPriorityPoller.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/HardStrictPriorityPoller.java @@ -70,20 +70,16 @@ class HardStrictPriorityPoller extends RqueueMessagePoller { this.rqueueBeanProvider = rqueueBeanProvider; // Sort queues by priority once during initialization List queueDetailList = new ArrayList<>(queueDetails); - queueDetailList.sort( - (o1, o2) -> - o2.getPriority().get(Constants.DEFAULT_PRIORITY_KEY) - - o1.getPriority().get(Constants.DEFAULT_PRIORITY_KEY)); + queueDetailList.sort((o1, o2) -> o2.getPriority().get(Constants.DEFAULT_PRIORITY_KEY) + - o1.getPriority().get(Constants.DEFAULT_PRIORITY_KEY)); this.queues = queueDetailList.stream().map(QueueDetail::getName).collect(Collectors.toList()); - this.queueNameToDetail = - queueDetailList.stream() - .collect(Collectors.toMap(QueueDetail::getName, Function.identity())); + this.queueNameToDetail = queueDetailList.stream() + .collect(Collectors.toMap(QueueDetail::getName, Function.identity())); this.queueNameToThread = queueNameToThread; - this.hardStrictPriorityPollerProperties = - hardStrictPriorityPollerProperties != null - ? hardStrictPriorityPollerProperties - : new HardStrictPriorityPollerProperties(); + this.hardStrictPriorityPollerProperties = hardStrictPriorityPollerProperties != null + ? hardStrictPriorityPollerProperties + : new HardStrictPriorityPollerProperties(); } @Override @@ -153,11 +149,10 @@ boolean existMessagesInCurrentQueueOrHigherPriorityQueue( } protected boolean existAvailableMessagesForPoll(QueueDetail queueDetail) { - boolean readyMessagesExists = - rqueueBeanProvider - .getRqueueMessageTemplate() - .findFirstElementFromList(queueDetail.getQueueName()) - .isPresent(); + boolean readyMessagesExists = rqueueBeanProvider + .getRqueueMessageTemplate() + .findFirstElementFromList(queueDetail.getQueueName()) + .isPresent(); if (readyMessagesExists) { log( Level.TRACE, @@ -169,12 +164,11 @@ protected boolean existAvailableMessagesForPoll(QueueDetail queueDetail) { // Only check delayed messages with score <= current time long currentTime = System.currentTimeMillis(); - boolean delayedMessagesExists = - rqueueBeanProvider - .getRqueueMessageTemplate() - .findFirstElementFromZsetWithScore(queueDetail.getScheduledQueueName()) - .filter(element -> element.getScore() <= currentTime) - .isPresent(); + boolean delayedMessagesExists = rqueueBeanProvider + .getRqueueMessageTemplate() + .findFirstElementFromZsetWithScore(queueDetail.getScheduledQueueName()) + .filter(element -> element.getScore() <= currentTime) + .isPresent(); if (delayedMessagesExists) { log( diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/JobImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/JobImpl.java index ec8fe62d..533ee736 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/JobImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/JobImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2025 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -143,9 +143,8 @@ public void checkIn(Serializable message) { @Override public Duration getVisibilityTimeout() { - Long score = - rqueueMessageTemplate.getScore( - queueDetail.getProcessingQueueName(), rqueueJob.getRqueueMessage()); + Long score = rqueueMessageTemplate.getScore( + queueDetail.getProcessingQueueName(), rqueueJob.getRqueueMessage()); if (score == null || score <= 0) { return Duration.ZERO; } @@ -341,24 +340,22 @@ void updateMessageStatus(MessageStatus messageStatus) { // run in parallel due to failure)] if (!messageStatus.isTerminalState() || getRqueueMessage().isPeriodic()) { Duration duration = rqueueConfig.getMessageDurability(getRqueueMessage().getPeriod()); - saveMessageMetadata( - () -> { - messageMetadataService.save(getMessageMetadata(), duration, false); - return null; - }); + saveMessageMetadata(() -> { + messageMetadataService.save(getMessageMetadata(), duration, false); + return null; + }); } else { long ttl = rqueueConfig.getMessageDurabilityInMinute(); if (ttl <= 0 || !rqueueConfig.messageInTerminalStateShouldBeStored()) { this.messageMetadataService.delete(rqueueJob.getMessageMetadata().getId()); } else { - saveMessageMetadata( - () -> { - messageMetadataService.saveMessageMetadataForQueue( - queueDetail.getCompletedQueueName(), - getMessageMetadata(), - rqueueConfig.messageDurabilityInTerminalStateInMillisecond()); - return null; - }); + saveMessageMetadata(() -> { + messageMetadataService.saveMessageMetadataForQueue( + queueDetail.getCompletedQueueName(), + getMessageMetadata(), + rqueueConfig.messageDurabilityInTerminalStateInMillisecond()); + return null; + }); } } save(); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MappingInformation.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MappingInformation.java index c312e78f..9fec1488 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MappingInformation.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MappingInformation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2024 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ class MappingInformation implements Comparable { @EqualsAndHashCode.Include private final Set queueNames; + private final int numRetry; private final String deadLetterQueueName; private final boolean deadLetterConsumerEnabled; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MessageContainerBase.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MessageContainerBase.java index b2eca402..09e2ca9c 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MessageContainerBase.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MessageContainerBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MessageProcessorHandler.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MessageProcessorHandler.java index 7f11b843..e8e37c4c 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MessageProcessorHandler.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/MessageProcessorHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/PostProcessingHandler.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/PostProcessingHandler.java index 07dad13b..e9b18dca 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/PostProcessingHandler.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/PostProcessingHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2024 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -29,12 +29,11 @@ import com.github.sonus21.rqueue.utils.RedisUtils; import com.github.sonus21.rqueue.utils.backoff.FixedTaskExecutionBackOff; import com.github.sonus21.rqueue.utils.backoff.TaskExecutionBackOff; +import java.io.Serializable; import lombok.extern.slf4j.Slf4j; import org.slf4j.event.Level; import org.springframework.context.ApplicationEventPublisher; -import java.io.Serializable; - @Slf4j @SuppressWarnings("java:S107") class PostProcessingHandler extends PrefixLogger { @@ -62,15 +61,12 @@ class PostProcessingHandler extends PrefixLogger { this.rqueueSystemConfigDao = rqueueSystemConfigDao; } - long backOff(RqueueMessage rqueueMessage, Object userMessage, int failureCount, - Throwable throwable) { + long backOff( + RqueueMessage rqueueMessage, Object userMessage, int failureCount, Throwable throwable) { return taskExecutionBackoff.nextBackOff(userMessage, rqueueMessage, failureCount, throwable); } - void handle(JobImpl job, - ExecutionStatus status, - int failureCount, - Throwable throwable) { + void handle(JobImpl job, ExecutionStatus status, int failureCount, Throwable throwable) { try { switch (status) { case QUEUE_INACTIVE: @@ -143,8 +139,7 @@ private void moveMessageToQueue( RqueueMessage newMessage, long delay) { RedisUtils.executePipeLine( - rqueueMessageTemplate.getTemplate(), - (connection, keySerializer, valueSerializer) -> { + rqueueMessageTemplate.getTemplate(), (connection, keySerializer, valueSerializer) -> { byte[] newMessageBytes = valueSerializer.serialize(newMessage); byte[] oldMessageBytes = valueSerializer.serialize(oldMessage); byte[] processingQueueNameBytes = @@ -170,7 +165,8 @@ private void moveMessageToDlq(JobImpl job, int failureCount, Throwable throwable job.getRqueueMessage(), job.getQueueDetail().getDeadLetterQueueName()); RqueueMessage rqueueMessage = job.getRqueueMessage(); - RqueueMessage newMessage = rqueueMessage.toBuilder().failureCount(failureCount).build(); + RqueueMessage newMessage = + rqueueMessage.toBuilder().failureCount(failureCount).build(); newMessage.updateReEnqueuedAt(); QueueDetail queueDetail = job.getQueueDetail(); Object userMessage = job.getMessage(); @@ -284,9 +280,8 @@ private void handleFailure(JobImpl job, int failureCount, Throwable throwable) { } else { int maxRetryCount = getMaxRetryCount(job.getRqueueMessage(), job.getQueueDetail()); if (failureCount < maxRetryCount) { - long delay = - taskExecutionBackoff.nextBackOff(job.getMessage(), job.getRqueueMessage(), failureCount, - throwable); + long delay = taskExecutionBackoff.nextBackOff( + job.getMessage(), job.getRqueueMessage(), failureCount, throwable); if (delay == TaskExecutionBackOff.STOP) { handleRetryExceededMessage(job, failureCount, throwable); } else { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/QueueDetail.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/QueueDetail.java index e5f93c84..a57f2e2e 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/QueueDetail.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/QueueDetail.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2024 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -52,8 +52,10 @@ public class QueueDetail extends SerializableBase { private final long visibilityTimeout; private final String name; private final int numRetry; + @Builder.Default private final QueueType type = QueueType.QUEUE; + private final String queueName; private final String deadLetterQueueName; private final boolean deadLetterConsumerEnabled; @@ -80,23 +82,22 @@ public DeadLetterQueue getDeadLetterQueue() { } public QueueConfig toConfig() { - QueueConfig queueConfig = - QueueConfig.builder() - .name(name) - .numRetry(numRetry) - .queueName(queueName) - .scheduledQueueName(scheduledQueueName) - .processingQueueName(processingQueueName) - .completedQueueName(completedQueueName) - .visibilityTimeout(visibilityTimeout) - .createdOn(System.currentTimeMillis()) - .updatedOn(System.currentTimeMillis()) - .deadLetterQueues(new LinkedList<>()) - .concurrency(concurrency.toMinMax()) - .priority(Collections.unmodifiableMap(priority)) - .priorityGroup(priorityGroup) - .systemGenerated(systemGenerated) - .build(); + QueueConfig queueConfig = QueueConfig.builder() + .name(name) + .numRetry(numRetry) + .queueName(queueName) + .scheduledQueueName(scheduledQueueName) + .processingQueueName(processingQueueName) + .completedQueueName(completedQueueName) + .visibilityTimeout(visibilityTimeout) + .createdOn(System.currentTimeMillis()) + .updatedOn(System.currentTimeMillis()) + .deadLetterQueues(new LinkedList<>()) + .concurrency(concurrency.toMinMax()) + .priority(Collections.unmodifiableMap(priority)) + .priorityGroup(priorityGroup) + .systemGenerated(systemGenerated) + .build(); if (isDlqSet()) { queueConfig.addDeadLetterQueue(getDeadLetterQueue()); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueExecutor.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueExecutor.java index 0613a677..ed850bd3 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueExecutor.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2024 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -76,15 +76,10 @@ class RqueueExecutor extends MessageContainerBase { } private Object getUserMessage() { - Message tmpMessage = - MessageBuilder.createMessage( - rqueueMessage.getMessage(), - buildMessageHeaders( - queueDetail.getName(), - rqueueMessage, - null, - null, - rqueueMessage.getMessageHeaders())); + Message tmpMessage = MessageBuilder.createMessage( + rqueueMessage.getMessage(), + buildMessageHeaders( + queueDetail.getName(), rqueueMessage, null, null, rqueueMessage.getMessageHeaders())); // here error can occur when message can not be deserialized without target class information try { return RqueueMessageUtils.convertMessageToObject( @@ -99,18 +94,17 @@ private void init() { MessageMetadata messageMetadata = beanProvider.getRqueueMessageMetadataService().getOrCreateMessageMetadata(rqueueMessage); this.userMessage = getUserMessage(); - this.job = - new JobImpl( - beanProvider.getRqueueConfig(), - beanProvider.getRqueueMessageMetadataService(), - beanProvider.getRqueueJobDao(), - beanProvider.getRqueueMessageTemplate(), - beanProvider.getRqueueLockManager(), - queueDetail, - messageMetadata, - rqueueMessage, - userMessage, - postProcessingHandler); + this.job = new JobImpl( + beanProvider.getRqueueConfig(), + beanProvider.getRqueueMessageMetadataService(), + beanProvider.getRqueueJobDao(), + beanProvider.getRqueueMessageTemplate(), + beanProvider.getRqueueLockManager(), + queueDetail, + messageMetadata, + rqueueMessage, + userMessage, + postProcessingHandler); this.failureCount = job.getRqueueMessage().getFailureCount(); } @@ -145,17 +139,20 @@ private boolean isMessageDeleted() { boolean deleted = messageMetadata.isDeleted(); if (!deleted) { // fetch latest from DB - MessageMetadata newMessageMetadata = - beanProvider - .getRqueueMessageMetadataService() - .getOrCreateMessageMetadata(job.getRqueueMessage()); + MessageMetadata newMessageMetadata = beanProvider + .getRqueueMessageMetadataService() + .getOrCreateMessageMetadata(job.getRqueueMessage()); messageMetadata.merge(newMessageMetadata); } deleted = messageMetadata.isDeleted(); if (deleted) { if (rqueueMessage.isPeriodic()) { - log(Level.INFO, "Periodic Message {} having period {} has been deleted", null, - rqueueMessage.getId(), rqueueMessage.getPeriod()); + log( + Level.INFO, + "Periodic Message {} having period {} has been deleted", + null, + rqueueMessage.getId(), + rqueueMessage.getPeriod()); } else { log(Level.INFO, "Message {} has been deleted", null, rqueueMessage.getId()); } @@ -170,7 +167,7 @@ private boolean shouldIgnore() { private boolean isOldMessage() { return job.getMessageMetadata().getRqueueMessage() != null && job.getMessageMetadata().getRqueueMessage().getQueuedTime() - != job.getRqueueMessage().getQueuedTime(); + != job.getRqueueMessage().getQueuedTime(); } private int getRetryCount() { @@ -215,7 +212,8 @@ private void logExecutionTimeWarning(long maxProcessingTime, long startTime) { long executionTime = System.currentTimeMillis() - startTime; log( Level.WARN, - "Message listener is taking longer time [Queue: {}, TaskStatus: {}] MaxAllowedTime: {}, ExecutionTime: {}", + "Message listener is taking longer time [Queue: {}, TaskStatus: {}] MaxAllowedTime: {}," + + " ExecutionTime: {}", null, job.getQueueDetail().getName(), status, @@ -239,14 +237,10 @@ private void callMiddlewares(int currentIndex, List middlewares, Job if (currentIndex == middlewares.size()) { new HandlerMiddleware(beanProvider.getRqueueMessageHandler()).handle(job, null); } else { - middlewares - .get(currentIndex) - .handle( - job, - () -> { - callMiddlewares(currentIndex + 1, middlewares, job); - return null; - }); + middlewares.get(currentIndex).handle(job, () -> { + callMiddlewares(currentIndex + 1, middlewares, job); + return null; + }); } } @@ -278,11 +272,10 @@ private void execute() { } } - private boolean shouldRetry(long maxProcessingTime, int retryCount, int failureCount) { - if (retryCount > 0 && - ExecutionStatus.FAILED.equals(status) && - System.currentTimeMillis() < maxProcessingTime) { + if (retryCount > 0 + && ExecutionStatus.FAILED.equals(status) + && System.currentTimeMillis() < maxProcessingTime) { boolean doNoRetry = queueDetail.isDoNotRetryError(error); // it should not be retried based on the exception list if (doNoRetry) { @@ -346,10 +339,9 @@ private void schedulePeriodicMessage() { if (isMessageDeleted()) { return; } - RqueueMessage newMessage = - job.getRqueueMessage().toBuilder() - .processAt(job.getRqueueMessage().nextProcessAt()) - .build(); + RqueueMessage newMessage = job.getRqueueMessage().toBuilder() + .processAt(job.getRqueueMessage().nextProcessAt()) + .build(); String messageKey = getScheduledMessageKey(newMessage); long expiryInSeconds = getTtlForScheduledMessageKey(newMessage); log( diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageHandler.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageHandler.java index effd8384..510e93b6 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageHandler.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2024 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -32,7 +32,6 @@ import com.github.sonus21.rqueue.utils.ThreadUtils; import com.github.sonus21.rqueue.utils.ValueResolver; import com.google.common.annotations.VisibleForTesting; - import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; @@ -48,7 +47,6 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; - import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -83,503 +81,490 @@ @Slf4j public class RqueueMessageHandler extends AbstractMethodMessageHandler { - private final ConversionService conversionService; - @Getter - private final MessageConverter messageConverter; - private final boolean inspectAllBean; - private final AsyncTaskExecutor asyncTaskExecutor; - private final Map destinationLookup = new HashMap<>(64); - private final MultiValueMap handlerMethods = - new LinkedMultiValueMap<>(64); - - public RqueueMessageHandler(final MessageConverter messageConverter, boolean inspectAllBean) { - notNull(messageConverter, "messageConverter cannot be null"); - this.messageConverter = messageConverter; - this.inspectAllBean = inspectAllBean; - this.conversionService = new DefaultFormattingConversionService(); - this.asyncTaskExecutor = - ThreadUtils.createTaskExecutor("rqueueMessageExecutor", "multiMessageExecutor-", -1, -1, 0); - } - - - @VisibleForTesting - public RqueueMessageHandler() { - this(new DefaultRqueueMessageConverter()); - } - - public RqueueMessageHandler(final MessageConverter messageConverter) { - this(messageConverter, true); - } - - private ConfigurableBeanFactory getBeanFactory() { - ApplicationContext context = getApplicationContext(); - return (context instanceof ConfigurableApplicationContext - ? ((ConfigurableApplicationContext) context).getBeanFactory() - : null); - } - - @Override - protected List initArgumentResolvers() { - List resolvers = new ArrayList<>(getCustomArgumentResolvers()); - // Annotation-based argument resolution - resolvers.add(new HeaderMethodArgumentResolver(this.conversionService, getBeanFactory())); - resolvers.add(new HeadersMethodArgumentResolver()); - - // Type-based argument resolution - resolvers.add(new PrincipalMethodArgumentResolver()); - resolvers.add(new MessageMethodArgumentResolver(messageConverter)); - resolvers.add(new PayloadMethodArgumentResolver(messageConverter)); - return resolvers; - } - - - @Override - protected List initReturnValueHandlers() { - return new ArrayList<>(getCustomReturnValueHandlers()); - } - - @Override - public void afterPropertiesSet() { - super.afterPropertiesSet(); - for (Entry e : destinationLookup.entrySet()) { - List handlerMethodWithPrimaries = handlerMethods.get(e.getValue()); - if (handlerMethodWithPrimaries.size() > 1) { - if (handlerMethodWithPrimaries.stream().filter(m -> m.primary).count() != 1) { - logger.error( - "There must be exactly one primary listener method, queue: '" + e.getKey() + "'"); - throw new IllegalStateException("There must be exactly one primary listener method"); - } - } - } - } + private final ConversionService conversionService; + + @Getter + private final MessageConverter messageConverter; + + private final boolean inspectAllBean; + private final AsyncTaskExecutor asyncTaskExecutor; + private final Map destinationLookup = new HashMap<>(64); + private final MultiValueMap handlerMethods = + new LinkedMultiValueMap<>(64); + + public RqueueMessageHandler(final MessageConverter messageConverter, boolean inspectAllBean) { + notNull(messageConverter, "messageConverter cannot be null"); + this.messageConverter = messageConverter; + this.inspectAllBean = inspectAllBean; + this.conversionService = new DefaultFormattingConversionService(); + this.asyncTaskExecutor = + ThreadUtils.createTaskExecutor("rqueueMessageExecutor", "multiMessageExecutor-", -1, -1, 0); + } + + @VisibleForTesting + public RqueueMessageHandler() { + this(new DefaultRqueueMessageConverter()); + } + + public RqueueMessageHandler(final MessageConverter messageConverter) { + this(messageConverter, true); + } + + private ConfigurableBeanFactory getBeanFactory() { + ApplicationContext context = getApplicationContext(); + return (context instanceof ConfigurableApplicationContext + ? ((ConfigurableApplicationContext) context).getBeanFactory() + : null); + } + + @Override + protected List initArgumentResolvers() { + List resolvers = new ArrayList<>(getCustomArgumentResolvers()); + // Annotation-based argument resolution + resolvers.add(new HeaderMethodArgumentResolver(this.conversionService, getBeanFactory())); + resolvers.add(new HeadersMethodArgumentResolver()); + + // Type-based argument resolution + resolvers.add(new PrincipalMethodArgumentResolver()); + resolvers.add(new MessageMethodArgumentResolver(messageConverter)); + resolvers.add(new PayloadMethodArgumentResolver(messageConverter)); + return resolvers; + } + + @Override + protected List initReturnValueHandlers() { + return new ArrayList<>(getCustomReturnValueHandlers()); + } + + @Override + public void afterPropertiesSet() { + super.afterPropertiesSet(); + for (Entry e : destinationLookup.entrySet()) { + List handlerMethodWithPrimaries = handlerMethods.get(e.getValue()); + if (handlerMethodWithPrimaries.size() > 1) { + if (handlerMethodWithPrimaries.stream().filter(m -> m.primary).count() != 1) { + logger.error( + "There must be exactly one primary listener method, queue: '" + e.getKey() + "'"); + throw new IllegalStateException("There must be exactly one primary listener method"); + } + } + } + } + + private boolean isMessageHandler(Class beanType) { + RqueueListener rqueueListener = AnnotationUtils.findAnnotation(beanType, RqueueListener.class); + if (rqueueListener != null) { + MappingInformation information = getMappingInformation(rqueueListener); + Map methods = MethodIntrospector.selectMethods( + beanType, (MethodIntrospector.MetadataLookup) + method -> getMappingInformation(method, information)); + Object handler = Objects.requireNonNull(getBeanFactory()).getBean(beanType); + methods.forEach((key, value) -> registerHandlerMethod(handler, key, value)); + } + return rqueueListener != null; + } + + @Override + protected boolean isHandler(Class beanType) { + if (isMessageHandler(beanType)) { + return false; + } + if (inspectAllBean) { + return true; + } + return AnnotatedElementUtils.hasAnnotation(beanType, MessageListener.class); + } + + public MultiValueMap getHandlerMethodMap() { + return handlerMethods; + } + + private void addMatchesToCollection( + MappingInformation mapping, Message message, Set matches) { + MappingInformation match = getMatchingMapping(mapping, message); + if (match != null) { + for (HandlerMethodWithPrimary method : getHandlerMethodMap().get(mapping)) { + matches.add(new Match(match, method)); + } + } + } + + @Override + protected void registerHandlerMethod(Object handler, Method method, MappingInformation mapping) { + for (String pattern : getDirectLookupDestinations(mapping)) { + MappingInformation oldMapping = destinationLookup.get(pattern); + if (oldMapping != null && !oldMapping.equals(mapping)) { + List methods = handlerMethods.get(oldMapping); + throw new IllegalStateException("More than one listeners are registered to same queue\n" + + "Existing Methods " + + methods + + "\nNew Method: [" + + method + + "]"); + } + this.destinationLookup.put(pattern, mapping); + } + this.handlerMethods.add( + mapping, + new HandlerMethodWithPrimary(createHandlerMethod(handler, method), mapping.isPrimary())); + } + + @Override + protected void handleMessageInternal(Message message, String lookupDestination) { + MappingInformation mapping = this.destinationLookup.get(lookupDestination); + Set matches = new HashSet<>(); + addMatchesToCollection(mapping, message, matches); + if (matches.isEmpty()) { + handleNoMatch(this.getHandlerMethodMap().keySet(), lookupDestination, message); + return; + } + executeMatches(matches, message, lookupDestination); + } + + private void executeMultipleMatch( + List matches, Message message, String lookupDestination) { + Match primaryMatch = null; + for (Match match : matches) { + if (match.handlerMethod.primary) { + primaryMatch = match; + } + } + if (primaryMatch == null) { + throw new IllegalStateException("At least one of them must be primary"); + } + for (Match match : matches) { + if (!match.handlerMethod.primary) { + Message clonedMessage = cloneMessage(message); + asyncTaskExecutor.execute(new MultiHandler(match, clonedMessage, lookupDestination)); + } + } + handleMatch( + primaryMatch.information, primaryMatch.handlerMethod.method, lookupDestination, message); + } + + private void executeMatches(Set matchesIn, Message message, String lookupDestination) { + List matches = new ArrayList<>(matchesIn); + if (matches.size() == 1) { + Match match = matches.get(0); + handleMatch(match.information, match.handlerMethod.method, lookupDestination, message); + } else { + executeMultipleMatch(matches, message, lookupDestination); + } + } + + private MappingInformation getMappingInformation( + Method method, MappingInformation mappingInformation) { + RqueueHandler rqueueHandler = AnnotationUtils.findAnnotation(method, RqueueHandler.class); + if (rqueueHandler == null) { + return null; + } + return mappingInformation.toBuilder().primary(rqueueHandler.primary()).build(); + } + + private MappingInformation getMappingInformation(RqueueListener rqueueListener) { + Set queueNames = resolveQueueNames(rqueueListener); + String deadLetterQueueName = resolveDeadLetterQueue(rqueueListener); + int numRetries = resolveNumRetries(rqueueListener); + long visibilityTimeout = resolveVisibilityTimeout(rqueueListener); + boolean active = isActive(rqueueListener); + boolean consumerEnabled = resolveConsumerEnabled(rqueueListener); + Concurrency concurrency = resolveConcurrency(rqueueListener); + Map priorityMap = resolvePriority(rqueueListener); + String priorityGroup = resolvePriorityGroup(rqueueListener); + int batchSize = getBatchSize(rqueueListener, concurrency); + MappingInformation mappingInformation = MappingInformation.builder() + .active(active) + .concurrency(concurrency) + .deadLetterQueueName(deadLetterQueueName) + .deadLetterConsumerEnabled(consumerEnabled) + .numRetry(numRetries) + .queueNames(queueNames) + .visibilityTimeout(visibilityTimeout) + .priorityGroup(priorityGroup) + .priority(priorityMap) + .batchSize(batchSize) + .doNotRetry(new HashSet<>(Arrays.asList(rqueueListener.doNotRetry()))) + .build(); + if (mappingInformation.isValid()) { + return mappingInformation; + } + logger.warn("Invalid Queue '" + mappingInformation + "' configuration"); + return null; + } + + private int getBatchSize(RqueueListener rqueueListener, Concurrency concurrency) { + int val = + ValueResolver.resolveKeyToInteger(getApplicationContext(), rqueueListener.batchSize()); + // batch size is not set + if (val < Constants.MIN_BATCH_SIZE) { + // concurrency is set but batch size is not set, use default batch size + if (concurrency.isValid()) { + val = Constants.BATCH_SIZE_FOR_CONCURRENCY_BASED_LISTENER; + } else { + val = Constants.MIN_BATCH_SIZE; + } + } + return val; + } + + @Override + protected MappingInformation getMappingForMethod(Method method, Class handlerType) { + RqueueListener rqueueListener = AnnotationUtils.findAnnotation(method, RqueueListener.class); + if (rqueueListener != null) { + return getMappingInformation(rqueueListener); + } + return null; + } + + private Concurrency resolveConcurrency(RqueueListener rqueueListener) { + String val = + ValueResolver.resolveKeyToString(getApplicationContext(), rqueueListener.concurrency()); + if (val.equals("-1")) { + return new Concurrency(-1, -1); + } + String[] vals = val.split("-"); + if (vals.length > 2 || vals.length == 0) { + throw new IllegalStateException( + "Concurrency must be either some number e.g. 5 or in the form of 5-10"); + } + if (vals.length == 1) { + int concurrency = + parseInt(vals[0], "Concurrency is not a number", "Concurrency is not a number"); + return new Concurrency(1, concurrency); + } + int lowerLimit = parseInt( + vals[0], + "Concurrency lower limit is not a number", + "Concurrency lower limit must be non-zero"); + if (lowerLimit < Constants.MIN_CONCURRENCY) { + throw new IllegalStateException("lower limit of concurrency must be greater than or equal to " + + Constants.MIN_CONCURRENCY); + } + int upperLimit = parseInt( + vals[1], + "Concurrency upper limit is not a number", + "Concurrency upper limit must be non-zero"); + if (lowerLimit > upperLimit) { + throw new IllegalStateException("upper limit of concurrency is smaller than the lower limit"); + } + return new Concurrency(lowerLimit, upperLimit); + } + + private String resolvePriorityGroup(RqueueListener rqueueListener) { + return ValueResolver.resolveKeyToString( + getApplicationContext(), rqueueListener.priorityGroup()); + } + + private int parseInt(String txt, String message, String nonZeroText) { + try { + int n = Integer.parseInt(txt); + if (n <= 0) { + throw new IllegalStateException(nonZeroText); + } + return n; + } catch (NumberFormatException e) { + throw new IllegalStateException(message, e); + } + } + + private Map resolvePriority(RqueueListener rqueueListener) { + String[] priorities = ValueResolver.resolveKeyToArrayOfStrings( + getApplicationContext(), rqueueListener.priority()); + HashMap priorityMap = new HashMap<>(); + if (priorities.length == 0 || (priorities[0].equals(Constants.BLANK))) { + return priorityMap; + } + for (String priority : priorities) { + String[] vals = priority.split(":"); + if (vals.length == 1) { + vals = priority.split("="); + } + if (vals.length == 1) { + if (!priorityMap.isEmpty()) { + throw new IllegalStateException("Invalid priority configuration is used."); + } + priorityMap.put( + Constants.DEFAULT_PRIORITY_KEY, + parseInt( + vals[0], + "priority is not a number.", + "priority must be greater than or equal to 1")); + } else if (vals.length == 2) { + priorityMap.put( + vals[0], + parseInt( + vals[1], + "priority is not a number.", + "priority must be greater than or equal to 1")); + } else { + throw new IllegalStateException("Priority cannot be parsed"); + } + } + return Collections.unmodifiableMap(priorityMap); + } + + private boolean resolveConsumerEnabled(RqueueListener rqueueListener) { + return ValueResolver.resolveToBoolean( + getApplicationContext(), rqueueListener.deadLetterQueueListenerEnabled()); + } + + private long resolveVisibilityTimeout(RqueueListener rqueueListener) { + long value = + ValueResolver.resolveKeyToLong(getApplicationContext(), rqueueListener.visibilityTimeout()); + if (value < Constants.MIN_VISIBILITY) { + throw new IllegalStateException( + "Visibility must be greater than or equal to " + Constants.MIN_VISIBILITY); + } + return value; + } + + private int resolveNumRetries(RqueueListener rqueueListener) { + return ValueResolver.resolveKeyToInteger(getApplicationContext(), rqueueListener.numRetries()); + } + + private String resolveDeadLetterQueue(RqueueListener rqueueListener) { + String dlqName = rqueueListener.deadLetterQueue(); + String[] resolvedValues = + ValueResolver.resolveKeyToArrayOfStrings(getApplicationContext(), dlqName); + if (resolvedValues.length == 1) { + return resolvedValues[0]; + } + throw new IllegalStateException( + "more than one dead letter queue cannot be configured '" + dlqName + "'"); + } + + private boolean isActive(RqueueListener rqueueListener) { + return ValueResolver.resolveToBoolean(getApplicationContext(), rqueueListener.active()); + } + + private void checkInvalidQueueName(Set queueNames) { + List invalidNames = new LinkedList<>(); + Character[] invalidChars = new Character[] { + '{', '}', ' ', '<', '>', + }; + for (String queue : queueNames) { + for (int i = 0; i < queue.length(); i++) { + for (char invalidChar : invalidChars) { + if (queue.charAt(i) == invalidChar) { + invalidNames.add(queue); + break; + } + } + } + } + if (!invalidNames.isEmpty()) { + String invalidCharsStr = Stream.of(invalidChars) + .map(e -> String.format("'%c'", e)) + .collect(Collectors.joining(Constants.Comma)); + String queueNamesStr = invalidNames.stream() + .map(e -> String.format("'%s'", e)) + .collect(Collectors.joining(Constants.Comma)); + String message = String.format( + "Queue name contains invalid char%n Not Allowed Chars [%s] %n Queues: [%s]", + invalidCharsStr, queueNamesStr); + throw new IllegalStateException(message); + } + } + + private Set resolveQueueNames(RqueueListener rqueueListener) { + String[] queueNames = rqueueListener.value(); + Set result = new HashSet<>(queueNames.length); + for (String queueName : queueNames) { + result.addAll(Arrays.asList( + ValueResolver.resolveKeyToArrayOfStrings(getApplicationContext(), queueName))); + } + checkInvalidQueueName(result); + return Collections.unmodifiableSet(result); + } + + @Override + protected Set getDirectLookupDestinations(MappingInformation mapping) { + Set destinations = new HashSet<>(mapping.getQueueNames()); + for (String queueName : mapping.getQueueNames()) { + destinations.addAll(PriorityUtils.getNamesFromPriority(queueName, mapping.getPriority())); + } + return destinations; + } + + @Override + protected String getDestination(Message message) { + return (String) message.getHeaders().get(RqueueMessageHeaders.DESTINATION); + } + + @Override + protected MappingInformation getMatchingMapping(MappingInformation mapping, Message message) { + String destination = getDestination(message); + if (mapping.getQueueNames().contains(destination)) { + return mapping; + } + try { + QueueDetail queueDetail = EndpointRegistry.get(destination); + if (queueDetail.isSystemGenerated()) { + queueDetail = EndpointRegistry.get(queueDetail.getPriorityGroup()); + if (mapping.getQueueNames().contains(queueDetail.getName())) { + return mapping; + } + } + } catch (QueueDoesNotExist e) { + return null; + } + return null; + } + + @Override + protected Comparator getMappingComparator(Message message) { + return new ComparableComparator<>(); + } + + @Override + protected AbstractExceptionHandlerMethodResolver createExceptionHandlerMethodResolverFor( + Class beanType) { + return new AnnotationExceptionHandlerMethodResolver(beanType); + } + + @Override + protected void processHandlerMethodException( + HandlerMethod handlerMethod, Exception ex, Message message) { + super.processHandlerMethodException(handlerMethod, ex, message); + throw new MessagingException("An exception occurred while invoking the handler method", ex); + } - private boolean isMessageHandler(Class beanType) { - RqueueListener rqueueListener = AnnotationUtils.findAnnotation(beanType, RqueueListener.class); - if (rqueueListener != null) { - MappingInformation information = getMappingInformation(rqueueListener); - Map methods = - MethodIntrospector.selectMethods( - beanType, - (MethodIntrospector.MetadataLookup) - method -> getMappingInformation(method, information)); - Object handler = Objects.requireNonNull(getBeanFactory()).getBean(beanType); - methods.forEach((key, value) -> registerHandlerMethod(handler, key, value)); - } - return rqueueListener != null; - } - - @Override - protected boolean isHandler(Class beanType) { - if (isMessageHandler(beanType)) { - return false; - } - if (inspectAllBean) { - return true; - } - return AnnotatedElementUtils.hasAnnotation(beanType, MessageListener.class); - } - - public MultiValueMap getHandlerMethodMap() { - return handlerMethods; - } - - private void addMatchesToCollection( - MappingInformation mapping, Message message, Set matches) { - MappingInformation match = getMatchingMapping(mapping, message); - if (match != null) { - for (HandlerMethodWithPrimary method : getHandlerMethodMap().get(mapping)) { - matches.add(new Match(match, method)); - } - } - } - - @Override - protected void registerHandlerMethod(Object handler, Method method, MappingInformation mapping) { - for (String pattern : getDirectLookupDestinations(mapping)) { - MappingInformation oldMapping = destinationLookup.get(pattern); - if (oldMapping != null && !oldMapping.equals(mapping)) { - List methods = handlerMethods.get(oldMapping); - throw new IllegalStateException( - "More than one listeners are registered to same queue\n" - + "Existing Methods " - + methods - + "\nNew Method: [" - + method - + "]"); - } - this.destinationLookup.put(pattern, mapping); - } - this.handlerMethods.add( - mapping, - new HandlerMethodWithPrimary(createHandlerMethod(handler, method), mapping.isPrimary())); - } - - @Override - protected void handleMessageInternal(Message message, String lookupDestination) { - MappingInformation mapping = this.destinationLookup.get(lookupDestination); - Set matches = new HashSet<>(); - addMatchesToCollection(mapping, message, matches); - if (matches.isEmpty()) { - handleNoMatch(this.getHandlerMethodMap().keySet(), lookupDestination, message); - return; - } - executeMatches(matches, message, lookupDestination); - } - - private void executeMultipleMatch( - List matches, Message message, String lookupDestination) { - Match primaryMatch = null; - for (Match match : matches) { - if (match.handlerMethod.primary) { - primaryMatch = match; - } - } - if (primaryMatch == null) { - throw new IllegalStateException("At least one of them must be primary"); - } - for (Match match : matches) { - if (!match.handlerMethod.primary) { - Message clonedMessage = cloneMessage(message); - asyncTaskExecutor.execute(new MultiHandler(match, clonedMessage, lookupDestination)); - } - } - handleMatch( - primaryMatch.information, primaryMatch.handlerMethod.method, lookupDestination, message); - } - - private void executeMatches(Set matchesIn, Message message, String lookupDestination) { - List matches = new ArrayList<>(matchesIn); - if (matches.size() == 1) { - Match match = matches.get(0); - handleMatch(match.information, match.handlerMethod.method, lookupDestination, message); - } else { - executeMultipleMatch(matches, message, lookupDestination); - } - } - - private MappingInformation getMappingInformation( - Method method, MappingInformation mappingInformation) { - RqueueHandler rqueueHandler = AnnotationUtils.findAnnotation(method, RqueueHandler.class); - if (rqueueHandler == null) { - return null; - } - return mappingInformation.toBuilder().primary(rqueueHandler.primary()).build(); - } - - private MappingInformation getMappingInformation(RqueueListener rqueueListener) { - Set queueNames = resolveQueueNames(rqueueListener); - String deadLetterQueueName = resolveDeadLetterQueue(rqueueListener); - int numRetries = resolveNumRetries(rqueueListener); - long visibilityTimeout = resolveVisibilityTimeout(rqueueListener); - boolean active = isActive(rqueueListener); - boolean consumerEnabled = resolveConsumerEnabled(rqueueListener); - Concurrency concurrency = resolveConcurrency(rqueueListener); - Map priorityMap = resolvePriority(rqueueListener); - String priorityGroup = resolvePriorityGroup(rqueueListener); - int batchSize = getBatchSize(rqueueListener, concurrency); - MappingInformation mappingInformation = - MappingInformation.builder() - .active(active) - .concurrency(concurrency) - .deadLetterQueueName(deadLetterQueueName) - .deadLetterConsumerEnabled(consumerEnabled) - .numRetry(numRetries) - .queueNames(queueNames) - .visibilityTimeout(visibilityTimeout) - .priorityGroup(priorityGroup) - .priority(priorityMap) - .batchSize(batchSize) - .doNotRetry(new HashSet<>(Arrays.asList(rqueueListener.doNotRetry()))) - .build(); - if (mappingInformation.isValid()) { - return mappingInformation; - } - logger.warn("Invalid Queue '" + mappingInformation + "' configuration"); - return null; - } - - private int getBatchSize(RqueueListener rqueueListener, Concurrency concurrency) { - int val = - ValueResolver.resolveKeyToInteger(getApplicationContext(), rqueueListener.batchSize()); - // batch size is not set - if (val < Constants.MIN_BATCH_SIZE) { - // concurrency is set but batch size is not set, use default batch size - if (concurrency.isValid()) { - val = Constants.BATCH_SIZE_FOR_CONCURRENCY_BASED_LISTENER; - } else { - val = Constants.MIN_BATCH_SIZE; - } - } - return val; - } - - @Override - protected MappingInformation getMappingForMethod(Method method, Class handlerType) { - RqueueListener rqueueListener = AnnotationUtils.findAnnotation(method, RqueueListener.class); - if (rqueueListener != null) { - return getMappingInformation(rqueueListener); - } - return null; - } - - private Concurrency resolveConcurrency(RqueueListener rqueueListener) { - String val = - ValueResolver.resolveKeyToString(getApplicationContext(), rqueueListener.concurrency()); - if (val.equals("-1")) { - return new Concurrency(-1, -1); - } - String[] vals = val.split("-"); - if (vals.length > 2 || vals.length == 0) { - throw new IllegalStateException( - "Concurrency must be either some number e.g. 5 or in the form of 5-10"); - } - if (vals.length == 1) { - int concurrency = - parseInt(vals[0], "Concurrency is not a number", "Concurrency is not a number"); - return new Concurrency(1, concurrency); - } - int lowerLimit = - parseInt( - vals[0], - "Concurrency lower limit is not a number", - "Concurrency lower limit must be non-zero"); - if (lowerLimit < Constants.MIN_CONCURRENCY) { - throw new IllegalStateException( - "lower limit of concurrency must be greater than or equal to " - + Constants.MIN_CONCURRENCY); - } - int upperLimit = - parseInt( - vals[1], - "Concurrency upper limit is not a number", - "Concurrency upper limit must be non-zero"); - if (lowerLimit > upperLimit) { - throw new IllegalStateException("upper limit of concurrency is smaller than the lower limit"); - } - return new Concurrency(lowerLimit, upperLimit); - } - - private String resolvePriorityGroup(RqueueListener rqueueListener) { - return ValueResolver.resolveKeyToString( - getApplicationContext(), rqueueListener.priorityGroup()); - } - - private int parseInt(String txt, String message, String nonZeroText) { - try { - int n = Integer.parseInt(txt); - if (n <= 0) { - throw new IllegalStateException(nonZeroText); - } - return n; - } catch (NumberFormatException e) { - throw new IllegalStateException(message, e); - } - } - - private Map resolvePriority(RqueueListener rqueueListener) { - String[] priorities = - ValueResolver.resolveKeyToArrayOfStrings( - getApplicationContext(), rqueueListener.priority()); - HashMap priorityMap = new HashMap<>(); - if (priorities.length == 0 || (priorities[0].equals(Constants.BLANK))) { - return priorityMap; - } - for (String priority : priorities) { - String[] vals = priority.split(":"); - if (vals.length == 1) { - vals = priority.split("="); - } - if (vals.length == 1) { - if (!priorityMap.isEmpty()) { - throw new IllegalStateException("Invalid priority configuration is used."); - } - priorityMap.put( - Constants.DEFAULT_PRIORITY_KEY, - parseInt( - vals[0], - "priority is not a number.", - "priority must be greater than or equal to 1")); - } else if (vals.length == 2) { - priorityMap.put( - vals[0], - parseInt( - vals[1], - "priority is not a number.", - "priority must be greater than or equal to 1")); - } else { - throw new IllegalStateException("Priority cannot be parsed"); - } - } - return Collections.unmodifiableMap(priorityMap); - } - - private boolean resolveConsumerEnabled(RqueueListener rqueueListener) { - return ValueResolver.resolveToBoolean( - getApplicationContext(), rqueueListener.deadLetterQueueListenerEnabled()); - } - - private long resolveVisibilityTimeout(RqueueListener rqueueListener) { - long value = - ValueResolver.resolveKeyToLong(getApplicationContext(), rqueueListener.visibilityTimeout()); - if (value < Constants.MIN_VISIBILITY) { - throw new IllegalStateException( - "Visibility must be greater than or equal to " + Constants.MIN_VISIBILITY); - } - return value; - } - - private int resolveNumRetries(RqueueListener rqueueListener) { - return ValueResolver.resolveKeyToInteger(getApplicationContext(), rqueueListener.numRetries()); - } - - private String resolveDeadLetterQueue(RqueueListener rqueueListener) { - String dlqName = rqueueListener.deadLetterQueue(); - String[] resolvedValues = - ValueResolver.resolveKeyToArrayOfStrings(getApplicationContext(), dlqName); - if (resolvedValues.length == 1) { - return resolvedValues[0]; - } - throw new IllegalStateException( - "more than one dead letter queue cannot be configured '" + dlqName + "'"); - } - - private boolean isActive(RqueueListener rqueueListener) { - return ValueResolver.resolveToBoolean(getApplicationContext(), rqueueListener.active()); - } - - private void checkInvalidQueueName(Set queueNames) { - List invalidNames = new LinkedList<>(); - Character[] invalidChars = - new Character[]{ - '{', '}', ' ', '<', '>', - }; - for (String queue : queueNames) { - for (int i = 0; i < queue.length(); i++) { - for (char invalidChar : invalidChars) { - if (queue.charAt(i) == invalidChar) { - invalidNames.add(queue); - break; - } - } - } - } - if (!invalidNames.isEmpty()) { - String invalidCharsStr = - Stream.of(invalidChars) - .map(e -> String.format("'%c'", e)) - .collect(Collectors.joining(Constants.Comma)); - String queueNamesStr = - invalidNames.stream() - .map(e -> String.format("'%s'", e)) - .collect(Collectors.joining(Constants.Comma)); - String message = - String.format( - "Queue name contains invalid char%n Not Allowed Chars [%s] %n Queues: [%s]", - invalidCharsStr, queueNamesStr); - throw new IllegalStateException(message); - } - } - - private Set resolveQueueNames(RqueueListener rqueueListener) { - String[] queueNames = rqueueListener.value(); - Set result = new HashSet<>(queueNames.length); - for (String queueName : queueNames) { - result.addAll( - Arrays.asList( - ValueResolver.resolveKeyToArrayOfStrings(getApplicationContext(), queueName))); - } - checkInvalidQueueName(result); - return Collections.unmodifiableSet(result); - } - - @Override - protected Set getDirectLookupDestinations(MappingInformation mapping) { - Set destinations = new HashSet<>(mapping.getQueueNames()); - for (String queueName : mapping.getQueueNames()) { - destinations.addAll(PriorityUtils.getNamesFromPriority(queueName, mapping.getPriority())); - } - return destinations; - } - - @Override - protected String getDestination(Message message) { - return (String) message.getHeaders().get(RqueueMessageHeaders.DESTINATION); - } - - @Override - protected MappingInformation getMatchingMapping(MappingInformation mapping, Message message) { - String destination = getDestination(message); - if (mapping.getQueueNames().contains(destination)) { - return mapping; - } - try { - QueueDetail queueDetail = EndpointRegistry.get(destination); - if (queueDetail.isSystemGenerated()) { - queueDetail = EndpointRegistry.get(queueDetail.getPriorityGroup()); - if (mapping.getQueueNames().contains(queueDetail.getName())) { - return mapping; - } - } - } catch (QueueDoesNotExist e) { - return null; - } - return null; - } + @AllArgsConstructor + static class HandlerMethodWithPrimary { - @Override - protected Comparator getMappingComparator(Message message) { - return new ComparableComparator<>(); - } + HandlerMethod method; + boolean primary; @Override - protected AbstractExceptionHandlerMethodResolver createExceptionHandlerMethodResolverFor( - Class beanType) { - return new AnnotationExceptionHandlerMethodResolver(beanType); - } - - @Override - protected void processHandlerMethodException( - HandlerMethod handlerMethod, Exception ex, Message message) { - super.processHandlerMethodException(handlerMethod, ex, message); - throw new MessagingException("An exception occurred while invoking the handler method", ex); + public String toString() { + return method.toString(); } + } @AllArgsConstructor - static class HandlerMethodWithPrimary { + @EqualsAndHashCode + private static class Match { - HandlerMethod method; - boolean primary; + private final MappingInformation information; + private final HandlerMethodWithPrimary handlerMethod; + } - @Override - public String toString() { - return method.toString(); - } - } + private class MultiHandler extends RetryableRunnable { - @AllArgsConstructor - @EqualsAndHashCode - private static class Match { + private final Match match; + private final Message message; + private final String lookupDestination; - private final MappingInformation information; - private final HandlerMethodWithPrimary handlerMethod; + protected MultiHandler(Match match, Message message, String lookupDestination) { + super(log, ""); + this.match = match; + this.message = message; + this.lookupDestination = lookupDestination; } - private class MultiHandler extends RetryableRunnable { - - private final Match match; - private final Message message; - private final String lookupDestination; - - protected MultiHandler(Match match, Message message, String lookupDestination) { - super(log, ""); - this.match = match; - this.message = message; - this.lookupDestination = lookupDestination; - } - - @Override - public void start() { - handleMatch(match.information, match.handlerMethod.method, lookupDestination, message); - } + @Override + public void start() { + handleMatch(match.information, match.handlerMethod.method, lookupDestination, message); } + } } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageHeaders.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageHeaders.java index 7404c874..33f0f395 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageHeaders.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageHeaders.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -59,8 +59,7 @@ public final class RqueueMessageHeaders { private static final MessageHeaders emptyMessageHeaders = new MessageHeaders(Collections.emptyMap()); - private RqueueMessageHeaders() { - } + private RqueueMessageHeaders() {} public static MessageHeaders emptyMessageHeaders() { return emptyMessageHeaders; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageListenerContainer.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageListenerContainer.java index 8bd7f5fc..3922c6f2 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageListenerContainer.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessageListenerContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2024 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -84,8 +84,10 @@ public class RqueueMessageListenerContainer private final ConcurrentHashMap> scheduledFutureByQueue = new ConcurrentHashMap<>(); private final Map queueThreadMap = new ConcurrentHashMap<>(); + @Autowired protected RqueueBeanProvider rqueueBeanProvider; + List middlewares; private MessageProcessor discardMessageProcessor; private MessageProcessor deadLetterQueueMessageProcessor; @@ -265,10 +267,9 @@ private void initializeQueue() { private void initializeThreadMapForNonDefaultExecutor( List registeredActiveQueueDetail) { - List queueDetails = - registeredActiveQueueDetail.stream() - .filter(e -> !e.isSystemGenerated()) - .collect(Collectors.toList()); + List queueDetails = registeredActiveQueueDetail.stream() + .filter(e -> !e.isSystemGenerated()) + .collect(Collectors.toList()); List withoutConcurrency = new ArrayList<>(); for (QueueDetail queueDetail : queueDetails) { if (queueDetail.getConcurrency().isValid()) { @@ -283,18 +284,17 @@ private void initializeThreadMapForNonDefaultExecutor( private void initialize() { initializeQueue(); - this.postProcessingHandler = - new PostProcessingHandler( - rqueueBeanProvider.getRqueueWebConfig(), - rqueueBeanProvider.getApplicationEventPublisher(), - rqueueMessageTemplate, - taskExecutionBackOff, - new MessageProcessorHandler( - manualDeletionMessageProcessor, - deadLetterQueueMessageProcessor, - discardMessageProcessor, - postExecutionMessageProcessor), - rqueueBeanProvider.getRqueueSystemConfigDao()); + this.postProcessingHandler = new PostProcessingHandler( + rqueueBeanProvider.getRqueueWebConfig(), + rqueueBeanProvider.getApplicationEventPublisher(), + rqueueMessageTemplate, + taskExecutionBackOff, + new MessageProcessorHandler( + manualDeletionMessageProcessor, + deadLetterQueueMessageProcessor, + discardMessageProcessor, + postExecutionMessageProcessor), + rqueueBeanProvider.getRqueueSystemConfigDao()); this.rqueueBeanProvider.setPreExecutionMessageProcessor(preExecutionMessageProcessor); } @@ -373,10 +373,9 @@ private void createExecutor(QueueDetail queueDetail) { public AsyncTaskExecutor createDefaultTaskExecutor( List registeredActiveQueueDetail) { - List queueDetails = - registeredActiveQueueDetail.stream() - .filter(e -> !e.isSystemGenerated()) - .collect(Collectors.toList()); + List queueDetails = registeredActiveQueueDetail.stream() + .filter(e -> !e.isSystemGenerated()) + .collect(Collectors.toList()); List withoutConcurrency = new ArrayList<>(); for (QueueDetail queueDetail : queueDetails) { if (queueDetail.getConcurrency().getMin() > 0) { @@ -410,26 +409,25 @@ private List getQueueDetail(String queue, MappingInformation mappin priorityGroup = Constants.DEFAULT_PRIORITY_GROUP; } RqueueConfig rqueueConfig = rqueueBeanProvider.getRqueueConfig(); - QueueDetail queueDetail = - QueueDetail.builder() - .name(queue) - .queueName(rqueueConfig.getQueueName(queue)) - .processingQueueName(rqueueConfig.getProcessingQueueName(queue)) - .completedQueueName(rqueueConfig.getCompletedQueueName(queue)) - .scheduledQueueName(rqueueConfig.getScheduledQueueName(queue)) - .processingQueueChannelName(rqueueConfig.getProcessingQueueChannelName(queue)) - .scheduledQueueChannelName(rqueueConfig.getScheduledQueueChannelName(queue)) - .deadLetterQueueName(mappingInformation.getDeadLetterQueueName()) - .visibilityTimeout(mappingInformation.getVisibilityTimeout()) - .deadLetterConsumerEnabled(mappingInformation.isDeadLetterConsumerEnabled()) - .concurrency(mappingInformation.getConcurrency()) - .batchSize(mappingInformation.getBatchSize()) - .active(mappingInformation.isActive()) - .numRetry(numRetry) - .priority(priority) - .priorityGroup(priorityGroup) - .doNotRetry(mappingInformation.getDoNotRetry()) - .build(); + QueueDetail queueDetail = QueueDetail.builder() + .name(queue) + .queueName(rqueueConfig.getQueueName(queue)) + .processingQueueName(rqueueConfig.getProcessingQueueName(queue)) + .completedQueueName(rqueueConfig.getCompletedQueueName(queue)) + .scheduledQueueName(rqueueConfig.getScheduledQueueName(queue)) + .processingQueueChannelName(rqueueConfig.getProcessingQueueChannelName(queue)) + .scheduledQueueChannelName(rqueueConfig.getScheduledQueueChannelName(queue)) + .deadLetterQueueName(mappingInformation.getDeadLetterQueueName()) + .visibilityTimeout(mappingInformation.getVisibilityTimeout()) + .deadLetterConsumerEnabled(mappingInformation.isDeadLetterConsumerEnabled()) + .concurrency(mappingInformation.getConcurrency()) + .batchSize(mappingInformation.getBatchSize()) + .active(mappingInformation.isActive()) + .numRetry(numRetry) + .priority(priority) + .priorityGroup(priorityGroup) + .doNotRetry(mappingInformation.getDoNotRetry()) + .build(); List queueDetails; if (queueDetail.getPriority().size() <= 1) { queueDetails = Collections.singletonList(queueDetail); @@ -503,48 +501,42 @@ protected void startGroup(String groupName, List queueDetails) { Map queueThread = getQueueThreadMap(groupName, queueDetails); Future future; if (getPriorityMode() == PriorityMode.STRICT) { - future = - taskExecutor.submit( - new StrictPriorityPoller( - StringUtils.groupName(groupName), - queueDetails, - queueThread, - rqueueBeanProvider, - queueStateMgr, - getMiddleWares(), - pollingInterval, - backOffTime, - postProcessingHandler, - getMessageHeaders())); + future = taskExecutor.submit(new StrictPriorityPoller( + StringUtils.groupName(groupName), + queueDetails, + queueThread, + rqueueBeanProvider, + queueStateMgr, + getMiddleWares(), + pollingInterval, + backOffTime, + postProcessingHandler, + getMessageHeaders())); } else if (getPriorityMode() == PriorityMode.HARD_STRICT) { - future = - taskExecutor.submit( - new HardStrictPriorityPoller( - StringUtils.groupName(groupName), - queueDetails, - queueThread, - rqueueBeanProvider, - queueStateMgr, - getMiddleWares(), - pollingInterval, - backOffTime, - postProcessingHandler, - getMessageHeaders(), - getHardStrictPriorityPollerProperties())); + future = taskExecutor.submit(new HardStrictPriorityPoller( + StringUtils.groupName(groupName), + queueDetails, + queueThread, + rqueueBeanProvider, + queueStateMgr, + getMiddleWares(), + pollingInterval, + backOffTime, + postProcessingHandler, + getMessageHeaders(), + getHardStrictPriorityPollerProperties())); } else { - future = - taskExecutor.submit( - new WeightedPriorityPoller( - StringUtils.groupName(groupName), - queueDetails, - queueThread, - rqueueBeanProvider, - queueStateMgr, - getMiddleWares(), - pollingInterval, - backOffTime, - postProcessingHandler, - getMessageHeaders())); + future = taskExecutor.submit(new WeightedPriorityPoller( + StringUtils.groupName(groupName), + queueDetails, + queueThread, + rqueueBeanProvider, + queueStateMgr, + getMiddleWares(), + pollingInterval, + backOffTime, + postProcessingHandler, + getMessageHeaders())); } scheduledFutureByQueue.put(groupName, future); } @@ -557,17 +549,16 @@ protected void startQueue(String queueName, QueueDetail queueDetail) { QueueConfig config = rqueueBeanProvider.getRqueueSystemConfigDao().getConfigByName(queueName); queueStateMgr.pauseQueueIfRequired(config); QueueThreadPool queueThreadPool = queueThreadMap.get(queueName); - DefaultRqueuePoller messagePoller = - new DefaultRqueuePoller( - queueDetail, - queueThreadPool, - rqueueBeanProvider, - queueStateMgr, - getMiddleWares(), - pollingInterval, - backOffTime, - postProcessingHandler, - getMessageHeaders()); + DefaultRqueuePoller messagePoller = new DefaultRqueuePoller( + queueDetail, + queueThreadPool, + rqueueBeanProvider, + queueStateMgr, + getMiddleWares(), + pollingInterval, + backOffTime, + postProcessingHandler, + getMessageHeaders()); Future future = getTaskExecutor().submit(messagePoller); scheduledFutureByQueue.put(queueName, future); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessagePoller.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessagePoller.java index 067c175c..a64bd101 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessagePoller.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/RqueueMessagePoller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -72,15 +72,14 @@ private void execute( QueueThreadPool queueThreadPool, QueueDetail queueDetail, RqueueMessage message) { message.setMessageHeaders(messageHeaders); try { - queueThreadPool.execute( - new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - middlewares, - postProcessingHandler, - message, - queueDetail, - queueThreadPool)); + queueThreadPool.execute(new RqueueExecutor( + rqueueBeanProvider, + queueStateMgr, + middlewares, + postProcessingHandler, + message, + queueDetail, + queueThreadPool)); } catch (Exception e) { if (e instanceof TaskRejectedException) { queueThreadPool.taskRejected(queueDetail, message); @@ -104,7 +103,6 @@ protected boolean hasAvailableThreads(QueueDetail queueDetail, QueueThreadPool q return queueThreadPool.availableThreads() > 0; } - protected int getBatchSize(QueueDetail queueDetail, QueueThreadPool queueThreadPool) { int batchSize = Math.min(queueDetail.getBatchSize(), queueThreadPool.availableThreads()); batchSize = Math.max(batchSize, Constants.MIN_BATCH_SIZE); @@ -152,8 +150,7 @@ private void pollAndExecute( } } - void poll(int index, String queue, QueueDetail queueDetail, - QueueThreadPool queueThreadPool) { + void poll(int index, String queue, QueueDetail queueDetail, QueueThreadPool queueThreadPool) { log(Level.TRACE, "Polling queue {}", null, queue); int batchSize = getBatchSize(queueDetail, queueThreadPool); boolean acquired; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/StrictPriorityPoller.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/StrictPriorityPoller.java index bb9dad69..404bed4d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/StrictPriorityPoller.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/StrictPriorityPoller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2024 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -61,15 +61,12 @@ class StrictPriorityPoller extends RqueueMessagePoller { postProcessingHandler, messageHeaders); List queueDetailList = new ArrayList<>(queueDetails); - queueDetailList.sort( - (o1, o2) -> - o2.getPriority().get(Constants.DEFAULT_PRIORITY_KEY) - - o1.getPriority().get(Constants.DEFAULT_PRIORITY_KEY)); + queueDetailList.sort((o1, o2) -> o2.getPriority().get(Constants.DEFAULT_PRIORITY_KEY) + - o1.getPriority().get(Constants.DEFAULT_PRIORITY_KEY)); this.queues = queueDetailList.stream().map(QueueDetail::getName).collect(Collectors.toList()); queues.forEach(queue -> this.lastFetchedTime.put(queue, 0L)); - this.queueNameToDetail = - queueDetailList.stream() - .collect(Collectors.toMap(QueueDetail::getName, Function.identity())); + this.queueNameToDetail = queueDetailList.stream() + .collect(Collectors.toMap(QueueDetail::getName, Function.identity())); this.queueNameToThread = queueNameToThread; } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/WeightedPriorityPoller.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/WeightedPriorityPoller.java index 8f2a084e..df71480b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/WeightedPriorityPoller.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/listener/WeightedPriorityPoller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2024 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/QueueCounter.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/QueueCounter.java index 4ee64f27..35173d19 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/QueueCounter.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/QueueCounter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2025 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -59,18 +59,16 @@ void registerQueue( MeterRegistry registry, QueueDetail queueDetail) { if (metricsProperties.countFailure()) { - Counter.Builder builder = - Counter.builder(metricsProperties.getMetricName(FAILURE_COUNT)) - .tags(queueTags.and(QUEUE_KEY, queueDetail.getQueueName())) - .description("Failure count"); + Counter.Builder builder = Counter.builder(metricsProperties.getMetricName(FAILURE_COUNT)) + .tags(queueTags.and(QUEUE_KEY, queueDetail.getQueueName())) + .description("Failure count"); Counter counter = builder.register(registry); queueNameToFailureCounter.put(queueDetail.getName(), counter); } if (metricsProperties.countExecution()) { - Counter.Builder builder = - Counter.builder(metricsProperties.getMetricName(EXECUTION_COUNT)) - .tags(queueTags.and(QUEUE_KEY, queueDetail.getQueueName())) - .description("Task execution count"); + Counter.Builder builder = Counter.builder(metricsProperties.getMetricName(EXECUTION_COUNT)) + .tags(queueTags.and(QUEUE_KEY, queueDetail.getQueueName())) + .description("Task execution count"); Counter counter = builder.register(registry); queueNameToExecutionCounter.put(queueDetail.getName(), counter); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueCounter.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueCounter.java index 222e9cc3..7da81462 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueCounter.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueCounter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetrics.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetrics.java index 56368e73..d4389925 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetrics.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetrics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -41,10 +41,13 @@ public class RqueueMetrics implements RqueueMetricsRegistry { private static final String PROCESSING_QUEUE_SIZE = "processing.queue.size"; private static final String DEAD_LETTER_QUEUE_SIZE = "dead.letter.queue.size"; private final QueueCounter queueCounter; + @Autowired private MetricsProperties metricsProperties; + @Autowired private MeterRegistry meterRegistry; + @Autowired private RqueueStringDao rqueueStringDao; @@ -67,24 +70,33 @@ private long size(String name, boolean isZset) { private void monitor() { for (QueueDetail queueDetail : EndpointRegistry.getActiveQueueDetails()) { - Tags queueTags = Tags.concat(metricsProperties.getMetricTags(), "queue", - queueDetail.getName()); - Gauge.builder(metricsProperties.getMetricName(QUEUE_SIZE), queueDetail, + Tags queueTags = + Tags.concat(metricsProperties.getMetricTags(), "queue", queueDetail.getName()); + Gauge.builder( + metricsProperties.getMetricName(QUEUE_SIZE), + queueDetail, c -> size(queueDetail.getQueueName(), false)) .tags(queueTags.and(QUEUE_KEY, queueDetail.getQueueName())) - .description("The number of entries in this queue").register(meterRegistry); - Gauge.builder(metricsProperties.getMetricName(PROCESSING_QUEUE_SIZE), queueDetail, + .description("The number of entries in this queue") + .register(meterRegistry); + Gauge.builder( + metricsProperties.getMetricName(PROCESSING_QUEUE_SIZE), + queueDetail, c -> size(queueDetail.getProcessingQueueName(), true)) .tags(queueTags.and(QUEUE_KEY, queueDetail.getProcessingQueueName())) - .description("The number of entries in the processing queue").register(meterRegistry); - Gauge.builder(metricsProperties.getMetricName(SCHEDULED_QUEUE_SIZE), queueDetail, + .description("The number of entries in the processing queue") + .register(meterRegistry); + Gauge.builder( + metricsProperties.getMetricName(SCHEDULED_QUEUE_SIZE), + queueDetail, c -> size(queueDetail.getScheduledQueueName(), true)) .tags(queueTags.and(QUEUE_KEY, queueDetail.getScheduledQueueName())) .description("The number of entries waiting in the scheduled queue") .register(meterRegistry); if (queueDetail.isDlqSet()) { Builder builder = Gauge.builder( - metricsProperties.getMetricName(DEAD_LETTER_QUEUE_SIZE), queueDetail, + metricsProperties.getMetricName(DEAD_LETTER_QUEUE_SIZE), + queueDetail, c -> size(queueDetail.getDeadLetterQueueName(), false)); builder.tags(queueTags); builder.description("The number of entries in the dead letter queue"); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetricsCounter.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetricsCounter.java index 6f2a5f23..119625ff 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetricsCounter.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetricsCounter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetricsRegistry.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetricsRegistry.java index bd5fc685..9d51411d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetricsRegistry.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueMetricsRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueQueueMetrics.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueQueueMetrics.java index 9ca9b5cb..982c2bce 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueQueueMetrics.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/metrics/RqueueQueueMetrics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/Concurrency.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/Concurrency.java index a6db28b8..cc4e23d6 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/Concurrency.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/Concurrency.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/MessageMoveResult.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/MessageMoveResult.java index 7a22668c..1c8d94b5 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/MessageMoveResult.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/MessageMoveResult.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/MinMax.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/MinMax.java index ff761e72..5913a7cb 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/MinMax.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/MinMax.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/Pair.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/Pair.java index 657e8a02..5bf1c32a 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/Pair.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/Pair.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/PubSubMessage.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/PubSubMessage.java index e3d41447..ac28fe32 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/PubSubMessage.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/PubSubMessage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/SerializableBase.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/SerializableBase.java index 0146d493..4312ba9c 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/SerializableBase.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/SerializableBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -27,6 +27,4 @@ @NoArgsConstructor @EqualsAndHashCode @JsonInclude(Include.NON_NULL) -public abstract class SerializableBase implements Serializable { - -} +public abstract class SerializableBase implements Serializable {} diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/aggregator/QueueEvents.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/aggregator/QueueEvents.java index 6faefb29..e0af1518 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/aggregator/QueueEvents.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/aggregator/QueueEvents.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/aggregator/TasksStat.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/aggregator/TasksStat.java index 207b5d9d..646c7188 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/aggregator/TasksStat.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/aggregator/TasksStat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/CheckinMessage.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/CheckinMessage.java index f79ff6e4..8baecf05 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/CheckinMessage.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/CheckinMessage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/DeadLetterQueue.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/DeadLetterQueue.java index b600c2d1..900159e1 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/DeadLetterQueue.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/DeadLetterQueue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/Execution.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/Execution.java index 0e9e88fa..8b8465a2 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/Execution.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/Execution.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -38,7 +38,9 @@ public class Execution extends SerializableBase { private long startTime; private long endTime; private String error; + @JsonIgnore private Throwable exception; + private ExecutionStatus status; } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/JobRunTime.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/JobRunTime.java index e7efb4c9..eb754600 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/JobRunTime.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/JobRunTime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/MessageMetadata.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/MessageMetadata.java index 615ed725..776fdcca 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/MessageMetadata.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/MessageMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -66,8 +66,8 @@ public void merge(MessageMetadata other) { } if (other.isDeleted() && !this.isDeleted()) { this.deleted = true; - if (MessageStatus.DELETED.equals(other.getStatus()) && !MessageStatus.DELETED.equals( - this.getStatus())) { + if (MessageStatus.DELETED.equals(other.getStatus()) + && !MessageStatus.DELETED.equals(this.getStatus())) { this.status = MessageStatus.DELETED; if (this.updatedOn < other.updatedOn) { this.updatedOn = other.updatedOn; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/QueueConfig.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/QueueConfig.java index 402d9e91..d0f6377a 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/QueueConfig.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/QueueConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/QueueStatistics.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/QueueStatistics.java index 1eb9981d..e2007990 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/QueueStatistics.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/QueueStatistics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -35,8 +35,10 @@ public class QueueStatistics extends SerializableBase { private static final long serialVersionUID = -4931206278693499365L; + @EqualsAndHashCode.Include private String id; + private Long startEpochDate; private Map tasksMovedToDeadLetter; private Map tasksDiscarded; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/RqueueJob.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/RqueueJob.java index 9e0460b0..0bddb208 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/RqueueJob.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/db/RqueueJob.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ActionType.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ActionType.java index 35bb18f5..265a3ca1 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ActionType.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ActionType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/AggregationType.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/AggregationType.java index d810a45e..de85292e 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/AggregationType.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/AggregationType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ChartDataType.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ChartDataType.java index 52fff231..5cfe615d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ChartDataType.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ChartDataType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ChartType.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ChartType.java index 25fbd741..1c37a6df 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ChartType.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ChartType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/DataType.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/DataType.java index c42005cc..31aee3fe 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/DataType.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/DataType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ExecutionStatus.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ExecutionStatus.java index bb9f5ef6..89e92793 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ExecutionStatus.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/ExecutionStatus.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/JobStatus.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/JobStatus.java index d55ea1c7..9e1532ad 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/JobStatus.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/JobStatus.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/MessageStatus.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/MessageStatus.java index 6049a964..c493a78e 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/MessageStatus.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/MessageStatus.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/NavTab.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/NavTab.java index 6881660c..d8ba4d43 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/NavTab.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/NavTab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/PriorityMode.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/PriorityMode.java index 0fa83405..f9215bcc 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/PriorityMode.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/PriorityMode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/PubSubType.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/PubSubType.java index 41262f6c..23629f87 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/PubSubType.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/PubSubType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/RqueueMode.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/RqueueMode.java index 3f84c134..7ed03ff0 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/RqueueMode.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/RqueueMode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/TableColumnType.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/TableColumnType.java index 46fa3d2d..269ff015 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/TableColumnType.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/enums/TableColumnType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueBootstrapEvent.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueBootstrapEvent.java index edcf633a..4b8658ee 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueBootstrapEvent.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueBootstrapEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueExecutionEvent.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueExecutionEvent.java index 6831b148..e8f04f4b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueExecutionEvent.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueExecutionEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueuePubSubEvent.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueuePubSubEvent.java index 0883478b..ab9749e1 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueuePubSubEvent.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueuePubSubEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueQueuePauseEvent.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueQueuePauseEvent.java index 94ce2739..5013d452 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueQueuePauseEvent.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/event/RqueueQueuePauseEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/ChartDataRequest.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/ChartDataRequest.java index 1a595caa..0d884b39 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/ChartDataRequest.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/ChartDataRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DataDeleteRequest.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DataDeleteRequest.java index bdb1b5df..3f529584 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DataDeleteRequest.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DataDeleteRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DataTypeRequest.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DataTypeRequest.java index 05d11d2f..0dac5589 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DataTypeRequest.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DataTypeRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DateViewRequest.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DateViewRequest.java index 1e928a87..3c2b0262 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DateViewRequest.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/DateViewRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/MessageDeleteRequest.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/MessageDeleteRequest.java index 0c316817..831ebd8e 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/MessageDeleteRequest.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/MessageDeleteRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/MessageMoveRequest.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/MessageMoveRequest.java index 251da38f..e1d589f3 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/MessageMoveRequest.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/MessageMoveRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/PauseUnpauseQueueRequest.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/PauseUnpauseQueueRequest.java index 75f40484..a555eaa4 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/PauseUnpauseQueueRequest.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/PauseUnpauseQueueRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/QueueExploreRequest.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/QueueExploreRequest.java index a7c3fa0a..76350e28 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/QueueExploreRequest.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/request/QueueExploreRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/Action.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/Action.java index 5d015a31..87594be9 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/Action.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/Action.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/BaseResponse.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/BaseResponse.java index 04522334..44f40f49 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/BaseResponse.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/BaseResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/BooleanResponse.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/BooleanResponse.java index 31bfe2fe..c0443dfb 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/BooleanResponse.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/BooleanResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/ChartDataResponse.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/ChartDataResponse.java index 4329324f..223f330e 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/ChartDataResponse.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/ChartDataResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/DataSelectorResponse.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/DataSelectorResponse.java index b5896ccd..6eee2fdf 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/DataSelectorResponse.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/DataSelectorResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/DataViewResponse.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/DataViewResponse.java index 29b40f6b..c642ea17 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/DataViewResponse.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/DataViewResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/MessageMoveResponse.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/MessageMoveResponse.java index ae8cf9b8..a936621b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/MessageMoveResponse.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/MessageMoveResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RedisDataDetail.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RedisDataDetail.java index c7a4ae98..fbe40d51 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RedisDataDetail.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RedisDataDetail.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RowColumnMeta.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RowColumnMeta.java index bc3d9707..2916c3cf 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RowColumnMeta.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RowColumnMeta.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RowColumnMetaType.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RowColumnMetaType.java index a2d33ba9..39dc3d7d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RowColumnMetaType.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/RowColumnMetaType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/StringResponse.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/StringResponse.java index 141fcb84..6ef70a7a 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/StringResponse.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/StringResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/Table.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/Table.java index fb0c44a3..b869f9fe 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/Table.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/Table.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/TableColumn.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/TableColumn.java index 5c3c8586..335c5270 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/TableColumn.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/TableColumn.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/TableRow.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/TableRow.java index a50a243c..faecf039 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/TableRow.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/models/response/TableRow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/Constants.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/Constants.java index 05d42b51..1a8ececb 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/Constants.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/Constants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -56,8 +56,7 @@ public final class Constants { public static final String QUEUE_CRUD_LOCK_KEY_PREFIX = "q-crud::"; public static final String MESSAGE_LOCK_KEY_PREFIX = "msg::"; - private Constants() { - } + private Constants() {} public static String getQueueCrudLockKey(RqueueConfig rqueueConfig, String queueName) { return rqueueConfig.getLockKey(QUEUE_CRUD_LOCK_KEY_PREFIX + queueName); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/DateTimeUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/DateTimeUtils.java index e0697549..ad886809 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/DateTimeUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/DateTimeUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -28,10 +28,10 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class DateTimeUtils { - private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern( - "yyyy-MM-dd HH:mm"); - private static final DateTimeFormatter dateTimeFormatterWithSecond = DateTimeFormatter.ofPattern( - "yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter dateTimeFormatter = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + private static final DateTimeFormatter dateTimeFormatterWithSecond = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static String hourString(long hour) { if (hour > 1) { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ExceptionUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ExceptionUtils.java index 9577e2ea..8e009211 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ExceptionUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ExceptionUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -21,8 +21,7 @@ public final class ExceptionUtils { - private ExceptionUtils() { - } + private ExceptionUtils() {} public static String getTraceback(Throwable e, int maxLength) { if (e == null) { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/HttpUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/HttpUtils.java index 51218850..c5f74bd0 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/HttpUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/HttpUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -26,8 +26,7 @@ @Slf4j public final class HttpUtils { - private HttpUtils() { - } + private HttpUtils() {} private static SimpleClientHttpRequestFactory getRequestFactory(RqueueConfig rqueueConfig) { SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); @@ -36,10 +35,9 @@ private static SimpleClientHttpRequestFactory getRequestFactory(RqueueConfig rqu if (StringUtils.isEmpty(rqueueConfig.getProxyHost())) { return requestFactory; } - Proxy proxy = - new Proxy( - rqueueConfig.getProxyType(), - new InetSocketAddress(rqueueConfig.getProxyHost(), rqueueConfig.getProxyPort())); + Proxy proxy = new Proxy( + rqueueConfig.getProxyType(), + new InetSocketAddress(rqueueConfig.getProxyHost(), rqueueConfig.getProxyPort())); requestFactory.setProxy(proxy); return requestFactory; } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/PrefixLogger.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/PrefixLogger.java index 62135ee3..735b1e92 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/PrefixLogger.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/PrefixLogger.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/PriorityUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/PriorityUtils.java index 593396c0..98d9e940 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/PriorityUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/PriorityUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -22,8 +22,7 @@ public final class PriorityUtils { - private PriorityUtils() { - } + private PriorityUtils() {} public static Set getNamesFromPriority(String queueName, Map priority) { Set keys = new HashSet<>(); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/QueueThreadPool.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/QueueThreadPool.java index 6df74328..f62f1468 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/QueueThreadPool.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/QueueThreadPool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/RedisUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/RedisUtils.java index 5c847b18..9284b798 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/RedisUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/RedisUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -34,40 +34,37 @@ public final class RedisUtils { @SuppressWarnings({"java:S1104", "java:S1444"}) - public static RedisTemplateProvider redisTemplateProvider = - new RedisTemplateProvider() { - @Override - public RedisTemplate getRedisTemplate( - RedisConnectionFactory redisConnectionFactory) { - RedisTemplate redisTemplate = new RedisTemplate<>(); - StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); - RqueueRedisSerializer rqueueRedisSerializer = new RqueueRedisSerializer(); - redisTemplate.setConnectionFactory(redisConnectionFactory); - redisTemplate.setKeySerializer(stringRedisSerializer); - redisTemplate.setValueSerializer(rqueueRedisSerializer); - redisTemplate.setHashKeySerializer(stringRedisSerializer); - redisTemplate.setHashValueSerializer(rqueueRedisSerializer); - return redisTemplate; - } - }; + public static RedisTemplateProvider redisTemplateProvider = new RedisTemplateProvider() { + @Override + public RedisTemplate getRedisTemplate( + RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + RqueueRedisSerializer rqueueRedisSerializer = new RqueueRedisSerializer(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setValueSerializer(rqueueRedisSerializer); + redisTemplate.setHashKeySerializer(stringRedisSerializer); + redisTemplate.setHashValueSerializer(rqueueRedisSerializer); + return redisTemplate; + } + }; @SuppressWarnings({"java:S1104", "java:S1444"}) - public static RedisSerializationContextProvider redisSerializationContextProvider = - () -> { - StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); - RqueueRedisSerializer rqueueRedisSerializer = new RqueueRedisSerializer(); - RedisSerializationContextBuilder redisSerializationContextBuilder = - RedisSerializationContext.newSerializationContext(); - redisSerializationContextBuilder = - redisSerializationContextBuilder.key(stringRedisSerializer); - redisSerializationContextBuilder = - redisSerializationContextBuilder.value(rqueueRedisSerializer); - redisSerializationContextBuilder = - redisSerializationContextBuilder.hashKey(stringRedisSerializer); - redisSerializationContextBuilder = - redisSerializationContextBuilder.hashValue(rqueueRedisSerializer); - return redisSerializationContextBuilder.build(); - }; + public static RedisSerializationContextProvider redisSerializationContextProvider = () -> { + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + RqueueRedisSerializer rqueueRedisSerializer = new RqueueRedisSerializer(); + RedisSerializationContextBuilder redisSerializationContextBuilder = + RedisSerializationContext.newSerializationContext(); + redisSerializationContextBuilder = redisSerializationContextBuilder.key(stringRedisSerializer); + redisSerializationContextBuilder = + redisSerializationContextBuilder.value(rqueueRedisSerializer); + redisSerializationContextBuilder = + redisSerializationContextBuilder.hashKey(stringRedisSerializer); + redisSerializationContextBuilder = + redisSerializationContextBuilder.hashValue(rqueueRedisSerializer); + return redisSerializationContextBuilder.build(); + }; @SuppressWarnings({"java:S1104", "java:S1444"}) public static ReactiveRedisTemplateProvider reactiveRedisTemplateProvider = @@ -80,8 +77,7 @@ public ReactiveRedisTemplate getRedisTemplate( } }; - private RedisUtils() { - } + private RedisUtils() {} public static RedisTemplate getRedisTemplate( RedisConnectionFactory redisConnectionFactory) { @@ -96,16 +92,13 @@ public static ReactiveRedisTemplate getReactiveRedisTemplate( @SuppressWarnings("unchecked") public static List executePipeLine( RedisTemplate template, RedisPipelineCallback callback) { - return template.executePipelined( - (RedisCallback) - connection -> { - RedisSerializer keySerializer = - (RedisSerializer) template.getKeySerializer(); - RedisSerializer valueSerializer = - (RedisSerializer) template.getValueSerializer(); - callback.doInRedis(connection, keySerializer, valueSerializer); - return null; - }); + return template.executePipelined((RedisCallback) connection -> { + RedisSerializer keySerializer = (RedisSerializer) template.getKeySerializer(); + RedisSerializer valueSerializer = + (RedisSerializer) template.getValueSerializer(); + callback.doInRedis(connection, keySerializer, valueSerializer); + return null; + }); } public static void setVersion( @@ -131,12 +124,10 @@ public static int updateAndGetVersion( if (dbVersion > 0) { return dbVersion; } - List result = - RedisUtils.executePipeLine( - rqueueRedisTemplate.getRedisTemplate(), - ((connection, keySerializer, valueSerializer) -> - connection.eval( - "return #redis.pcall('keys', 'rqueue-*')".getBytes(), ReturnType.INTEGER, 0))); + List result = RedisUtils.executePipeLine( + rqueueRedisTemplate.getRedisTemplate(), + ((connection, keySerializer, valueSerializer) -> connection.eval( + "return #redis.pcall('keys', 'rqueue-*')".getBytes(), ReturnType.INTEGER, 0))); Long count = (Long) result.get(0); if (count != null && count > 0L) { rqueueRedisTemplate.set(versionKey, 1); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/RetryableRunnable.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/RetryableRunnable.java index bc6ada08..8ca430e5 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/RetryableRunnable.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/RetryableRunnable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/SerializationUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/SerializationUtils.java index e1c3ba1c..30ed3fb1 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/SerializationUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/SerializationUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package com.github.sonus21.rqueue.utils; - import tools.jackson.databind.DeserializationFeature; import tools.jackson.databind.ObjectMapper; import tools.jackson.databind.json.JsonMapper; @@ -25,8 +24,7 @@ public final class SerializationUtils { public static final byte[] EMPTY_ARRAY = new byte[0]; - private SerializationUtils() { - } + private SerializationUtils() {} public static boolean isEmpty(byte[] bytes) { return bytes == null || bytes.length == 0; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/StackTraceUtil.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/StackTraceUtil.java index 8c180604..a05dd887 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/StackTraceUtil.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/StackTraceUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Sonu Kumar + * Copyright (c) 2022-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,17 +31,16 @@ public void printStackTrace(int frameCount) { for (int i = 2; printed < frameCount && i < elements.length; i++) { StackTraceElement element = elements[i]; String className = element.getClassName(); - if (className.startsWith("org.springframework.aop") || - className.startsWith("org.springframework.cglib.proxy")) { + if (className.startsWith("org.springframework.aop") + || className.startsWith("org.springframework.cglib.proxy")) { continue; } if (element.getMethodName().startsWith("invoke")) { continue; } - log.info("{} {} {}", element.getClassName(), element.getMethodName(), - element.getLineNumber()); + log.info( + "{} {} {}", element.getClassName(), element.getMethodName(), element.getLineNumber()); printed += 1; } } - } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/StringUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/StringUtils.java index a83a9c9f..f136a316 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/StringUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/StringUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -20,8 +20,7 @@ public final class StringUtils { - StringUtils() { - } + StringUtils() {} public static boolean isEmpty(String string) { if (string == null) { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ThreadUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ThreadUtils.java index 45cff706..8d04d791 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ThreadUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ThreadUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,8 +31,7 @@ public final class ThreadUtils { - private ThreadUtils() { - } + private ThreadUtils() {} public static ThreadPoolTaskScheduler createTaskScheduler( int poolSize, String threadPrefix, int terminationTime) { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/TimeoutUtils.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/TimeoutUtils.java index 6c0f303d..bed940c5 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/TimeoutUtils.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/TimeoutUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -33,14 +33,12 @@ public final class TimeoutUtils { public static final long EXECUTION_TIME = 10_000L; public static final long SLEEP_TIME = 100L; - private TimeoutUtils() { - } + private TimeoutUtils() {} public static void waitFor( BooleanSupplier callback, long waitTimeInMilliSeconds, String description) throws TimedOutException { - waitFor(callback, waitTimeInMilliSeconds, SLEEP_TIME, description, () -> { - }); + waitFor(callback, waitTimeInMilliSeconds, SLEEP_TIME, description, () -> {}); } public static void waitFor(BooleanSupplier callback, String description) diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/Validator.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/Validator.java index 2cffd2ce..d6c68f63 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/Validator.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/Validator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -20,8 +20,7 @@ public final class Validator { - private Validator() { - } + private Validator() {} public static void validateMessage(Object message) { notNull(message, "message cannot be null"); @@ -60,10 +59,9 @@ public static void validatePriority(String priority) { public static void validatePeriod(long period) { if (period < Constants.MINIMUM_JOB_PERIOD) { - throw new IllegalArgumentException( - "period must be greater than or equal to " - + Constants.MINIMUM_JOB_PERIOD - + " Milliseconds"); + throw new IllegalArgumentException("period must be greater than or equal to " + + Constants.MINIMUM_JOB_PERIOD + + " Milliseconds"); } } } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ValueResolver.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ValueResolver.java index 75d3baaf..07a0321b 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ValueResolver.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/ValueResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -30,8 +30,7 @@ public final class ValueResolver { - private ValueResolver() { - } + private ValueResolver() {} @SuppressWarnings("unchecked") public static T parseStringUsingSpel(String val, Class t) { @@ -91,9 +90,8 @@ private static Object resolveExpression(ApplicationContext applicationContext, S if (exprResolver == null) { return name; } - Object result = - exprResolver.evaluate( - placeholdersResolved, new BeanExpressionContext(configurableBeanFactory, null)); + Object result = exprResolver.evaluate( + placeholdersResolved, new BeanExpressionContext(configurableBeanFactory, null)); if (result != null) { return result; } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/ExponentialTaskExecutionBackOff.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/ExponentialTaskExecutionBackOff.java index fd4b6f64..85c85042 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/ExponentialTaskExecutionBackOff.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/ExponentialTaskExecutionBackOff.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -60,8 +60,7 @@ public class ExponentialTaskExecutionBackOff implements TaskExecutionBackOff { * interval of {@value #DEFAULT_MAX_INTERVAL}, multiplier of {@value #DEFAULT_MULTIPLIER} and * default unlimited retries. */ - public ExponentialTaskExecutionBackOff() { - } + public ExponentialTaskExecutionBackOff() {} /** * Create an instance. @@ -104,11 +103,10 @@ private void checkMaxInterval(long initialInterval, long maxInterval) { private void checkMultiplier(double multiplier) { if (multiplier < 1) { - throw new IllegalArgumentException( - "Invalid multiplier '" - + multiplier - + "'. Should be greater than " - + "or equal to 1. A multiplier of 1 is equivalent to a fixed interval."); + throw new IllegalArgumentException("Invalid multiplier '" + + multiplier + + "'. Should be greater than " + + "or equal to 1. A multiplier of 1 is equivalent to a fixed interval."); } } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/FixedTaskExecutionBackOff.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/FixedTaskExecutionBackOff.java index 3be00035..8823e5c7 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/FixedTaskExecutionBackOff.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/FixedTaskExecutionBackOff.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -43,8 +43,7 @@ public class FixedTaskExecutionBackOff implements TaskExecutionBackOff { * Create an instance with an interval of {@value #DEFAULT_INTERVAL} ms and maximum value of * retries. */ - public FixedTaskExecutionBackOff() { - } + public FixedTaskExecutionBackOff() {} /** * Create an instance. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/TaskExecutionBackOff.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/TaskExecutionBackOff.java index 8b76de3f..1ba6616c 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/TaskExecutionBackOff.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/backoff/TaskExecutionBackOff.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2024 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -47,8 +47,8 @@ public interface TaskExecutionBackOff { * @param throwable the exception that has occurred * @return backoff in the millisecond. */ - default long nextBackOff(Object message, RqueueMessage rqueueMessage, int failureCount, - Throwable throwable) { + default long nextBackOff( + Object message, RqueueMessage rqueueMessage, int failureCount, Throwable throwable) { return nextBackOff(message, rqueueMessage, failureCount); } } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/ReactiveDisabled.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/ReactiveDisabled.java index 244966f0..7d083d7c 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/ReactiveDisabled.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/ReactiveDisabled.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/ReactiveEnabled.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/ReactiveEnabled.java index 47dcdc2d..345669db 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/ReactiveEnabled.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/ReactiveEnabled.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/RqueueEnabled.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/RqueueEnabled.java index 2374a061..c64c9183 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/RqueueEnabled.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/condition/RqueueEnabled.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Sonu Kumar + * Copyright (c) 2022-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DateTimeFunction.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DateTimeFunction.java index a9cbd196..86fda201 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DateTimeFunction.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DateTimeFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DeadLetterQueuesFunction.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DeadLetterQueuesFunction.java index 732dc08c..55dd0a25 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DeadLetterQueuesFunction.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DeadLetterQueuesFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DefaultFunction.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DefaultFunction.java index 443cd7c7..3de0d86c 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DefaultFunction.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/DefaultFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/ResourceLoader.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/ResourceLoader.java index 00436ae7..d0fc8b27 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/ResourceLoader.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/ResourceLoader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/RqueuePebbleExtension.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/RqueuePebbleExtension.java index 23d48e1f..2401aa7d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/RqueuePebbleExtension.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/utils/pebble/RqueuePebbleExtension.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/BaseController.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/BaseController.java index 192f77ee..9ceeebef 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/BaseController.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/BaseController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/BaseReactiveController.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/BaseReactiveController.java index a0d9fff9..e60e9b40 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/BaseReactiveController.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/BaseReactiveController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/ReactiveRqueueRestController.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/ReactiveRqueueRestController.java index 7396653f..68f69110 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/ReactiveRqueueRestController.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/ReactiveRqueueRestController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/ReactiveRqueueViewController.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/ReactiveRqueueViewController.java index 561702c2..70c5d99a 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/ReactiveRqueueViewController.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/ReactiveRqueueViewController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/RqueueRestController.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/RqueueRestController.java index 1778df42..dc084251 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/RqueueRestController.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/RqueueRestController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/RqueueViewController.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/RqueueViewController.java index d25d6953..de4e43a3 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/RqueueViewController.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/controller/RqueueViewController.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueDashboardChartService.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueDashboardChartService.java index 0d7561cd..c1632cd7 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueDashboardChartService.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueDashboardChartService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueJobMetricsAggregatorService.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueJobMetricsAggregatorService.java index 644d8206..3d0a14f9 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueJobMetricsAggregatorService.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueJobMetricsAggregatorService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueJobService.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueJobService.java index 6b645a00..43990cc9 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueJobService.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueJobService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueMessageMetadataService.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueMessageMetadataService.java index 1dd29585..e4921f5a 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueMessageMetadataService.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueMessageMetadataService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2025 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueQDetailService.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueQDetailService.java index b9cfa915..39e11540 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueQDetailService.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueQDetailService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueSystemManagerService.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueSystemManagerService.java index a0523bef..dac69960 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueSystemManagerService.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueSystemManagerService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueUtilityService.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueUtilityService.java index bed99a84..f5bc62e3 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueUtilityService.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueUtilityService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueViewControllerService.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueViewControllerService.java index 44020371..3cae1594 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueViewControllerService.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/RqueueViewControllerService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueDashboardChartServiceImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueDashboardChartServiceImpl.java index 6af94829..678275bb 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueDashboardChartServiceImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueDashboardChartServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -262,10 +262,9 @@ private List createRow( private List> createChartData( String title, List chartDataTypeList, Map idToTasksStat) { - List> entries = - idToTasksStat.entrySet().stream() - .sorted((o1, o2) -> o2.getKey() - o1.getKey()) - .collect(Collectors.toList()); + List> entries = idToTasksStat.entrySet().stream() + .sorted((o1, o2) -> o2.getKey() - o1.getKey()) + .collect(Collectors.toList()); List> rows = new ArrayList<>(); rows.add(getHeader(title, chartDataTypeList)); for (Entry entry : entries) { @@ -278,13 +277,12 @@ private List> aggregateMonthly( int numberOfDays, List queueStatisticsList, List chartDataTypeList) { - Map monthToChartDataType = - aggregateData( - (date, today) -> - (int) Math.floor((today.toEpochDay() - LocalDate.parse(date).toEpochDay()) / 30.0f), - queueStatisticsList, - chartDataTypeList, - getCount(numberOfDays, Constants.DAYS_IN_A_MONTH)); + Map monthToChartDataType = aggregateData( + (date, today) -> + (int) Math.floor((today.toEpochDay() - LocalDate.parse(date).toEpochDay()) / 30.0f), + queueStatisticsList, + chartDataTypeList, + getCount(numberOfDays, Constants.DAYS_IN_A_MONTH)); return createChartData("Monthly", chartDataTypeList, monthToChartDataType); } @@ -292,12 +290,11 @@ private List> aggregateDaily( int numberOfDays, List queueStatisticsList, List chartDataTypes) { - Map dayToChartDataType = - aggregateData( - (date, today) -> (int) (today.toEpochDay() - LocalDate.parse(date).toEpochDay()), - queueStatisticsList, - chartDataTypes, - getCount(numberOfDays, 1)); + Map dayToChartDataType = aggregateData( + (date, today) -> (int) (today.toEpochDay() - LocalDate.parse(date).toEpochDay()), + queueStatisticsList, + chartDataTypes, + getCount(numberOfDays, 1)); return createChartData("Daily", chartDataTypes, dayToChartDataType); } @@ -312,13 +309,12 @@ private List> aggregateWeekly( int numberOfDays, List queueStatisticsList, List chartDataTypeList) { - Map weekToChartDataType = - aggregateData( - (date, today) -> - (int) Math.floor((today.toEpochDay() - LocalDate.parse(date).toEpochDay()) / 7.0f), - queueStatisticsList, - chartDataTypeList, - getCount(numberOfDays, Constants.DAYS_IN_A_WEEK)); + Map weekToChartDataType = aggregateData( + (date, today) -> + (int) Math.floor((today.toEpochDay() - LocalDate.parse(date).toEpochDay()) / 7.0f), + queueStatisticsList, + chartDataTypeList, + getCount(numberOfDays, Constants.DAYS_IN_A_WEEK)); return createChartData("Weekly", chartDataTypeList, weekToChartDataType); } @@ -345,12 +341,11 @@ private List> getChartData( private ChartDataResponse getQueueStats(ChartDataRequest chartDataRequest) { Collection ids = getQueueStatsId(chartDataRequest); - List> rows = - getChartData( - chartDataRequest.numberOfDays(rqueueWebConfig), - ids, - chartDataRequest.getAggregationType(), - chartDataRequest.getDateTypes()); + List> rows = getChartData( + chartDataRequest.numberOfDays(rqueueWebConfig), + ids, + chartDataRequest.getAggregationType(), + chartDataRequest.getDateTypes()); ChartDataResponse response = new ChartDataResponse(); response.setData(rows); response.setHTitle(chartDataRequest.getAggregationType().getDescription()); @@ -378,12 +373,11 @@ private Collection getQueueStatsId(ChartDataRequest chartDataRequest) { private ChartDataResponse getQueueLatency(ChartDataRequest chartDataRequest) { Collection ids = getQueueStatsId(chartDataRequest); - List> rows = - getChartData( - chartDataRequest.numberOfDays(rqueueWebConfig), - ids, - chartDataRequest.getAggregationType(), - Collections.singletonList(ChartDataType.EXECUTION)); + List> rows = getChartData( + chartDataRequest.numberOfDays(rqueueWebConfig), + ids, + chartDataRequest.getAggregationType(), + Collections.singletonList(ChartDataType.EXECUTION)); ChartDataResponse response = new ChartDataResponse(); response.setData(rows); response.setHTitle(chartDataRequest.getAggregationType().getDescription()); diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueJobServiceImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueJobServiceImpl.java index 7fc8b24f..a1827e2f 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueJobServiceImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueJobServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -53,12 +53,10 @@ public RqueueJobServiceImpl(RqueueJobDao rqueueJobDao) { private TableRow getTableRow(RqueueJob job) throws ProcessingException { List columns = new LinkedList<>(); columns.add(new TableColumn(job.getId())); - columns.add( - new TableColumn( - String.format( - "%s/%s", - DateTimeUtils.formatMilliToString(job.getCreatedAt()), - DateTimeUtils.formatMilliToString(job.getUpdatedAt())))); + columns.add(new TableColumn(String.format( + "%s/%s", + DateTimeUtils.formatMilliToString(job.getCreatedAt()), + DateTimeUtils.formatMilliToString(job.getUpdatedAt())))); if (job.getLastCheckinAt() == 0) { columns.add(new TableColumn("")); } else { @@ -94,17 +92,16 @@ public DataViewResponse getJobs(String messageId) throws ProcessingException { response.setCode(0); response.setMessage("No jobs found"); } else { - jobList.sort( - (o1, o2) -> { - long diff = o1.getUpdatedAt() - o2.getUpdatedAt(); - if (diff == 0) { - return 0; - } - if (diff > 0) { - return 1; - } - return -1; - }); + jobList.sort((o1, o2) -> { + long diff = o1.getUpdatedAt() - o2.getUpdatedAt(); + if (diff == 0) { + return 0; + } + if (diff > 0) { + return 1; + } + return -1; + }); response.setHeaders( Arrays.asList("Id", "StartTime/EndTime", "Last Checkin", "Error", "Status", "CheckIns")); for (RqueueJob job : jobList) { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueMessageMetadataServiceImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueMessageMetadataServiceImpl.java index a84d437d..c86243c6 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueMessageMetadataServiceImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueMessageMetadataServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -145,20 +145,17 @@ public List> readMessageMetadataForQueue( metaIds.stream().collect(Collectors.toMap(TypedTuple::getValue, TypedTuple::getScore)); List messageMetadata = findAll(metaIdToScoreMap.keySet()); return messageMetadata.stream() - .map( - metadata -> { - Double score = metaIdToScoreMap.get(metadata.getId()); - if (score == null) { - return null; - } else { - return new DefaultTypedTuple<>(metadata, score); - } - }) + .map(metadata -> { + Double score = metaIdToScoreMap.get(metadata.getId()); + if (score == null) { + return null; + } else { + return new DefaultTypedTuple<>(metadata, score); + } + }) .filter(Objects::nonNull) - .sorted( - Comparator.comparingLong( - (DefaultTypedTuple e1) -> - -(Objects.requireNonNull(e1.getValue()).getUpdatedOn()))) + .sorted(Comparator.comparingLong((DefaultTypedTuple e1) -> + -(Objects.requireNonNull(e1.getValue()).getUpdatedOn()))) .collect(Collectors.toList()); } diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueQDetailServiceImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueQDetailServiceImpl.java index 38a3af56..2f925a01 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueQDetailServiceImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueQDetailServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -101,50 +101,43 @@ public List> getQueueDataStructureDetail(QueueCon Long pending = stringRqueueRedisTemplate.getListSize(queueConfig.getQueueName()); String processingQueueName = queueConfig.getProcessingQueueName(); Long running = stringRqueueRedisTemplate.getZsetSize(processingQueueName); - List> queueRedisDataDetails = - newArrayList( - new HashMap.SimpleEntry<>( - NavTab.PENDING, - new RedisDataDetail( - queueConfig.getQueueName(), DataType.LIST, pending == null ? 0 : pending)), - new HashMap.SimpleEntry<>( - NavTab.RUNNING, - new RedisDataDetail( - processingQueueName, DataType.ZSET, running == null ? 0 : running))); - String scheduledQueueName = queueConfig.getScheduledQueueName(); - Long scheduled = stringRqueueRedisTemplate.getZsetSize(scheduledQueueName); - queueRedisDataDetails.add( + List> queueRedisDataDetails = newArrayList( + new HashMap.SimpleEntry<>( + NavTab.PENDING, + new RedisDataDetail( + queueConfig.getQueueName(), DataType.LIST, pending == null ? 0 : pending)), new HashMap.SimpleEntry<>( - NavTab.SCHEDULED, + NavTab.RUNNING, new RedisDataDetail( - scheduledQueueName, DataType.ZSET, scheduled == null ? 0 : scheduled))); + processingQueueName, DataType.ZSET, running == null ? 0 : running))); + String scheduledQueueName = queueConfig.getScheduledQueueName(); + Long scheduled = stringRqueueRedisTemplate.getZsetSize(scheduledQueueName); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.SCHEDULED, + new RedisDataDetail(scheduledQueueName, DataType.ZSET, scheduled == null ? 0 : scheduled))); if (!CollectionUtils.isEmpty(queueConfig.getDeadLetterQueues())) { for (DeadLetterQueue dlq : queueConfig.getDeadLetterQueues()) { if (!dlq.isConsumerEnabled()) { Long dlqSize = stringRqueueRedisTemplate.getListSize(dlq.getName()); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.DEAD, - new RedisDataDetail( - dlq.getName(), DataType.LIST, dlqSize == null ? 0 : dlqSize))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.DEAD, + new RedisDataDetail(dlq.getName(), DataType.LIST, dlqSize == null ? 0 : dlqSize))); } else { // TODO should we redirect to the queue page? - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.DEAD, new RedisDataDetail(dlq.getName(), DataType.LIST, -1))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.DEAD, new RedisDataDetail(dlq.getName(), DataType.LIST, -1))); } } } if (rqueueConfig.messageInTerminalStateShouldBeStored() && !StringUtils.isEmpty(queueConfig.getCompletedQueueName())) { Long completed = stringRqueueRedisTemplate.getZsetSize(queueConfig.getCompletedQueueName()); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.COMPLETED, - new RedisDataDetail( - queueConfig.getCompletedQueueName(), - DataType.ZSET, - completed == null ? 0 : completed))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.COMPLETED, + new RedisDataDetail( + queueConfig.getCompletedQueueName(), + DataType.ZSET, + completed == null ? 0 : completed))); } return queueRedisDataDetails; } @@ -210,12 +203,8 @@ private List buildRows( msgIdToDeleted.put(id, messageMetadata.isDeleted()); } return rqueueMessages.stream() - .map( - e -> - rowBuilder.row( - e.getValue(), - msgIdToDeleted.getOrDefault(e.getValue().getId(), false), - e.getScore())) + .map(e -> rowBuilder.row( + e.getValue(), msgIdToDeleted.getOrDefault(e.getValue().getId(), false), e.getScore())) .collect(Collectors.toList()); } @@ -256,25 +245,21 @@ public DataViewResponse getExplorePageData( switch (type) { case ZSET: if (scheduledQueue) { - response.setRows( - buildRows( - readFromZset(name, pageNumber, itemPerPage), new ZsetRowBuilder(true, false))); + response.setRows(buildRows( + readFromZset(name, pageNumber, itemPerPage), new ZsetRowBuilder(true, false))); } else if (completionQueue) { - response.setRows( - buildRows( - readFromMessageMetadataStore(name, pageNumber, itemPerPage), - new ZsetRowBuilder(false, true))); + response.setRows(buildRows( + readFromMessageMetadataStore(name, pageNumber, itemPerPage), + new ZsetRowBuilder(false, true))); } else { - response.setRows( - buildRows( - readFromZetWithScore(name, pageNumber, itemPerPage), - new ZsetRowBuilder(false, false))); + response.setRows(buildRows( + readFromZetWithScore(name, pageNumber, itemPerPage), + new ZsetRowBuilder(false, false))); } break; case LIST: - response.setRows( - buildRows( - readFromList(name, pageNumber, itemPerPage), new ListRowBuilder(deadLetterQueue))); + response.setRows(buildRows( + readFromList(name, pageNumber, itemPerPage), new ListRowBuilder(deadLetterQueue))); break; default: throw new UnknownSwitchCase(type.name()); @@ -292,11 +277,9 @@ private List> readFromMessageMetadataStore( return Collections.emptyList(); } return mes.stream() - .map( - e -> - new DefaultTypedTuple<>( - Objects.requireNonNull(e.getValue()).getRqueueMessage(), - (double) e.getValue().getUpdatedOn())) + .map(e -> new DefaultTypedTuple<>( + Objects.requireNonNull(e.getValue()).getRqueueMessage(), + (double) e.getValue().getUpdatedOn())) .collect(Collectors.toList()); } @@ -333,11 +316,8 @@ private DataViewResponse responseForZset( } else { response.setHeaders(Arrays.asList("Value", "Score")); for (TypedTuple tuple : stringRqueueRedisTemplate.zrangeWithScore(name, start, end)) { - tableRows.add( - new TableRow( - Arrays.asList( - new TableColumn(String.valueOf(tuple.getValue())), - new TableColumn(tuple.getScore())))); + tableRows.add(new TableRow(Arrays.asList( + new TableColumn(String.valueOf(tuple.getValue())), new TableColumn(tuple.getScore())))); } } response.setRows(tableRows); @@ -409,21 +389,19 @@ public List> getRunningTasks() { List> rows = new ArrayList<>(); List result = new ArrayList<>(); if (!CollectionUtils.isEmpty(queueConfigs)) { - result = - RedisUtils.executePipeLine( - stringRqueueRedisTemplate.getRedisTemplate(), - ((connection, keySerializer, valueSerializer) -> { - for (QueueConfig queueConfig : queueConfigs) { - connection.zCard(keySerializer.serialize(queueConfig.getProcessingQueueName())); - } - })); + result = RedisUtils.executePipeLine( + stringRqueueRedisTemplate.getRedisTemplate(), + ((connection, keySerializer, valueSerializer) -> { + for (QueueConfig queueConfig : queueConfigs) { + connection.zCard(keySerializer.serialize(queueConfig.getProcessingQueueName())); + } + })); } rows.add(Arrays.asList("Queue", "Processing [ZSET]", "Number of Messages")); for (int i = 0; i < queueConfigs.size(); i++) { QueueConfig queueConfig = queueConfigs.get(i); - rows.add( - Arrays.asList( - queueConfig.getName(), queueConfig.getProcessingQueueName(), result.get(i))); + rows.add(Arrays.asList( + queueConfig.getName(), queueConfig.getProcessingQueueName(), result.get(i))); } return rows; } @@ -434,14 +412,13 @@ public List> getWaitingTasks() { List> rows = new ArrayList<>(); List result = new ArrayList<>(); if (!CollectionUtils.isEmpty(queueConfigs)) { - result = - RedisUtils.executePipeLine( - stringRqueueRedisTemplate.getRedisTemplate(), - ((connection, keySerializer, valueSerializer) -> { - for (QueueConfig queueConfig : queueConfigs) { - connection.lLen(keySerializer.serialize(queueConfig.getQueueName())); - } - })); + result = RedisUtils.executePipeLine( + stringRqueueRedisTemplate.getRedisTemplate(), + ((connection, keySerializer, valueSerializer) -> { + for (QueueConfig queueConfig : queueConfigs) { + connection.lLen(keySerializer.serialize(queueConfig.getQueueName())); + } + })); } rows.add(Arrays.asList("Queue", "Queue [LIST]", "Number of Messages")); for (int i = 0; i < queueConfigs.size(); i++) { @@ -457,14 +434,13 @@ public List> getScheduledTasks() { List> rows = new ArrayList<>(); List result = new ArrayList<>(); if (!CollectionUtils.isEmpty(queueConfigs)) { - result = - RedisUtils.executePipeLine( - stringRqueueRedisTemplate.getRedisTemplate(), - ((connection, keySerializer, valueSerializer) -> { - for (QueueConfig queueConfig : queueConfigs) { - connection.zCard(keySerializer.serialize(queueConfig.getScheduledQueueName())); - } - })); + result = RedisUtils.executePipeLine( + stringRqueueRedisTemplate.getRedisTemplate(), + ((connection, keySerializer, valueSerializer) -> { + for (QueueConfig queueConfig : queueConfigs) { + connection.zCard(keySerializer.serialize(queueConfig.getScheduledQueueName())); + } + })); } rows.add(Arrays.asList("Queue", "Scheduled [ZSET]", "Number of Messages")); for (int i = 0; i < queueConfigs.size(); i++) { @@ -488,8 +464,8 @@ private void addRows( String name = Constants.BLANK; if (i == 0 || !queueConfig - .getQueueName() - .equals(queueConfigAndDlq.get(i - 1).getKey().getQueueName())) { + .getQueueName() + .equals(queueConfigAndDlq.get(i - 1).getKey().getQueueName())) { name = queueConfig.getName(); } rows.add(Arrays.asList(name, entry.getValue(), result.get(j++))); @@ -513,16 +489,15 @@ public List> getDeadLetterTasks() { List> rows = new ArrayList<>(); List result = new ArrayList<>(); if (!CollectionUtils.isEmpty(queueConfigAndDlq)) { - result = - RedisUtils.executePipeLine( - stringRqueueRedisTemplate.getRedisTemplate(), - ((connection, keySerializer, valueSerializer) -> { - for (Entry entry : queueConfigAndDlq) { - if (!entry.getValue().isEmpty()) { - connection.lLen(keySerializer.serialize(entry.getValue())); - } - } - })); + result = RedisUtils.executePipeLine( + stringRqueueRedisTemplate.getRedisTemplate(), + ((connection, keySerializer, valueSerializer) -> { + for (Entry entry : queueConfigAndDlq) { + if (!entry.getValue().isEmpty()) { + connection.lLen(keySerializer.serialize(entry.getValue())); + } + } + })); } rows.add(Arrays.asList("Queue", "Dead Letter Queues [LIST]", "Number of Messages")); addRows(result, rows, queueConfigAndDlq); @@ -546,9 +521,8 @@ private interface RowBuilder { default TableRow getRow(RqueueMessage rqueueMessage) { TableRow row = new TableRow(new TableColumn(rqueueMessage.getId())); TableColumn column = new TableColumn(rqueueMessage.toString()); - column.setMeta( - Collections.singletonList( - new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, rqueueMessage.getId()))); + column.setMeta(Collections.singletonList( + new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, rqueueMessage.getId()))); row.addColumn(column); if (rqueueMessage.isPeriodic()) { row.addColumn(new TableColumn("Periodic(" + rqueueMessage.getPeriod() + ")Ms")); @@ -602,19 +576,14 @@ private static class ZsetRowBuilder implements RowBuilder { public TableRow row(RqueueMessage rqueueMessage, boolean deleted, Double score) { TableRow row = getRow(rqueueMessage); if (scheduledQueue) { - row.addColumn( - new TableColumn( - DateTimeUtils.milliToHumanRepresentation( - rqueueMessage.getProcessAt() - currentTime))); + row.addColumn(new TableColumn( + DateTimeUtils.milliToHumanRepresentation(rqueueMessage.getProcessAt() - currentTime))); } else if (completionQueue) { - row.addColumn( - new TableColumn( - DateTimeUtils.milliToHumanRepresentation( - System.currentTimeMillis() - score.longValue()))); + row.addColumn(new TableColumn(DateTimeUtils.milliToHumanRepresentation( + System.currentTimeMillis() - score.longValue()))); } else { - row.addColumn( - new TableColumn( - DateTimeUtils.milliToHumanRepresentation(score.longValue() - currentTime))); + row.addColumn(new TableColumn( + DateTimeUtils.milliToHumanRepresentation(score.longValue() - currentTime))); } if (!completionQueue) { if (!deleted) { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueSystemManagerServiceImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueSystemManagerServiceImpl.java index 2ba706fe..3adabd4d 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueSystemManagerServiceImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueSystemManagerServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -70,11 +70,10 @@ public RqueueSystemManagerServiceImpl( } private List queueKeys(QueueConfig queueConfig) { - List keys = - newArrayList( - queueConfig.getQueueName(), - queueConfig.getProcessingQueueName(), - rqueueConfig.getQueueStatisticsKey(queueConfig.getName())); + List keys = newArrayList( + queueConfig.getQueueName(), + queueConfig.getProcessingQueueName(), + rqueueConfig.getQueueStatisticsKey(queueConfig.getName())); keys.add(queueConfig.getScheduledQueueName()); if (queueConfig.hasDeadLetterQueue()) { for (DeadLetterQueue queue : queueConfig.getDeadLetterQueues()) { diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueUtilityServiceImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueUtilityServiceImpl.java index bdfa1055..6ddf69a4 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueUtilityServiceImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueUtilityServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -95,9 +95,8 @@ public BooleanResponse deleteMessage(String queueName, String id) { booleanResponse.setMessage("Queue config not found!"); return booleanResponse; } - booleanResponse.setValue( - messageMetadataService.deleteMessage( - queueName, id, Duration.ofDays(Constants.DAYS_IN_A_MONTH))); + booleanResponse.setValue(messageMetadataService.deleteMessage( + queueName, id, Duration.ofDays(Constants.DAYS_IN_A_MONTH))); return booleanResponse; } @@ -117,9 +116,8 @@ private MessageMoveResponse moveMessageToZset(MessageMoveRequest messageMoveRequ } MessageMoveResult result; if (messageMoveRequest.getSrcType() == DataType.ZSET) { - result = - rqueueMessageTemplate.moveMessageZsetToZset( - src, dst, requestMessageCount, scoreInMilli, fixedScore); + result = rqueueMessageTemplate.moveMessageZsetToZset( + src, dst, requestMessageCount, scoreInMilli, fixedScore); } else { result = rqueueMessageTemplate.moveMessageListToZset(src, dst, requestMessageCount, scoreInMilli); @@ -173,12 +171,11 @@ public BooleanResponse makeEmpty(String queueName, String dataName) { } return new BooleanResponse( MessageSweeper.getInstance(rqueueConfig, rqueueMessageTemplate, messageMetadataService) - .deleteAllMessages( - MessageDeleteRequest.builder() - .dataName(dataName) - .queueName(queueName) - .dataType(type) - .build())); + .deleteAllMessages(MessageDeleteRequest.builder() + .dataName(dataName) + .queueName(queueName) + .dataType(type) + .build())); } private boolean shouldFetchVersionDetail() { @@ -258,7 +255,7 @@ public BaseResponse pauseUnpauseQueue(PauseUnpauseQueueRequest request) { private List> getDailyDateCounter() { List> dateSelector = new LinkedList<>(); - int[] dates = new int[]{1, 2, 3, 4, 6, 7}; + int[] dates = new int[] {1, 2, 3, 4, 6, 7}; int step = 15; int stepAfter = 15; int i = 1; diff --git a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueViewControllerServiceImpl.java b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueViewControllerServiceImpl.java index 82b49b89..50bf146a 100644 --- a/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueViewControllerServiceImpl.java +++ b/rqueue-core/src/main/java/com/github/sonus21/rqueue/web/service/impl/RqueueViewControllerServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -95,8 +95,8 @@ public void queues(Model model, String xForwardedPrefix) { addNavData(model, NavTab.QUEUES); model.addAttribute("title", "Queues"); List queueConfigs = rqueueSystemManagerService.getSortedQueueConfigs(); - List>>> queueNameConfigs = - new ArrayList<>(rqueueQDetailService.getQueueDataStructureDetails(queueConfigs).entrySet()); + List>>> queueNameConfigs = new ArrayList<>( + rqueueQDetailService.getQueueDataStructureDetails(queueConfigs).entrySet()); queueNameConfigs.sort(Entry.comparingByKey()); model.addAttribute("queues", queueConfigs); model.addAttribute("queueConfigs", queueNameConfigs); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/CoreUnitTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/CoreUnitTest.java index b6df1f23..62d7f161 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/CoreUnitTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/CoreUnitTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -25,13 +25,9 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; - @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Tag("unit") @Tag("core") @ExtendWith({MockitoExtension.class, TestTracerExtension.class}) -public @interface CoreUnitTest { - - -} +public @interface CoreUnitTest {} diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/common/RqueueLockManagerImplTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/common/RqueueLockManagerImplTest.java index 08008747..cc55f12c 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/common/RqueueLockManagerImplTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/common/RqueueLockManagerImplTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -35,8 +35,10 @@ class RqueueLockManagerImplTest extends TestBase { private final String lockKey = "test-key"; private final String lockValue = "test-value"; + @Mock private RqueueStringDao rqueueStringDao; + private RqueueLockManager rqueueLockManager; @BeforeEach diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/RqueueConfigTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/RqueueConfigTest.java index 231711f7..5c797a43 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/RqueueConfigTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/RqueueConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/RqueueListenerBaseConfigTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/RqueueListenerBaseConfigTest.java index 4376999e..f4a99042 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/RqueueListenerBaseConfigTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/RqueueListenerBaseConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -42,12 +42,16 @@ class RqueueListenerBaseConfigTest extends TestBase { private final String versionKey = "__rq::version"; + @Mock private RedisConnection redisConnection; + @Mock private ConfigurableBeanFactory beanFactory; + @Mock private RedisConnectionFactory redisConnectionFactory; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; @@ -102,7 +106,9 @@ void rqueueConfigSetConnectionFactoryFromBeanFactoryExistingData() throws Illega void rqueueConfigSetConnectionFactoryFromBeanFactoryWithDifferentValue() throws IllegalAccessException { doReturn(redisConnection).when(redisConnectionFactory).getConnection(); - doReturn(String.valueOf(1).getBytes(StandardCharsets.UTF_8)).when(redisConnection).get(any()); + doReturn(String.valueOf(1).getBytes(StandardCharsets.UTF_8)) + .when(redisConnection) + .get(any()); SimpleRqueueListenerContainerFactory factory = new SimpleRqueueListenerContainerFactory(); RqueueListenerConfig rqueueSystemConfig = createConfig(factory); doReturn(redisConnectionFactory).when(beanFactory).getBean(RedisConnectionFactory.class); @@ -117,7 +123,9 @@ void rqueueConfigSetConnectionFactoryFromBeanFactoryWithDifferentValue() void rqueueConfigSetConnectionFactoryFromBeanFactoryWithLatestVersion() throws IllegalAccessException { doReturn(redisConnection).when(redisConnectionFactory).getConnection(); - doReturn(String.valueOf(2).getBytes(StandardCharsets.UTF_8)).when(redisConnection).get(any()); + doReturn(String.valueOf(2).getBytes(StandardCharsets.UTF_8)) + .when(redisConnection) + .get(any()); SimpleRqueueListenerContainerFactory factory = new SimpleRqueueListenerContainerFactory(); RqueueListenerConfig rqueueSystemConfig = createConfig(factory); doReturn(redisConnectionFactory).when(beanFactory).getBean(RedisConnectionFactory.class); @@ -154,7 +162,9 @@ void rqueueConfigInvalidDbVersion() throws IllegalAccessException { @Test void rqueueConfigDoesNotChangeConnectionFactory() throws IllegalAccessException { doReturn(redisConnection).when(redisConnectionFactory).getConnection(); - doReturn(String.valueOf(2).getBytes(StandardCharsets.UTF_8)).when(redisConnection).get(any()); + doReturn(String.valueOf(2).getBytes(StandardCharsets.UTF_8)) + .when(redisConnection) + .get(any()); SimpleRqueueListenerContainerFactory factory = new SimpleRqueueListenerContainerFactory(); factory.setRedisConnectionFactory(redisConnectionFactory); RqueueListenerConfig rqueueSystemConfig = createConfig(factory); @@ -183,7 +193,5 @@ void getMessageTemplateSetTemplateInFactory() throws IllegalAccessException { assertEquals(template, factory.getRqueueMessageTemplate()); } - private class RqueueListenerConfig extends RqueueListenerBaseConfig { - - } + private class RqueueListenerConfig extends RqueueListenerBaseConfig {} } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/SimpleRqueueListenerContainerFactoryTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/SimpleRqueueListenerContainerFactoryTest.java index faee461c..43f94469 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/SimpleRqueueListenerContainerFactoryTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/config/SimpleRqueueListenerContainerFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -84,9 +84,8 @@ void setRqueueMessageHandler() { @Test void getRqueueMessageHandler() { - assertNotNull( - simpleRqueueListenerContainerFactory.getRqueueMessageHandler( - new DefaultMessageConverterProvider())); + assertNotNull(simpleRqueueListenerContainerFactory.getRqueueMessageHandler( + new DefaultMessageConverterProvider())); } @Test diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/converter/GenericMessageConverterTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/converter/GenericMessageConverterTest.java index 8220adef..0b096b49 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/converter/GenericMessageConverterTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/converter/GenericMessageConverterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -88,16 +88,14 @@ void toMessage() { @Test void toMessageSet() { - assertNull( - genericMessageConverter.toMessage( - Collections.singleton("Foo"), RqueueMessageHeaders.emptyMessageHeaders())); + assertNull(genericMessageConverter.toMessage( + Collections.singleton("Foo"), RqueueMessageHeaders.emptyMessageHeaders())); } @Test void toMessageEmptyList() { - assertNull( - genericMessageConverter.toMessage( - Collections.emptyList(), RqueueMessageHeaders.emptyMessageHeaders())); + assertNull(genericMessageConverter.toMessage( + Collections.emptyList(), RqueueMessageHeaders.emptyMessageHeaders())); } @Test @@ -227,8 +225,7 @@ void multiLevelGenericTestDataFixedTypeToFromMessage() { @Test @Disabled void foo() { - MappingRegistrar m = new MappingRegistrar>() { - }; + MappingRegistrar m = new MappingRegistrar>() {}; m.seeIt(); MultiGenericTestDataSameType m2 = new MultiGenericTestDataSameType<>(); m2.seeIt(); @@ -328,10 +325,9 @@ private void innerSeeIt(Type type) { if (type instanceof TypeVariable) { Type[] bounds = ((TypeVariable) type).getBounds(); - String s = - Arrays.stream(bounds) - .map(Type::getTypeName) - .collect(Collectors.joining(", ", "[", "]")); + String s = Arrays.stream(bounds) + .map(Type::getTypeName) + .collect(Collectors.joining(", ", "[", "]")); System.out.print(s); } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/converter/JsonMessageConverterTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/converter/JsonMessageConverterTest.java index 9a25308c..71170906 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/converter/JsonMessageConverterTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/converter/JsonMessageConverterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,12 +31,16 @@ import org.junit.jupiter.api.Test; import org.springframework.messaging.Message; import org.springframework.messaging.converter.MessageConverter; +import tools.jackson.databind.DeserializationFeature; import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @CoreUnitTest class JsonMessageConverterTest extends TestBase { - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builder() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .build(); private final MessageConverter messageConverter = new JsonMessageConverter(); private final MessageConverter messageConverter2 = new JsonMessageConverter(objectMapper); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulerDisabledTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulerDisabledTest.java index 6f29bb08..822808bb 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulerDisabledTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulerDisabledTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -48,10 +48,13 @@ class MessageSchedulerDisabledTest extends TestBase { private final String slowQueue = "slow-queue"; private final QueueDetail slowQueueDetail = TestUtils.createQueueDetail(slowQueue); + @Mock private RqueueSchedulerConfig rqueueSchedulerConfig; + @Mock private RqueueConfig rqueueConfig; + @Mock private RedisTemplate redisTemplate; diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulerTest.java index bafefd9a..8f948a8f 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -47,14 +47,19 @@ class MessageSchedulerTest extends TestBase { private final QueueDetail slowQueueDetail = TestUtils.createQueueDetail(slowQueue); private final QueueDetail fastQueueDetail = TestUtils.createQueueDetail(fastQueue); private final Map queueNameToQueueDetail = new HashMap<>(); + @Mock private RqueueSchedulerConfig rqueueSchedulerConfig; + @Mock private RqueueConfig rqueueConfig; + @Mock private RedisMessageListenerContainer rqueueRedisMessageListenerContainer; + @Mock private RedisTemplate redisTemplate; + @InjectMocks private TestScheduledQueueMessageScheduler messageScheduler; diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulingTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulingTest.java index e5bf012c..9601049b 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulingTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/MessageSchedulingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Sonu Kumar + * Copyright (c) 2022-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -14,13 +14,11 @@ * */ - package com.github.sonus21.rqueue.core; import static com.github.sonus21.rqueue.utils.TimeoutUtils.sleep; import static com.github.sonus21.rqueue.utils.TimeoutUtils.waitFor; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; @@ -32,12 +30,9 @@ import com.github.sonus21.rqueue.core.ProcessingQueueMessageSchedulerTest.ProcessingQTestMessageScheduler; import com.github.sonus21.rqueue.listener.QueueDetail; import com.github.sonus21.rqueue.models.event.RqueueBootstrapEvent; -import com.github.sonus21.rqueue.utils.Constants; import com.github.sonus21.rqueue.utils.TestUtils; import com.github.sonus21.rqueue.utils.ThreadUtils; -import com.github.sonus21.rqueue.utils.TimeoutUtils; import com.github.sonus21.test.TestTaskScheduler; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -50,8 +45,6 @@ import org.springframework.data.redis.RedisConnectionFailureException; import org.springframework.data.redis.RedisSystemException; import org.springframework.data.redis.TooManyClusterRedirectionsException; -import org.springframework.data.redis.connection.DefaultMessage; -import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; @@ -60,15 +53,21 @@ class MessageSchedulingTest extends TestBase { @InjectMocks - private final ProcessingQTestMessageScheduler messageScheduler = new ProcessingQTestMessageScheduler(); + private final ProcessingQTestMessageScheduler messageScheduler = + new ProcessingQTestMessageScheduler(); + private final String queue = "queue"; private final QueueDetail queueDetail = TestUtils.createQueueDetail(queue); + @Mock private RqueueSchedulerConfig rqueueSchedulerConfig; + @Mock private RqueueConfig rqueueConfig; + @Mock private RedisTemplate redisTemplate; + @Mock private RqueueRedisListenerContainerFactory rqueueRedisListenerContainerFactory; @@ -84,17 +83,19 @@ public void init() { doReturn(true).when(rqueueSchedulerConfig).isRedisEnabled(); } - @Test void multipleTasksAreRunningForTheSameQueue() throws Exception { try (MockedStatic threadUtils = Mockito.mockStatic(ThreadUtils.class)) { AtomicInteger counter = new AtomicInteger(0); doAnswer(invocation -> { - counter.incrementAndGet(); - return System.currentTimeMillis(); - }).when(redisTemplate).execute(any(RedisCallback.class)); + counter.incrementAndGet(); + return System.currentTimeMillis(); + }) + .when(redisTemplate) + .execute(any(RedisCallback.class)); TestTaskScheduler scheduler = new TestTaskScheduler(); - threadUtils.when(() -> ThreadUtils.createTaskScheduler(1, "processingQueueMsgScheduler-", 60)) + threadUtils + .when(() -> ThreadUtils.createTaskScheduler(1, "processingQueueMsgScheduler-", 60)) .thenReturn(scheduler); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); waitFor(() -> counter.get() >= 2, "scripts are getting executed"); @@ -111,12 +112,15 @@ void taskShouldBeScheduledOnFailure() throws Exception { doReturn(100L).when(rqueueSchedulerConfig).minMessageMoveDelay(); AtomicInteger counter = new AtomicInteger(0); doAnswer(invocation -> { - counter.incrementAndGet(); - throw new RedisSystemException("Something is not correct", - new NullPointerException("oops!")); - }).when(redisTemplate).execute(any(RedisCallback.class)); + counter.incrementAndGet(); + throw new RedisSystemException( + "Something is not correct", new NullPointerException("oops!")); + }) + .when(redisTemplate) + .execute(any(RedisCallback.class)); TestTaskScheduler scheduler = new TestTaskScheduler(); - threadUtils.when(() -> ThreadUtils.createTaskScheduler(1, "processingQueueMsgScheduler-", 60)) + threadUtils + .when(() -> ThreadUtils.createTaskScheduler(1, "processingQueueMsgScheduler-", 60)) .thenReturn(scheduler); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); waitFor(() -> counter.get() >= 3, "scripts are getting executed"); @@ -132,17 +136,19 @@ void continuousTaskFailure() throws Exception { doReturn(500L).when(rqueueSchedulerConfig).getMaxMessageMoverDelay(); doReturn(100L).when(rqueueSchedulerConfig).minMessageMoveDelay(); AtomicInteger counter = new AtomicInteger(0); - doAnswer( - invocation -> { + doAnswer(invocation -> { int count = counter.incrementAndGet(); if (count % 3 == 0) { - throw new RedisSystemException("Something is not correct", - new NullPointerException("oops!")); + throw new RedisSystemException( + "Something is not correct", new NullPointerException("oops!")); } if (count % 3 == 1) { throw new RedisConnectionFailureException("Unknown host"); } - throw new ClusterRedirectException(3, "localhost", 9004, + throw new ClusterRedirectException( + 3, + "localhost", + 9004, new TooManyClusterRedirectionsException("too many redirects")); }) .when(redisTemplate) @@ -158,5 +164,4 @@ void continuousTaskFailure() throws Exception { assertEquals(1, scheduler.submittedTasks()); } } - } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/ProcessingQueueMessageSchedulerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/ProcessingQueueMessageSchedulerTest.java index da1d9035..24270eb7 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/ProcessingQueueMessageSchedulerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/ProcessingQueueMessageSchedulerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -43,12 +43,16 @@ class ProcessingQueueMessageSchedulerTest extends TestBase { private final String fastQueue = "fast-queue"; private final QueueDetail slowQueueDetail = TestUtils.createQueueDetail(slowQueue); private final QueueDetail fastQueueDetail = TestUtils.createQueueDetail(fastQueue); + @Mock private RedisTemplate redisTemplate; + @Mock private RqueueSchedulerConfig rqueueSchedulerConfig; + @Mock private RedisMessageListenerContainer redisMessageListenerContainer; + @InjectMocks private ProcessingQueueMessageScheduler messageScheduler; @@ -64,7 +68,8 @@ public void init() { @Test void getChannelName() { - assertEquals(slowQueueDetail.getProcessingQueueChannelName(), + assertEquals( + slowQueueDetail.getProcessingQueueChannelName(), messageScheduler.getChannelName(slowQueue)); } @@ -76,22 +81,25 @@ void getZsetName() { @Test void getNextScheduleTimeSlowQueue() { long currentTime = System.currentTimeMillis(); - assertThat(messageScheduler.getNextScheduleTime(slowQueue, currentTime, null), + assertThat( + messageScheduler.getNextScheduleTime(slowQueue, currentTime, null), greaterThanOrEqualTo(currentTime + 100000)); - assertEquals(currentTime + 1000L, + assertEquals( + currentTime + 1000L, messageScheduler.getNextScheduleTime(slowQueue, currentTime, currentTime + 1000L)); } @Test void getNextScheduleTimeFastQueue() { long currentTime = System.currentTimeMillis(); - assertThat(messageScheduler.getNextScheduleTime(fastQueue, currentTime, null), + assertThat( + messageScheduler.getNextScheduleTime(fastQueue, currentTime, null), greaterThanOrEqualTo(currentTime + 200000)); - assertEquals(currentTime + 1000L, + assertEquals( + currentTime + 1000L, messageScheduler.getNextScheduleTime(fastQueue, currentTime, currentTime + 1000L)); } - static class ProcessingQTestMessageScheduler extends ProcessingQueueMessageScheduler { private final AtomicInteger schedulesCalls; diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisAndNormalSchedulingTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisAndNormalSchedulingTest.java index 684e9ed9..f55970fb 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisAndNormalSchedulingTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisAndNormalSchedulingTest.java @@ -1,5 +1,12 @@ package com.github.sonus21.rqueue.core; +import static com.github.sonus21.rqueue.utils.TimeoutUtils.sleep; +import static com.github.sonus21.rqueue.utils.TimeoutUtils.waitFor; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; + import com.github.sonus21.TestBase; import com.github.sonus21.rqueue.CoreUnitTest; import com.github.sonus21.rqueue.config.RqueueConfig; @@ -12,6 +19,8 @@ import com.github.sonus21.rqueue.utils.ThreadUtils; import com.github.sonus21.rqueue.utils.TimeoutUtils; import com.github.sonus21.test.TestTaskScheduler; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -23,15 +32,6 @@ import org.springframework.data.redis.connection.DefaultMessage; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; - -import static com.github.sonus21.rqueue.utils.TimeoutUtils.sleep; -import static com.github.sonus21.rqueue.utils.TimeoutUtils.waitFor; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; @CoreUnitTest @Slf4j @@ -41,14 +41,19 @@ class RedisAndNormalSchedulingTest extends TestBase { private final String fastQueue = "fast-queue"; private final QueueDetail slowQueueDetail = TestUtils.createQueueDetail(slowQueue); private final QueueDetail fastQueueDetail = TestUtils.createQueueDetail(fastQueue); + @Mock private RqueueSchedulerConfig rqueueSchedulerConfig; + @Mock private RqueueConfig rqueueConfig; + @Mock private RedisTemplate redisTemplate; + @Mock private RqueueRedisListenerContainerFactory rqueueRedisListenerContainerFactory; + @InjectMocks private TestScheduledQueueMessageScheduler messageScheduler; @@ -67,7 +72,7 @@ void redisAndNormalScheduling() throws Exception { AtomicBoolean generateMessage = new AtomicBoolean(true); long totalTime = 2000L; long minDelay = 10L; - //25% buffer due to short polling intervals, IN CI it runs slowly + // 25% buffer due to short polling intervals, IN CI it runs slowly double buffer = 0.25; String channelName = messageScheduler.getChannelName(slowQueue); doReturn(1).when(rqueueSchedulerConfig).getScheduledMessageThreadPoolSize(); @@ -95,13 +100,16 @@ void redisAndNormalScheduling() throws Exception { scheduler.submit(messageGenerator); AtomicInteger counter = new AtomicInteger(0); doAnswer(invocation -> { - counter.incrementAndGet(); - sleep(5); - return System.currentTimeMillis() - Constants.DEFAULT_SCRIPT_EXECUTION_TIME; - }).when(redisTemplate).execute(any(RedisCallback.class)); + counter.incrementAndGet(); + sleep(5); + return System.currentTimeMillis() - Constants.DEFAULT_SCRIPT_EXECUTION_TIME; + }) + .when(redisTemplate) + .execute(any(RedisCallback.class)); try (MockedStatic threadUtils = Mockito.mockStatic(ThreadUtils.class)) { - threadUtils.when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) + threadUtils + .when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) .thenReturn(scheduler); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); waitFor(() -> scheduler.submittedTasks() >= 2, "one start task to be submitted"); @@ -114,8 +122,11 @@ void redisAndNormalScheduling() throws Exception { messageScheduler.destroy(); int ranJobs = counter.get(); int jobCount = scheduler.submittedTasks(); - log.info("Expected Job={}, Ran Jobs={}, Submitted Jobs={}", - expectedMessageMoveCalls, ranJobs, jobCount); + log.info( + "Expected Job={}, Ran Jobs={}, Submitted Jobs={}", + expectedMessageMoveCalls, + ranJobs, + jobCount); assertTrue(jobCount >= ranJobs); assertTrue(jobCount >= expectedMessageMoveCalls); } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisScheduleTriggerHandlerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisScheduleTriggerHandlerTest.java index 4c4eaa4a..3000c036 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisScheduleTriggerHandlerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisScheduleTriggerHandlerTest.java @@ -1,19 +1,18 @@ package com.github.sonus21.rqueue.core; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + import com.github.sonus21.TestBase; import com.github.sonus21.rqueue.CoreUnitTest; import com.github.sonus21.rqueue.config.RqueueSchedulerConfig; import com.github.sonus21.rqueue.listener.QueueDetail; import com.github.sonus21.rqueue.utils.TestUtils; import com.github.sonus21.rqueue.utils.TimeoutUtils; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.data.redis.connection.DefaultMessage; -import org.springframework.data.redis.connection.MessageListener; - import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; @@ -21,13 +20,13 @@ import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.data.redis.connection.DefaultMessage; +import org.springframework.data.redis.connection.MessageListener; @CoreUnitTest @Slf4j @@ -37,14 +36,16 @@ class RedisScheduleTriggerHandlerTest extends TestBase { private final String slowQueue = "slow-queue"; private final QueueDetail slowQueueDetail = TestUtils.createQueueDetail(slowQueue); private Scheduler scheduler; + @Mock private RqueueSchedulerConfig rqueueSchedulerConfig; + @Mock private RqueueRedisListenerContainerFactory rqueueRedisListenerContainerFactory; + private RedisScheduleTriggerHandler redisScheduleTriggerHandler; private long runningTime = 0; - class Task implements Callable { @Override @@ -72,9 +73,12 @@ public void init() { EndpointRegistry.delete(); EndpointRegistry.register(slowQueueDetail); scheduler = new Scheduler(); - redisScheduleTriggerHandler = new RedisScheduleTriggerHandler(log, - rqueueRedisListenerContainerFactory, rqueueSchedulerConfig, - List.of(slowQueue), scheduler, + redisScheduleTriggerHandler = new RedisScheduleTriggerHandler( + log, + rqueueRedisListenerContainerFactory, + rqueueSchedulerConfig, + List.of(slowQueue), + scheduler, (e) -> { return slowQueueDetail.getScheduledQueueChannelName(); }); @@ -92,22 +96,27 @@ void onMessageListenerTest() throws Exception { // invalid body messageListener.onMessage( - new DefaultMessage(slowQueueDetail.getScheduledQueueChannelName().getBytes(), - "sss".getBytes()), null); + new DefaultMessage( + slowQueueDetail.getScheduledQueueChannelName().getBytes(), "sss".getBytes()), + null); TimeoutUtils.sleep(50); assertEquals(0, scheduler.counter.get()); // future time messageListener.onMessage( - new DefaultMessage(slowQueueDetail.getScheduledQueueChannelName().getBytes(), - String.valueOf(System.currentTimeMillis() + 500).getBytes()), null); + new DefaultMessage( + slowQueueDetail.getScheduledQueueChannelName().getBytes(), + String.valueOf(System.currentTimeMillis() + 500).getBytes()), + null); TimeoutUtils.sleep(50); assertEquals(0, scheduler.counter.get()); // both are correct messageListener.onMessage( - new DefaultMessage(slowQueueDetail.getScheduledQueueChannelName().getBytes(), - String.valueOf(System.currentTimeMillis()).getBytes()), null); + new DefaultMessage( + slowQueueDetail.getScheduledQueueChannelName().getBytes(), + String.valueOf(System.currentTimeMillis()).getBytes()), + null); assertEquals(1, scheduler.counter.get()); // let it run TimeoutUtils.sleep(100); @@ -115,15 +124,19 @@ void onMessageListenerTest() throws Exception { // send another message while one is running runningTime = 200; messageListener.onMessage( - new DefaultMessage(slowQueueDetail.getScheduledQueueChannelName().getBytes(), - String.valueOf(System.currentTimeMillis()).getBytes()), null); + new DefaultMessage( + slowQueueDetail.getScheduledQueueChannelName().getBytes(), + String.valueOf(System.currentTimeMillis()).getBytes()), + null); assertEquals(2, scheduler.counter.get()); TimeoutUtils.sleep(100); // this should be rejected as another task is already running messageListener.onMessage( - new DefaultMessage(slowQueueDetail.getScheduledQueueChannelName().getBytes(), - String.valueOf(System.currentTimeMillis()).getBytes()), null); + new DefaultMessage( + slowQueueDetail.getScheduledQueueChannelName().getBytes(), + String.valueOf(System.currentTimeMillis()).getBytes()), + null); TimeoutUtils.sleep(50); assertEquals(2, scheduler.counter.get()); TimeoutUtils.sleep(100); @@ -131,8 +144,10 @@ void onMessageListenerTest() throws Exception { // this should success long lastRunTime = System.currentTimeMillis(); messageListener.onMessage( - new DefaultMessage(slowQueueDetail.getScheduledQueueChannelName().getBytes(), - String.valueOf(System.currentTimeMillis()).getBytes()), null); + new DefaultMessage( + slowQueueDetail.getScheduledQueueChannelName().getBytes(), + String.valueOf(System.currentTimeMillis()).getBytes()), + null); assertEquals(3, scheduler.counter.get()); verify(rqueueRedisListenerContainerFactory, times(1)).addMessageListener(any(), any()); doReturn(400L).when(rqueueSchedulerConfig).getTerminationWaitTime(); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisScriptFactoryTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisScriptFactoryTest.java index 7767c728..8adaeab5 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisScriptFactoryTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RedisScriptFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -53,18 +53,20 @@ class RedisScriptFactoryTest extends TestBase { @Test @TestQueue( value = { - "testExpiredMessageMoverWithFailureQueue", - "__rq::p-queue::testExpiredMessageMoverWithFailureQueue" + "testExpiredMessageMoverWithFailureQueue", + "__rq::p-queue::testExpiredMessageMoverWithFailureQueue" }) void expiredMessageMoverWithFailureQueue() { String queueName = "testExpiredMessageMoverWithFailureQueue"; String zsetName = "__rq::p-queue::testExpiredMessageMoverWithFailureQueue"; - RqueueMessage rqueueMessage1 = RqueueMessage.builder().message("Test message 1").build(); + RqueueMessage rqueueMessage1 = + RqueueMessage.builder().message("Test message 1").build(); RqueueMessage rqueueMessage2 = RqueueMessage.builder().message("Test message 2").failureCount(1).build(); RqueueMessage rqueueMessage3 = RqueueMessage.builder().message("Test message 3").failureCount(110).build(); - RqueueMessage rqueueMessage4 = RqueueMessage.builder().message("Test message 4").build(); + RqueueMessage rqueueMessage4 = + RqueueMessage.builder().message("Test message 4").build(); rqueueMessageTemplate.addToZset(zsetName, rqueueMessage1, 1000); rqueueMessageTemplate.addToZset(zsetName, rqueueMessage2, 1500); rqueueMessageTemplate.addToZset(zsetName, rqueueMessage3, 2000); @@ -89,12 +91,14 @@ void expiredMessageMoverWithFailureQueue() { void expiredMessageMover() { String queueName = "testExpiredMessageMover"; String zsetName = "__rq::d-queue::testExpiredMessageMover"; - RqueueMessage rqueueMessage1 = RqueueMessage.builder().message("Test message 1").build(); + RqueueMessage rqueueMessage1 = + RqueueMessage.builder().message("Test message 1").build(); RqueueMessage rqueueMessage2 = RqueueMessage.builder().message("Test message 2").failureCount(1).build(); RqueueMessage rqueueMessage3 = RqueueMessage.builder().message("Test message 3").failureCount(110).build(); - RqueueMessage rqueueMessage4 = RqueueMessage.builder().message("Test message 4").build(); + RqueueMessage rqueueMessage4 = + RqueueMessage.builder().message("Test message 4").build(); rqueueMessageTemplate.addToZset(zsetName, rqueueMessage1, 1000); rqueueMessageTemplate.addToZset(zsetName, rqueueMessage2, 1500); rqueueMessageTemplate.addToZset(zsetName, rqueueMessage3, 2000); @@ -118,8 +122,10 @@ void expiredMessageMover() { @TestQueue("testDeleteIfSame") void deleteIfSame() { String key = "testDeleteIfSame"; - RqueueMessage rqueueMessage = RqueueMessage.builder().message("Test message 1").build(); - RqueueMessage rqueueMessage2 = RqueueMessage.builder().message("Test message 2").build(); + RqueueMessage rqueueMessage = + RqueueMessage.builder().message("Test message 1").build(); + RqueueMessage rqueueMessage2 = + RqueueMessage.builder().message("Test message 2").build(); RedisScript script = RedisScriptFactory.getScript(ScriptType.DELETE_IF_SAME); RqueueRedisTemplate template = new RqueueMessageTemplateImpl(redisConnectionFactory, null); @@ -152,7 +158,8 @@ void testDequeue() { RqueueMessageTemplate template = new RqueueMessageTemplateImpl(redisConnectionFactory, null); LinkedList rqueueMessageList = new LinkedList<>(); for (int i = 0; i < 55; i++) { - RqueueMessage rqueueMessage = RqueueMessage.builder().message("Test message " + i).build(); + RqueueMessage rqueueMessage = + RqueueMessage.builder().message("Test message " + i).build(); rqueueMessage.setId(UUID.randomUUID().toString()); template.addMessage(queue, rqueueMessage); rqueueMessageList.add(rqueueMessage); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueEndpointManagerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueEndpointManagerTest.java index fa7ecdab..bd560e8b 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueEndpointManagerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueEndpointManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -34,16 +34,17 @@ class RqueueEndpointManagerTest extends TestBase { @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RqueueConfig rqueueConfig; + private RqueueEndpointManager rqueueEndpointManager; @BeforeEach public void init() throws IllegalAccessException { MockitoAnnotations.openMocks(this); - rqueueEndpointManager = - new RqueueEndpointManagerImpl( - rqueueMessageTemplate, new DefaultRqueueMessageConverter(), null); + rqueueEndpointManager = new RqueueEndpointManagerImpl( + rqueueMessageTemplate, new DefaultRqueueMessageConverter(), null); FieldUtils.writeField(rqueueEndpointManager, "rqueueConfig", rqueueConfig, true); EndpointRegistry.delete(); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageEnqueuerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageEnqueuerTest.java index 6461a733..80e5dfd4 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageEnqueuerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageEnqueuerTest.java @@ -43,20 +43,23 @@ class RqueueMessageEnqueuerTest extends TestBase { private final String slowQueue = "slow-queue"; private final String deadLetterQueueName = "dead-test-queue"; private final String message = "Test Message"; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RqueueConfig rqueueConfig; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + private RqueueMessageEnqueuer rqueueMessageEnqueuer; @BeforeEach public void init() throws IllegalAccessException { MockitoAnnotations.openMocks(this); - rqueueMessageEnqueuer = - new RqueueMessageEnqueuerImpl( - rqueueMessageTemplate, new DefaultRqueueMessageConverter(), null); + rqueueMessageEnqueuer = new RqueueMessageEnqueuerImpl( + rqueueMessageTemplate, new DefaultRqueueMessageConverter(), null); EndpointRegistry.delete(); EndpointRegistry.register(queueDetail); writeField(rqueueMessageEnqueuer, "rqueueConfig", rqueueConfig, true); @@ -112,5 +115,4 @@ void enqueueWithDelayAndRetry() { any(RqueueMessage.class)); assertNotNull(rqueueMessageEnqueuer.enqueueInWithRetry(queueName, message, 3, 1000L)); } - } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageTemplateTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageTemplateTest.java index e40f984c..6c437f7e 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageTemplateTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageTemplateTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -42,29 +42,33 @@ class RqueueMessageTemplateTest extends TestBase { private final String queueName = "test-queue"; - private final RqueueMessage message = - RqueueMessage.builder() - .queuedTime(System.nanoTime()) - .id(UUID.randomUUID().toString()) - .queueName(queueName) - .message("This is a test message") - .processAt(System.currentTimeMillis()) - .build(); + private final RqueueMessage message = RqueueMessage.builder() + .queuedTime(System.nanoTime()) + .id(UUID.randomUUID().toString()) + .queueName(queueName) + .message("This is a test message") + .processAt(System.currentTimeMillis()) + .build(); + @Mock private RedisConnectionFactory redisConnectionFactory; + @Mock private RedisTemplate redisTemplate; + @Mock private ListOperations listOperations; + @Mock private DefaultScriptExecutor scriptExecutor; + private RqueueMessageTemplate rqueueMessageTemplate; @BeforeEach public void init() throws Exception { MockitoAnnotations.openMocks(this); - rqueueMessageTemplate = TestUtils.rqueueMessageTemplate(redisConnectionFactory, redisTemplate, - scriptExecutor); + rqueueMessageTemplate = + TestUtils.rqueueMessageTemplate(redisConnectionFactory, redisTemplate, scriptExecutor); } @Test diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageTest.java index 7194ff6b..9340c5dd 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/RqueueMessageTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -40,14 +40,13 @@ class RqueueMessageTest extends TestBase { @Test void setReEnqueuedAt() { - RqueueMessage message = - RqueueMessage.builder() - .queueName(queueName) - .message(queueMessage) - .retryCount(retryCount) - .processAt(System.currentTimeMillis() + delay) - .queuedTime(System.nanoTime()) - .build(); + RqueueMessage message = RqueueMessage.builder() + .queueName(queueName) + .message(queueMessage) + .retryCount(retryCount) + .processAt(System.currentTimeMillis() + delay) + .queuedTime(System.nanoTime()) + .build(); Long time = System.currentTimeMillis() - delay; message.setReEnqueuedAt(time); assertEquals(message.getReEnqueuedAt(), time); @@ -55,107 +54,100 @@ void setReEnqueuedAt() { @Test void objectEquality() throws JacksonException { - RqueueMessage message = - RqueueMessage.builder() - .id(UUID.randomUUID().toString()) - .queueName(queueName) - .message(queueMessage) - .retryCount(retryCount) - .processAt(System.currentTimeMillis() + delay) - .queuedTime(System.nanoTime()) - .build(); + RqueueMessage message = RqueueMessage.builder() + .id(UUID.randomUUID().toString()) + .queueName(queueName) + .message(queueMessage) + .retryCount(retryCount) + .processAt(System.currentTimeMillis() + delay) + .queuedTime(System.nanoTime()) + .build(); String stringMessage = objectMapper.writeValueAsString(message); assertEquals(message, objectMapper.readValue(stringMessage, RqueueMessage.class)); } @Test void objectEqualityWithoutDelay() throws JacksonException { - RqueueMessage message = - RqueueMessage.builder() - .id(UUID.randomUUID().toString()) - .queueName(queueName) - .message(queueMessage) - .retryCount(retryCount) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .build(); + RqueueMessage message = RqueueMessage.builder() + .id(UUID.randomUUID().toString()) + .queueName(queueName) + .message(queueMessage) + .retryCount(retryCount) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .build(); String stringMessage = objectMapper.writeValueAsString(message); assertEquals(message, objectMapper.readValue(stringMessage, RqueueMessage.class)); } @Test void objectEqualityWithDifferentObject() { - RqueueMessage message = - RqueueMessage.builder() - .queueName(queueName) - .message(queueMessage) - .retryCount(retryCount) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .build(); + RqueueMessage message = RqueueMessage.builder() + .queueName(queueName) + .message(queueMessage) + .retryCount(retryCount) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .build(); assertNotEquals(message, new Object()); } @Test void objectEqualityWithDifferentId() { - RqueueMessage message = - RqueueMessage.builder() - .id(UUID.randomUUID().toString()) - .queueName(queueName) - .message(queueMessage) - .retryCount(retryCount) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .build(); + RqueueMessage message = RqueueMessage.builder() + .id(UUID.randomUUID().toString()) + .queueName(queueName) + .message(queueMessage) + .retryCount(retryCount) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .build(); - RqueueMessage message2 = - RqueueMessage.builder() - .id("x" + UUID.randomUUID().toString()) - .queueName(queueName) - .message(queueMessage) - .retryCount(retryCount) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .build(); + RqueueMessage message2 = RqueueMessage.builder() + .id("x" + UUID.randomUUID().toString()) + .queueName(queueName) + .message(queueMessage) + .retryCount(retryCount) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .build(); assertNotEquals(message, message2); } @Test void RqueueMessageToString() { - RqueueMessage message = - RqueueMessage.builder() - .id(UUID.randomUUID().toString()) - .queueName(queueName) - .message(queueMessage) - .retryCount(retryCount) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .build(); - String toString = - "RqueueMessage(id=" - + message.getId() - + ", queueName=test-queue, message=This is a test message, retryCount=" - + retryCount - + ", queuedTime=" - + message.getQueuedTime() - + ", processAt=" - + message.getProcessAt() - + ", reEnqueuedAt=null, failureCount=0, sourceQueueFailureCount=0, sourceQueueName=null, period=0)"; + RqueueMessage message = RqueueMessage.builder() + .id(UUID.randomUUID().toString()) + .queueName(queueName) + .message(queueMessage) + .retryCount(retryCount) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .build(); + String toString = "RqueueMessage(id=" + + message.getId() + + ", queueName=test-queue, message=This is a test message, retryCount=" + + retryCount + + ", queuedTime=" + + message.getQueuedTime() + + ", processAt=" + + message.getProcessAt() + + ", reEnqueuedAt=null, failureCount=0, sourceQueueFailureCount=0, sourceQueueName=null," + + " period=0)"; assertEquals(toString, message.toString()); } @Test void isPeriodic() { - RqueueMessage message = - RqueueMessage.builder() - .id(UUID.randomUUID().toString()) - .queueName(queueName) - .message(queueMessage) - .retryCount(retryCount) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .period(10000) - .build(); + RqueueMessage message = RqueueMessage.builder() + .id(UUID.randomUUID().toString()) + .queueName(queueName) + .message(queueMessage) + .retryCount(retryCount) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .period(10000) + .build(); assertTrue(message.isPeriodic()); message.setPeriod(0); assertFalse(message.isPeriodic()); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/ScheduledQueueMessageSchedulerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/ScheduledQueueMessageSchedulerTest.java index 25e91f1e..fd55d094 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/ScheduledQueueMessageSchedulerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/ScheduledQueueMessageSchedulerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -36,14 +36,12 @@ import com.github.sonus21.rqueue.config.RqueueSchedulerConfig; import com.github.sonus21.rqueue.listener.QueueDetail; import com.github.sonus21.rqueue.models.event.RqueueBootstrapEvent; -import com.github.sonus21.rqueue.utils.Constants; import com.github.sonus21.rqueue.utils.TestUtils; import com.github.sonus21.rqueue.utils.ThreadUtils; import com.github.sonus21.rqueue.utils.TimeoutUtils; import com.github.sonus21.test.TestTaskScheduler; import java.util.Map; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.lang3.reflect.FieldUtils; import org.junit.jupiter.api.BeforeEach; @@ -69,14 +67,19 @@ class ScheduledQueueMessageSchedulerTest extends TestBase { private final String fastQueue = "fast-queue"; private final QueueDetail slowQueueDetail = TestUtils.createQueueDetail(slowQueue); private final QueueDetail fastQueueDetail = TestUtils.createQueueDetail(fastQueue); + @Mock private RqueueSchedulerConfig rqueueSchedulerConfig; + @Mock private RqueueConfig rqueueConfig; + @Mock private RedisTemplate redisTemplate; + @Mock private RqueueRedisListenerContainerFactory rqueueRedisListenerContainerFactory; + @InjectMocks private TestScheduledQueueMessageScheduler messageScheduler; @@ -90,8 +93,8 @@ public void init() { @Test void getChannelName() { - assertEquals(slowQueueDetail.getScheduledQueueChannelName(), - messageScheduler.getChannelName(slowQueue)); + assertEquals( + slowQueueDetail.getScheduledQueueChannelName(), messageScheduler.getChannelName(slowQueue)); } @Test @@ -103,9 +106,11 @@ void getZsetName() { void getNextScheduleTime() { long currentTime = System.currentTimeMillis(); doReturn(5000L).when(rqueueSchedulerConfig).getScheduledMessageTimeIntervalInMilli(); - assertThat(messageScheduler.getNextScheduleTime(slowQueue, currentTime, null), + assertThat( + messageScheduler.getNextScheduleTime(slowQueue, currentTime, null), greaterThanOrEqualTo(currentTime + 5000L)); - assertThat(messageScheduler.getNextScheduleTime(fastQueue, currentTime, currentTime + 1000L), + assertThat( + messageScheduler.getNextScheduleTime(fastQueue, currentTime, currentTime + 1000L), greaterThanOrEqualTo(currentTime + 5000L)); } @@ -129,12 +134,12 @@ void start() throws Exception { doReturn(true).when(rqueueSchedulerConfig).isEnabled(); doReturn(1000L).when(rqueueSchedulerConfig).getScheduledMessageTimeIntervalInMilli(); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); - Map queueRunningState = (Map) FieldUtils.readField( - messageScheduler, "queueRunningState", true); + Map queueRunningState = + (Map) FieldUtils.readField(messageScheduler, "queueRunningState", true); assertEquals(2, queueRunningState.size()); assertTrue(queueRunningState.get(slowQueue)); - assertEquals(2, - ((Map) FieldUtils.readField(messageScheduler, "queueNameToScheduledTask", true)).size()); + assertEquals( + 2, ((Map) FieldUtils.readField(messageScheduler, "queueNameToScheduledTask", true)).size()); TimeoutUtils.sleep(500L); messageScheduler.destroy(); } @@ -146,10 +151,14 @@ void startAddsChannelToMessageListener() throws Exception { doReturn(true).when(rqueueSchedulerConfig).isAutoStart(); doReturn(true).when(rqueueSchedulerConfig).isEnabled(); doReturn(true).when(rqueueSchedulerConfig).isRedisEnabled(); - doNothing().when(rqueueRedisListenerContainerFactory).addMessageListener(any(), - eq(new ChannelTopic(slowQueueDetail.getScheduledQueueChannelName()))); - doNothing().when(rqueueRedisListenerContainerFactory).addMessageListener(any(), - eq(new ChannelTopic(fastQueueDetail.getScheduledQueueChannelName()))); + doNothing() + .when(rqueueRedisListenerContainerFactory) + .addMessageListener( + any(), eq(new ChannelTopic(slowQueueDetail.getScheduledQueueChannelName()))); + doNothing() + .when(rqueueRedisListenerContainerFactory) + .addMessageListener( + any(), eq(new ChannelTopic(fastQueueDetail.getScheduledQueueChannelName()))); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); TimeoutUtils.sleep(500L); messageScheduler.destroy(); @@ -165,12 +174,12 @@ void stop() throws Exception { messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); TimeoutUtils.sleep(500L); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", false)); - Map queueRunningState = (Map) FieldUtils.readField( - messageScheduler, "queueRunningState", true); + Map queueRunningState = + (Map) FieldUtils.readField(messageScheduler, "queueRunningState", true); assertEquals(2, queueRunningState.size()); assertFalse(queueRunningState.get(slowQueue)); - assertEquals(2, - ((Map) FieldUtils.readField(messageScheduler, "queueNameToNextRunTime", true)).size()); + assertEquals( + 2, ((Map) FieldUtils.readField(messageScheduler, "queueNameToNextRunTime", true)).size()); assertTrue( ((Map) FieldUtils.readField(messageScheduler, "queueNameToScheduledTask", true)).isEmpty()); messageScheduler.destroy(); @@ -185,17 +194,18 @@ void destroy() throws Exception { doReturn(1000L).when(rqueueSchedulerConfig).getScheduledMessageTimeIntervalInMilli(); TestTaskScheduler scheduler = new TestTaskScheduler(); try (MockedStatic threadUtils = Mockito.mockStatic(ThreadUtils.class)) { - threadUtils.when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) + threadUtils + .when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) .thenReturn(scheduler); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); TimeoutUtils.sleep(500L); messageScheduler.destroy(); - Map queueRunningState = (Map) FieldUtils.readField( - messageScheduler, "queueRunningState", true); + Map queueRunningState = + (Map) FieldUtils.readField(messageScheduler, "queueRunningState", true); assertEquals(2, queueRunningState.size()); assertFalse(queueRunningState.get(slowQueue)); - assertTrue(((Map) FieldUtils.readField(messageScheduler, "queueNameToScheduledTask", - true)).isEmpty()); + assertTrue(((Map) FieldUtils.readField(messageScheduler, "queueNameToScheduledTask", true)) + .isEmpty()); assertTrue(scheduler.shutdown); } } @@ -208,7 +218,8 @@ void startSubmitsTask() throws Exception { doReturn(true).when(rqueueSchedulerConfig).isRedisEnabled(); TestTaskScheduler scheduler = new TestTaskScheduler(); try (MockedStatic threadUtils = Mockito.mockStatic(ThreadUtils.class)) { - threadUtils.when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) + threadUtils + .when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) .thenReturn(scheduler); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); assertTrue(scheduler.submittedTasks() >= 1); @@ -225,9 +236,11 @@ void startSubmitsTaskAndThatGetsExecuted() throws Exception { doReturn(1000L).when(rqueueSchedulerConfig).getScheduledMessageTimeIntervalInMilli(); AtomicInteger counter = new AtomicInteger(0); doAnswer(invocation -> { - counter.incrementAndGet(); - return null; - }).when(redisTemplate).execute(any(RedisCallback.class)); + counter.incrementAndGet(); + return null; + }) + .when(redisTemplate) + .execute(any(RedisCallback.class)); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); waitFor(() -> counter.get() >= 1, "scripts are getting executed"); messageScheduler.destroy(); @@ -243,11 +256,14 @@ void onCompletionOfExistingTaskNewTaskShouldBeSubmitted() throws Exception { doReturn(1000L).when(rqueueSchedulerConfig).getScheduledMessageTimeIntervalInMilli(); AtomicInteger counter = new AtomicInteger(0); doAnswer(invocation -> { - counter.incrementAndGet(); - return null; - }).when(redisTemplate).execute(any(RedisCallback.class)); + counter.incrementAndGet(); + return null; + }) + .when(redisTemplate) + .execute(any(RedisCallback.class)); TestTaskScheduler scheduler = new TestTaskScheduler(); - threadUtils.when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) + threadUtils + .when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) .thenReturn(scheduler); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); waitFor(() -> counter.get() >= 1, "scripts are getting executed"); @@ -267,12 +283,15 @@ void taskShouldBeScheduledOnFailure() throws Exception { doReturn(10000L).when(rqueueSchedulerConfig).getMaxMessageMoverDelay(); AtomicInteger counter = new AtomicInteger(0); doAnswer(invocation -> { - counter.incrementAndGet(); - throw new RedisSystemException("Something is not correct", - new NullPointerException("oops!")); - }).when(redisTemplate).execute(any(RedisCallback.class)); + counter.incrementAndGet(); + throw new RedisSystemException( + "Something is not correct", new NullPointerException("oops!")); + }) + .when(redisTemplate) + .execute(any(RedisCallback.class)); TestTaskScheduler scheduler = new TestTaskScheduler(); - threadUtils.when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) + threadUtils + .when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) .thenReturn(scheduler); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); waitFor(() -> counter.get() >= 1, "scripts are getting executed"); @@ -292,19 +311,25 @@ void continuousTaskFailTask() throws Exception { doReturn(100L).when(rqueueSchedulerConfig).getMaxMessageMoverDelay(); AtomicInteger counter = new AtomicInteger(0); doAnswer(invocation -> { - int count = counter.incrementAndGet(); - if (count % 3 == 0) { - throw new RedisSystemException("Something is not correct", - new NullPointerException("oops!")); - } - if (count % 3 == 1) { - throw new RedisConnectionFailureException("Unknown host"); - } - throw new ClusterRedirectException(3, "localhost", 9004, - new TooManyClusterRedirectionsException("too many redirects")); - }).when(redisTemplate).execute(any(RedisCallback.class)); + int count = counter.incrementAndGet(); + if (count % 3 == 0) { + throw new RedisSystemException( + "Something is not correct", new NullPointerException("oops!")); + } + if (count % 3 == 1) { + throw new RedisConnectionFailureException("Unknown host"); + } + throw new ClusterRedirectException( + 3, + "localhost", + 9004, + new TooManyClusterRedirectionsException("too many redirects")); + }) + .when(redisTemplate) + .execute(any(RedisCallback.class)); TestTaskScheduler scheduler = new TestTaskScheduler(); - threadUtils.when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) + threadUtils + .when(() -> ThreadUtils.createTaskScheduler(1, "scheduledQueueMsgScheduler-", 60)) .thenReturn(scheduler); messageScheduler.onApplicationEvent(new RqueueBootstrapEvent("Test", true)); waitFor(() -> counter.get() >= 10, "scripts are getting executed"); @@ -313,7 +338,6 @@ void continuousTaskFailTask() throws Exception { } } - static class TestScheduledQueueMessageScheduler extends ScheduledQueueMessageScheduler { final AtomicInteger scheduleCounter; diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/context/DefaultContextTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/context/DefaultContextTest.java index 77240864..72079032 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/context/DefaultContextTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/context/DefaultContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueEndpointManagerImplTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueEndpointManagerImplTest.java index 5638ffc0..6c3e1ccb 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueEndpointManagerImplTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueEndpointManagerImplTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -53,16 +53,20 @@ class RqueueEndpointManagerImplTest extends TestBase { private final MessageConverter messageConverter = new DefaultRqueueMessageConverter(); private final MessageHeaders messageHeaders = RqueueMessageHeaders.emptyMessageHeaders(); private final String queue = "test-queue"; - private final String[] priorities = new String[]{"high", "medium", "low"}; + private final String[] priorities = new String[] {"high", "medium", "low"}; @Mock private RqueueMessageTemplate messageTemplate; + @Mock private RedisConnectionFactory redisConnectionFactory; + @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private RqueueUtilityService rqueueUtilityService; + private RqueueEndpointManager rqueueEndpointManager; @BeforeEach diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueMessageEnqueuerImplTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueMessageEnqueuerImplTest.java index a35f0da8..4ccc37b3 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueMessageEnqueuerImplTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueMessageEnqueuerImplTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -48,12 +48,16 @@ class RqueueMessageEnqueuerImplTest extends TestBase { private static final QueueDetail queueDetail = TestUtils.createQueueDetail(queue); MessageConverter messageConverter = new DefaultRqueueMessageConverter(); MessageHeaders messageHeaders = RqueueMessageHeaders.emptyMessageHeaders(); + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + @Mock private RqueueMessageTemplate messageTemplate; + @Mock private RqueueConfig rqueueConfig; + private RqueueMessageEnqueuer rqueueMessageEnqueuer; @BeforeAll @@ -73,8 +77,8 @@ public void init() throws IllegalAccessException { rqueueMessageEnqueuer = new RqueueMessageEnqueuerImpl(messageTemplate, messageConverter, messageHeaders); FieldUtils.writeField(rqueueMessageEnqueuer, "rqueueConfig", rqueueConfig, true); - FieldUtils.writeField(rqueueMessageEnqueuer, "rqueueMessageMetadataService", - rqueueMessageMetadataService, true); + FieldUtils.writeField( + rqueueMessageEnqueuer, "rqueueMessageMetadataService", rqueueMessageMetadataService, true); } @Test diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueMessageManagerImplTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueMessageManagerImplTest.java index ceca3a83..debf9a68 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueMessageManagerImplTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/impl/RqueueMessageManagerImplTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2025 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -40,7 +40,6 @@ import com.github.sonus21.rqueue.core.RqueueMessage; import com.github.sonus21.rqueue.core.RqueueMessageManager; import com.github.sonus21.rqueue.core.RqueueMessageTemplate; -import com.github.sonus21.rqueue.exception.LockCanNotBeAcquired; import com.github.sonus21.rqueue.listener.QueueDetail; import com.github.sonus21.rqueue.models.MessageMoveResult; import com.github.sonus21.rqueue.models.db.MessageMetadata; @@ -67,48 +66,46 @@ class RqueueMessageManagerImplTest extends TestBase { private final String messageId = UUID.randomUUID().toString(); private final String message = "Test Message"; - private final String queueName = "test-queue"; private final String deadLetterQueueName = "dead-test-queue"; - private final MessageMetadata messageMetadata = MessageMetadataTestUtils.createMessageMetadata( - messageConverter, - queueName, message); + private final MessageMetadata messageMetadata = + MessageMetadataTestUtils.createMessageMetadata(messageConverter, queueName, message); private final RqueueMessage rqueueMessage = messageMetadata.getRqueueMessage(); private final QueueDetail queueDetail = TestUtils.createQueueDetail(queueName); - private final String queueName2 = "test-queue2"; private final String priority = "high"; - private final String queueNameWithPriority = PriorityUtils.getQueueNameForPriority(queueName2, - priority); + private final String queueNameWithPriority = + PriorityUtils.getQueueNameForPriority(queueName2, priority); private final QueueDetail queueDetail2 = TestUtils.createQueueDetail( - queueNameWithPriority, - Collections.singletonMap(priority, 5), 3, 15_000, ""); - + queueNameWithPriority, Collections.singletonMap(priority, 5), 3, 15_000, ""); private final MessageMetadata messageMetadata2 = MessageMetadataTestUtils.createMessageMetadata( - messageConverter, - queueNameWithPriority, message); + messageConverter, queueNameWithPriority, message); private final RqueueMessage rqueueMessage2 = messageMetadata2.getRqueueMessage(); + @Mock private RqueueLockManager rqueueLockManager; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RqueueConfig rqueueConfig; + @Mock private MessageSweeper messageSweeper; - private RqueueMessageManager rqueueMessageManager; + private RqueueMessageManager rqueueMessageManager; @BeforeEach public void init() throws IllegalAccessException { MockitoAnnotations.openMocks(this); rqueueMessageManager = - new RqueueMessageManagerImpl( - rqueueMessageTemplate, messageConverter, null); + new RqueueMessageManagerImpl(rqueueMessageTemplate, messageConverter, null); EndpointRegistry.delete(); EndpointRegistry.register(queueDetail); EndpointRegistry.register(queueDetail2); @@ -118,12 +115,12 @@ public void init() throws IllegalAccessException { rqueueMessageManager, "rqueueMessageMetadataService", rqueueMessageMetadataService, true); } - @Test void deleteAllMessages() { - try (MockedStatic messageSweeperMockedStatic = Mockito.mockStatic( - MessageSweeper.class)) { - messageSweeperMockedStatic.when(() -> MessageSweeper.getInstance(any(), any(), any())) + try (MockedStatic messageSweeperMockedStatic = + Mockito.mockStatic(MessageSweeper.class)) { + messageSweeperMockedStatic + .when(() -> MessageSweeper.getInstance(any(), any(), any())) .thenReturn(messageSweeper); rqueueMessageManager.deleteAllMessages(queueName); verify(messageSweeper, times(1)).deleteAllMessages(any()); @@ -132,24 +129,30 @@ void deleteAllMessages() { @Test void deleteAllMessagesWithPriority() { - try (MockedStatic messageSweeperMockedStatic = Mockito.mockStatic( - MessageSweeper.class)) { - messageSweeperMockedStatic.when(() -> MessageSweeper.getInstance(any(), any(), any())) + try (MockedStatic messageSweeperMockedStatic = + Mockito.mockStatic(MessageSweeper.class)) { + messageSweeperMockedStatic + .when(() -> MessageSweeper.getInstance(any(), any(), any())) .thenReturn(messageSweeper); rqueueMessageManager.deleteAllMessages(queueName2, priority); verify(messageSweeper, times(1)).deleteAllMessages(any()); } } - @Test void getAllMessages() { - doReturn(Collections.emptyList()).when(rqueueMessageTemplate) - .getAllMessages(queueDetail.getQueueName(), queueDetail.getProcessingQueueName(), + doReturn(Collections.emptyList()) + .when(rqueueMessageTemplate) + .getAllMessages( + queueDetail.getQueueName(), + queueDetail.getProcessingQueueName(), queueDetail.getScheduledQueueName()); assertEquals(0, rqueueMessageManager.getAllMessages(queueName).size()); - doReturn(Collections.singletonList(rqueueMessage)).when(rqueueMessageTemplate) - .getAllMessages(queueDetail.getQueueName(), queueDetail.getProcessingQueueName(), + doReturn(Collections.singletonList(rqueueMessage)) + .when(rqueueMessageTemplate) + .getAllMessages( + queueDetail.getQueueName(), + queueDetail.getProcessingQueueName(), queueDetail.getScheduledQueueName()); List messages = rqueueMessageManager.getAllMessages(queueName); assertEquals(1, messages.size()); @@ -158,13 +161,19 @@ void getAllMessages() { @Test void getAllMessagesWithPriority() { - doReturn(Collections.emptyList()).when(rqueueMessageTemplate) - .getAllMessages(queueDetail2.getQueueName(), queueDetail2.getProcessingQueueName(), + doReturn(Collections.emptyList()) + .when(rqueueMessageTemplate) + .getAllMessages( + queueDetail2.getQueueName(), + queueDetail2.getProcessingQueueName(), queueDetail2.getScheduledQueueName()); assertEquals(0, rqueueMessageManager.getAllMessages(queueName2, priority).size()); - doReturn(Collections.singletonList(rqueueMessage2)).when(rqueueMessageTemplate) - .getAllMessages(queueDetail2.getQueueName(), queueDetail2.getProcessingQueueName(), + doReturn(Collections.singletonList(rqueueMessage2)) + .when(rqueueMessageTemplate) + .getAllMessages( + queueDetail2.getQueueName(), + queueDetail2.getProcessingQueueName(), queueDetail2.getScheduledQueueName()); List messages = rqueueMessageManager.getAllMessages(queueName2, priority); assertEquals(1, messages.size()); @@ -190,20 +199,25 @@ void getRqueueMessageWithPriority() { doReturn(messageMetadata2) .when(rqueueMessageMetadataService) .getByMessageId(queueNameWithPriority, messageId); - assertEquals(rqueueMessage2, - rqueueMessageManager.getRqueueMessage(queueName2, priority, messageId)); + assertEquals( + rqueueMessage2, rqueueMessageManager.getRqueueMessage(queueName2, priority, messageId)); } - @Test void getAllRqueueMessage() { assertEquals(0, rqueueMessageManager.getAllRqueueMessage(queueName).size()); - verify(rqueueMessageTemplate, times(1)).getAllMessages(queueDetail.getQueueName(), - queueDetail.getProcessingQueueName(), queueDetail.getScheduledQueueName()); + verify(rqueueMessageTemplate, times(1)) + .getAllMessages( + queueDetail.getQueueName(), + queueDetail.getProcessingQueueName(), + queueDetail.getScheduledQueueName()); doReturn(Collections.singletonList(rqueueMessage)) - .when(rqueueMessageTemplate).getAllMessages(queueDetail.getQueueName(), - queueDetail.getProcessingQueueName(), queueDetail.getScheduledQueueName()); + .when(rqueueMessageTemplate) + .getAllMessages( + queueDetail.getQueueName(), + queueDetail.getProcessingQueueName(), + queueDetail.getScheduledQueueName()); List messages = rqueueMessageManager.getAllRqueueMessage(queueName); assertEquals(1, messages.size()); assertEquals(rqueueMessage, messages.get(0)); @@ -211,19 +225,25 @@ void getAllRqueueMessage() { @Test void getAllRqueueMessageWithPriority() { - assertEquals(0, rqueueMessageManager.getAllRqueueMessage(queueName2, priority).size()); - verify(rqueueMessageTemplate, times(1)).getAllMessages(queueDetail2.getQueueName(), - queueDetail2.getProcessingQueueName(), queueDetail2.getScheduledQueueName()); + assertEquals( + 0, rqueueMessageManager.getAllRqueueMessage(queueName2, priority).size()); + verify(rqueueMessageTemplate, times(1)) + .getAllMessages( + queueDetail2.getQueueName(), + queueDetail2.getProcessingQueueName(), + queueDetail2.getScheduledQueueName()); doReturn(Collections.singletonList(rqueueMessage)) - .when(rqueueMessageTemplate).getAllMessages(queueDetail2.getQueueName(), - queueDetail2.getProcessingQueueName(), queueDetail2.getScheduledQueueName()); + .when(rqueueMessageTemplate) + .getAllMessages( + queueDetail2.getQueueName(), + queueDetail2.getProcessingQueueName(), + queueDetail2.getScheduledQueueName()); List messages = rqueueMessageManager.getAllRqueueMessage(queueName2, priority); assertEquals(1, messages.size()); assertEquals(rqueueMessage, messages.get(0)); } - @Test void getMessage() { assertNull(rqueueMessageManager.getMessage(queueName, messageId)); @@ -254,9 +274,7 @@ void exist() { .getByMessageId(queueName, messageId); assertTrue(rqueueMessageManager.exist(queueName, messageId)); - doReturn(null) - .when(rqueueMessageMetadataService) - .getByMessageId(queueName, messageId); + doReturn(null).when(rqueueMessageMetadataService).getByMessageId(queueName, messageId); assertFalse(rqueueMessageManager.exist(queueName, messageId)); } @@ -270,17 +288,18 @@ void existWithPriority() { assertTrue(rqueueMessageManager.exist(queueName2, priority, messageId)); } - @Test void deleteMessage() { assertFalse(rqueueMessageManager.deleteMessage(queueName, messageId)); doReturn(Duration.ofSeconds(500)).when(rqueueConfig).getMessageDurability(0L); - doReturn(messageMetadata).when(rqueueMessageMetadataService) + doReturn(messageMetadata) + .when(rqueueMessageMetadataService) .getByMessageId(queueName, messageId); assertFalse(rqueueMessageManager.deleteMessage(queueName, messageId)); - doReturn(true).when(rqueueMessageMetadataService) + doReturn(true) + .when(rqueueMessageMetadataService) .deleteMessage(queueName, messageId, Duration.ofSeconds(500)); assertTrue(rqueueMessageManager.deleteMessage(queueName, messageId)); } @@ -291,29 +310,32 @@ void deleteMessageWithPriority() { assertFalse(rqueueMessageManager.deleteMessage(queueName2, messageId)); doReturn(Duration.ofSeconds(500)).when(rqueueConfig).getMessageDurability(0L); - doReturn(messageMetadata2).when(rqueueMessageMetadataService) + doReturn(messageMetadata2) + .when(rqueueMessageMetadataService) .getByMessageId(queueNameWithPriority, messageId); assertFalse(rqueueMessageManager.deleteMessage(queueName2, priority, messageId)); - doReturn(true).when(rqueueMessageMetadataService) + doReturn(true) + .when(rqueueMessageMetadataService) .deleteMessage(queueNameWithPriority, messageId, Duration.ofSeconds(500)); assertTrue(rqueueMessageManager.deleteMessage(queueName2, priority, messageId)); } @Test void getMessageConverter() { - assertEquals(messageConverter.hashCode(), - rqueueMessageManager.getMessageConverter().hashCode()); + assertEquals( + messageConverter.hashCode(), rqueueMessageManager.getMessageConverter().hashCode()); } - @Test void moveMessageFromQueueExceptions() { - assertThrows(IllegalArgumentException.class, + assertThrows( + IllegalArgumentException.class, () -> rqueueMessageManager.moveMessageFromDeadLetterToQueue(null, queueName, null)); - assertThrows(IllegalArgumentException.class, - () -> rqueueMessageManager.moveMessageFromDeadLetterToQueue(deadLetterQueueName, null, - null)); + assertThrows( + IllegalArgumentException.class, + () -> + rqueueMessageManager.moveMessageFromDeadLetterToQueue(deadLetterQueueName, null, null)); doReturn(new MessageMoveResult(10, true)) .when(rqueueMessageTemplate) .moveMessageListToList(anyString(), anyString(), anyInt()); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/ContextMiddlewareTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/ContextMiddlewareTest.java index b716821f..cd9a4b84 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/ContextMiddlewareTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/ContextMiddlewareTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -50,12 +50,10 @@ void handleReturnNullContext() { void handle() throws Exception { ContextMiddleware contextMiddleware = job -> DefaultContext.EMPTY; AtomicInteger atomicInteger = new AtomicInteger(); - contextMiddleware.handle( - job, - () -> { - atomicInteger.incrementAndGet(); - return null; - }); + contextMiddleware.handle(job, () -> { + atomicInteger.incrementAndGet(); + return null; + }); assertEquals(1, atomicInteger.get()); } } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/LockMiddlewareTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/LockMiddlewareTest.java index 4458f202..49d8c869 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/LockMiddlewareTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/LockMiddlewareTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -48,25 +48,22 @@ public void init() { void handleLockIsNotAcquired() throws Exception { AtomicInteger atomicInteger = new AtomicInteger(); AtomicInteger releaseLockCounter = new AtomicInteger(); - LockMiddleware lockMiddleware = - new LockMiddleware() { - @Override - public String acquireLock(Job job) { - return null; - } - - @Override - public void releaseLock(Job job, String lockIdentifier) { - releaseLockCounter.incrementAndGet(); - } - }; - - lockMiddleware.handle( - job, - () -> { - atomicInteger.incrementAndGet(); - return null; - }); + LockMiddleware lockMiddleware = new LockMiddleware() { + @Override + public String acquireLock(Job job) { + return null; + } + + @Override + public void releaseLock(Job job, String lockIdentifier) { + releaseLockCounter.incrementAndGet(); + } + }; + + lockMiddleware.handle(job, () -> { + atomicInteger.incrementAndGet(); + return null; + }); verify(job, times(1)) .release(JobStatus.FAILED, LockMiddleware.REASON, lockMiddleware.releaseIn(job)); assertEquals(1, releaseLockCounter.get()); @@ -77,26 +74,23 @@ public void releaseLock(Job job, String lockIdentifier) { void handleLockIsAcquired() throws Exception { AtomicInteger atomicInteger = new AtomicInteger(); AtomicInteger releaseLockCounter = new AtomicInteger(); - LockMiddleware lockMiddleware = - new LockMiddleware() { - @Override - public String acquireLock(Job job) { - return "test-lock"; - } - - @Override - public void releaseLock(Job job, String lockIdentifier) { - releaseLockCounter.incrementAndGet(); - assertEquals(lockIdentifier, "test-lock"); - } - }; - - lockMiddleware.handle( - job, - () -> { - atomicInteger.incrementAndGet(); - return null; - }); + LockMiddleware lockMiddleware = new LockMiddleware() { + @Override + public String acquireLock(Job job) { + return "test-lock"; + } + + @Override + public void releaseLock(Job job, String lockIdentifier) { + releaseLockCounter.incrementAndGet(); + assertEquals(lockIdentifier, "test-lock"); + } + }; + + lockMiddleware.handle(job, () -> { + atomicInteger.incrementAndGet(); + return null; + }); verifyNoInteractions(job); assertEquals(1, releaseLockCounter.get()); assertEquals(1, atomicInteger.get()); @@ -106,31 +100,28 @@ public void releaseLock(Job job, String lockIdentifier) { void handleLockIsNotAcquireReleaseIn() throws Exception { AtomicInteger atomicInteger = new AtomicInteger(); AtomicInteger releaseLockCounter = new AtomicInteger(); - LockMiddleware lockMiddleware = - new LockMiddleware() { - @Override - public String acquireLock(Job job) { - return null; - } - - @Override - public void releaseLock(Job job, String lockIdentifier) { - releaseLockCounter.incrementAndGet(); - assertNull(lockIdentifier); - } - - @Override - public Duration releaseIn(Job job) { - return Duration.ofMinutes(10); - } - }; - - lockMiddleware.handle( - job, - () -> { - atomicInteger.incrementAndGet(); - return null; - }); + LockMiddleware lockMiddleware = new LockMiddleware() { + @Override + public String acquireLock(Job job) { + return null; + } + + @Override + public void releaseLock(Job job, String lockIdentifier) { + releaseLockCounter.incrementAndGet(); + assertNull(lockIdentifier); + } + + @Override + public Duration releaseIn(Job job) { + return Duration.ofMinutes(10); + } + }; + + lockMiddleware.handle(job, () -> { + atomicInteger.incrementAndGet(); + return null; + }); verify(job, times(1)).release(JobStatus.FAILED, LockMiddleware.REASON, Duration.ofMinutes(10)); assertEquals(1, releaseLockCounter.get()); assertEquals(0, atomicInteger.get()); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/LoggingMiddlewareTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/LoggingMiddlewareTest.java index 78d33731..54cfdcd3 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/LoggingMiddlewareTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/LoggingMiddlewareTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -45,12 +45,10 @@ void handle() throws Exception { LoggingMiddleware loggingMiddleware = new LoggingMiddleware(); doReturn(RqueueMessageTestUtils.createMessage("test-queue")).when(job).getRqueueMessage(); AtomicInteger atomicInteger = new AtomicInteger(); - loggingMiddleware.handle( - job, - () -> { - atomicInteger.incrementAndGet(); - return null; - }); + loggingMiddleware.handle(job, () -> { + atomicInteger.incrementAndGet(); + return null; + }); assertEquals(1, atomicInteger.get()); } } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/RedisLockMiddlewareTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/RedisLockMiddlewareTest.java index 82784461..add47109 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/RedisLockMiddlewareTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/middleware/RedisLockMiddlewareTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -46,8 +46,10 @@ class RedisLockMiddlewareTest extends TestBase { private final QueueDetail queueDetail = TestUtils.createQueueDetail("test-queue"); private final String key = "job-xxx"; private final ExecutorService executor = Executors.newSingleThreadExecutor(); + @Mock private Job job; + @Mock private RqueueRedisTemplate redisTemplate; @@ -60,67 +62,58 @@ public void init() { @Test void handleLockCouldNotAcquireLock() throws Exception { doReturn(queueDetail).when(job).getQueueDetail(); - RedisLockMiddleware lockMiddleware = - new RedisLockMiddleware(redisTemplate) { - @Override - protected String getLockIdentifier(Job job) { - return job.getId(); - } - }; + RedisLockMiddleware lockMiddleware = new RedisLockMiddleware(redisTemplate) { + @Override + protected String getLockIdentifier(Job job) { + return job.getId(); + } + }; doReturn(false).when(redisTemplate).setIfAbsent(key, "1", queueDetail.visibilityDuration()); - lockMiddleware.handle( - job, - () -> { - fail("lock is acquired"); - return null; - }); + lockMiddleware.handle(job, () -> { + fail("lock is acquired"); + return null; + }); verify(redisTemplate, times(0)).delete(key); } @Test void handleAcquireLock() throws Exception { doReturn(queueDetail).when(job).getQueueDetail(); - RedisLockMiddleware lockMiddleware = - new RedisLockMiddleware(redisTemplate) { - @Override - protected String getLockIdentifier(Job job) { - return job.getId(); - } - }; + RedisLockMiddleware lockMiddleware = new RedisLockMiddleware(redisTemplate) { + @Override + protected String getLockIdentifier(Job job) { + return job.getId(); + } + }; doReturn(true).when(redisTemplate).setIfAbsent(key, "1", queueDetail.visibilityDuration()); AtomicInteger atomicInteger = new AtomicInteger(); - lockMiddleware.handle( - job, - () -> { - atomicInteger.incrementAndGet(); - return null; - }); + lockMiddleware.handle(job, () -> { + atomicInteger.incrementAndGet(); + return null; + }); verify(redisTemplate, times(1)).delete(key); assertEquals(1, atomicInteger.get()); } @Test void lockCouldNotAcquiredWithDifferentReleaseTime() throws Exception { - RedisLockMiddleware lockMiddleware = - new RedisLockMiddleware(redisTemplate) { - @Override - protected String getLockIdentifier(Job job) { - return job.getId(); - } + RedisLockMiddleware lockMiddleware = new RedisLockMiddleware(redisTemplate) { + @Override + protected String getLockIdentifier(Job job) { + return job.getId(); + } - @Override - protected Duration getLockDuration(Job job) { - return Duration.ofSeconds(5); - } - }; + @Override + protected Duration getLockDuration(Job job) { + return Duration.ofSeconds(5); + } + }; doReturn(true).when(redisTemplate).setIfAbsent(key, "1", Duration.ofSeconds(5)); AtomicInteger atomicInteger = new AtomicInteger(); - lockMiddleware.handle( - job, - () -> { - atomicInteger.incrementAndGet(); - return null; - }); + lockMiddleware.handle(job, () -> { + atomicInteger.incrementAndGet(); + return null; + }); verify(redisTemplate, times(1)).delete(key); assertEquals(1, atomicInteger.get()); } @@ -132,15 +125,13 @@ void handleAcquireLockMultipleJobs() throws Exception { AtomicInteger lockCounter = new AtomicInteger(); doReturn(queueDetail).when(job).getQueueDetail(); - RedisLockMiddleware lockMiddleware = - new RedisLockMiddleware(redisTemplate) { - @Override - protected String getLockIdentifier(Job job) { - return job.getId(); - } - }; - doAnswer( - invocation -> { + RedisLockMiddleware lockMiddleware = new RedisLockMiddleware(redisTemplate) { + @Override + protected String getLockIdentifier(Job job) { + return job.getId(); + } + }; + doAnswer(invocation -> { int val = lockCounter.incrementAndGet(); if (val == 1) { return Boolean.TRUE; @@ -149,29 +140,23 @@ protected String getLockIdentifier(Job job) { }) .when(redisTemplate) .setIfAbsent(key, "1", queueDetail.visibilityDuration()); - lockMiddleware.handle( - job, - () -> { - executor.submit( - () -> { - atomicInteger.incrementAndGet(); - TimeoutUtils.sleep(5 * Constants.ONE_MILLI); - terminationCounter.incrementAndGet(); - }); - return null; - }); + lockMiddleware.handle(job, () -> { + executor.submit(() -> { + atomicInteger.incrementAndGet(); + TimeoutUtils.sleep(5 * Constants.ONE_MILLI); + terminationCounter.incrementAndGet(); + }); + return null; + }); - lockMiddleware.handle( - job, - () -> { - executor.submit( - () -> { - atomicInteger.incrementAndGet(); - TimeoutUtils.sleep(5 * Constants.ONE_MILLI); - terminationCounter.incrementAndGet(); - }); - return null; - }); + lockMiddleware.handle(job, () -> { + executor.submit(() -> { + atomicInteger.incrementAndGet(); + TimeoutUtils.sleep(5 * Constants.ONE_MILLI); + terminationCounter.incrementAndGet(); + }); + return null; + }); TimeoutUtils.waitFor(() -> lockCounter.get() == 2, "both lock method to be called"); TimeoutUtils.waitFor(() -> atomicInteger.get() >= 1, "method to be executed"); TimeoutUtils.waitFor(() -> terminationCounter.get() >= 1, "handler to terminate"); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/support/RqueueMessageUtilsTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/support/RqueueMessageUtilsTest.java index 7071dfed..6550da3d 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/support/RqueueMessageUtilsTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/core/support/RqueueMessageUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -46,25 +46,21 @@ class RqueueMessageUtilsTest extends TestBase { private final String queue = "test-queue"; DefaultRqueueMessageConverter messageConverter = new DefaultRqueueMessageConverter(); DefaultRqueueMessageConverter messageConverter2 = - new DefaultRqueueMessageConverter( - ImmutableList.of( - new GenericMessageConverter(), - new StringMessageConverter(), - new NoMessageConverter())); + new DefaultRqueueMessageConverter(ImmutableList.of( + new GenericMessageConverter(), new StringMessageConverter(), new NoMessageConverter())); @Test void buildPeriodicMessage() { Email email = Email.newInstance(); long startTime = System.currentTimeMillis(); - RqueueMessage message = - RqueueMessageUtils.buildPeriodicMessage( - messageConverter, - queue, - null, - email, - null, - 10_000L, - RqueueMessageHeaders.emptyMessageHeaders()); + RqueueMessage message = RqueueMessageUtils.buildPeriodicMessage( + messageConverter, + queue, + null, + email, + null, + 10_000L, + RqueueMessageHeaders.emptyMessageHeaders()); assertEquals(10_000L, message.getPeriod()); long now = System.currentTimeMillis(); assertTrue( @@ -73,11 +69,9 @@ void buildPeriodicMessage() { assertEquals(0, message.getQueuedTime()); assertNotNull(message.getId()); assertNotNull(message.getMessage()); - String convertedMessage = - (String) - messageConverter - .toMessage(email, RqueueMessageHeaders.emptyMessageHeaders(), null) - .getPayload(); + String convertedMessage = (String) messageConverter + .toMessage(email, RqueueMessageHeaders.emptyMessageHeaders(), null) + .getPayload(); assertEquals(convertedMessage, message.getMessage()); } @@ -86,15 +80,14 @@ void buildMessage() { Email email = Email.newInstance(); long startTime = System.currentTimeMillis(); long startTimeInNano = System.nanoTime(); - RqueueMessage message = - RqueueMessageUtils.buildMessage( - messageConverter, - queue, - null, - email, - null, - null, - RqueueMessageHeaders.emptyMessageHeaders()); + RqueueMessage message = RqueueMessageUtils.buildMessage( + messageConverter, + queue, + null, + email, + null, + null, + RqueueMessageHeaders.emptyMessageHeaders()); assertEquals(0, message.getPeriod()); long now = System.currentTimeMillis(); long nowNano = System.nanoTime(); @@ -105,11 +98,9 @@ void buildMessage() { assertNotNull(message.getMessage()); assertNull(message.getRetryCount()); assertEquals(0, message.getFailureCount()); - String convertedMessage = - (String) - messageConverter - .toMessage(email, RqueueMessageHeaders.emptyMessageHeaders(), null) - .getPayload(); + String convertedMessage = (String) messageConverter + .toMessage(email, RqueueMessageHeaders.emptyMessageHeaders(), null) + .getPayload(); assertEquals(convertedMessage, message.getMessage()); } @@ -118,15 +109,14 @@ void buildMessageWithDelay() { Email email = Email.newInstance(); long startTime = System.currentTimeMillis(); long startTimeInNano = System.nanoTime(); - RqueueMessage message = - RqueueMessageUtils.buildMessage( - messageConverter, - queue, - null, - email, - 3, - 10_000L, - RqueueMessageHeaders.emptyMessageHeaders()); + RqueueMessage message = RqueueMessageUtils.buildMessage( + messageConverter, + queue, + null, + email, + 3, + 10_000L, + RqueueMessageHeaders.emptyMessageHeaders()); assertEquals(0, message.getPeriod()); long now = System.currentTimeMillis(); long nowNano = System.nanoTime(); @@ -138,11 +128,9 @@ void buildMessageWithDelay() { assertNotNull(message.getMessage()); assertEquals(3, message.getRetryCount()); assertEquals(0, message.getFailureCount()); - String convertedMessage = - (String) - messageConverter - .toMessage(email, RqueueMessageHeaders.emptyMessageHeaders(), null) - .getPayload(); + String convertedMessage = (String) messageConverter + .toMessage(email, RqueueMessageHeaders.emptyMessageHeaders(), null) + .getPayload(); assertEquals(convertedMessage, message.getMessage()); } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/dao/RqueueQStatsDaoTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/dao/RqueueQStatsDaoTest.java index 33ce18a0..9448269f 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/dao/RqueueQStatsDaoTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/dao/RqueueQStatsDaoTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -46,8 +46,10 @@ class RqueueQStatsDaoTest extends TestBase { @Mock private RqueueRedisTemplate rqueueRedisTemplate; + @Mock private RqueueConfig rqueueConfig; + private RqueueQStatsDao rqueueQStatsDao; @BeforeEach @@ -58,8 +60,7 @@ public void init() { @Test void findById() { - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-stat::" + name; }) @@ -75,17 +76,15 @@ void findById() { @Test void findAll() { - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-stat::" + name; }) .when(rqueueConfig) .getQueueStatisticsKey(anyString()); - List keys = - Arrays.asList( - rqueueConfig.getQueueStatisticsKey("job"), - rqueueConfig.getQueueStatisticsKey("notification")); + List keys = Arrays.asList( + rqueueConfig.getQueueStatisticsKey("job"), + rqueueConfig.getQueueStatisticsKey("notification")); QueueStatistics queueStatistics = new QueueStatistics(); doReturn(Arrays.asList(null, queueStatistics)).when(rqueueRedisTemplate).mget(keys); assertEquals(Collections.singletonList(queueStatistics), rqueueQStatsDao.findAll(keys)); @@ -104,8 +103,7 @@ void saveNull() { @Test void save() { - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-stat::" + name; }) diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/dao/RqueueSystemConfigDaoTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/dao/RqueueSystemConfigDaoTest.java index 78200808..dac40e38 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/dao/RqueueSystemConfigDaoTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/dao/RqueueSystemConfigDaoTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -49,10 +49,13 @@ class RqueueSystemConfigDaoTest extends TestBase { private final String queueName = "job"; private final String configKey = TestUtils.getQueueConfigKey(queueName); private final QueueConfig queueConfig = TestUtils.createQueueConfig(queueName); + @Mock private RqueueRedisTemplate rqueueRedisTemplate; + @Mock private RqueueConfig rqueueConfig; + private RqueueSystemConfigDao rqueueSystemConfigDao; @BeforeEach @@ -82,9 +85,8 @@ void getQConfig() { @Test void findAllQConfig() { - List keys = - Arrays.asList( - TestUtils.getQueueConfigKey(queueName), TestUtils.getQueueConfigKey("notification")); + List keys = Arrays.asList( + TestUtils.getQueueConfigKey(queueName), TestUtils.getQueueConfigKey("notification")); doReturn(Arrays.asList(queueConfig, null)).when(rqueueRedisTemplate).mget(keys); assertEquals( Collections.singletonList(queueConfig), rqueueSystemConfigDao.findAllQConfig(keys)); @@ -93,8 +95,7 @@ void findAllQConfig() { @Test void saveAllQConfig() { QueueConfig queueConfig2 = TestUtils.createQueueConfig("notification"); - doAnswer( - invocation -> { + doAnswer(invocation -> { Map configMap = new HashMap<>(); configMap.put(queueConfig.getId(), queueConfig); configMap.put(queueConfig2.getId(), queueConfig2); @@ -134,8 +135,7 @@ void saveShouldClearCache() { doReturn(queueConfig).when(rqueueRedisTemplate).get(configKey); rqueueSystemConfigDao.getQConfig(configKey, false); QueueConfig updatedConfig = queueConfig.toBuilder().paused(true).build(); - doAnswer( - invocation -> { + doAnswer(invocation -> { Map configMap = new HashMap<>(); configMap.put(updatedConfig.getId(), updatedConfig); assertEquals(configMap, invocation.getArgument(0)); @@ -153,8 +153,7 @@ void saveAllShouldClearCache() { doReturn(queueConfig).when(rqueueRedisTemplate).get(configKey); rqueueSystemConfigDao.getQConfig(configKey, false); QueueConfig updatedConfig = queueConfig.toBuilder().paused(true).build(); - doAnswer( - invocation -> { + doAnswer(invocation -> { Map configMap = new HashMap<>(); configMap.put(updatedConfig.getId(), updatedConfig); assertEquals(configMap, invocation.getArgument(0)); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/ConcurrentListenerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/ConcurrentListenerTest.java index 2e32589c..539832ec 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/ConcurrentListenerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/ConcurrentListenerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -65,22 +65,31 @@ class ConcurrentListenerTest extends TestBase { private static final String fastProcessingQueueChannel = "rqueue-processing-channel::" + fastQueue; private static final long executionTime = 50L; + @Mock private RqueueMessageHandler rqueueMessageHandler; + @Mock private RedisConnectionFactory redisConnectionFactory; + @Mock private ApplicationEventPublisher applicationEventPublisher; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + @Mock private RqueueLockManager rqueueLockManager; + @Mock private RqueueWebConfig rqueueWebConfig; + private RqueueBeanProvider beanProvider; @BeforeEach @@ -120,22 +129,19 @@ void validateConcurrency() throws Exception { AtomicInteger pollCounter = new AtomicInteger(0); Map messageMetadataMap = new HashMap<>(); doReturn(true).when(rqueueLockManager).acquireLock(anyString(), anyString(), any()); - doAnswer( - i -> { + doAnswer(i -> { RqueueMessage rqueueMessage = i.getArgument(0); - MessageMetadata messageMetadata = new MessageMetadata(rqueueMessage, - MessageStatus.ENQUEUED); + MessageMetadata messageMetadata = + new MessageMetadata(rqueueMessage, MessageStatus.ENQUEUED); messageMetadataMap.put(messageMetadata.getId(), messageMetadata); return messageMetadata; }) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); - doAnswer( - i -> messageMetadataMap.get(i.getArgument(0))) + doAnswer(i -> messageMetadataMap.get(i.getArgument(0))) .when(rqueueMessageMetadataService) .get(any()); - doAnswer( - invocation -> { + doAnswer(invocation -> { if (1 == pollCounter.incrementAndGet()) { firstCallAt.set(System.currentTimeMillis()); } @@ -143,14 +149,13 @@ void validateConcurrency() throws Exception { List rqueueMessageList = new LinkedList<>(); for (int i = 0; i < count; i++) { int id = producerMessageCounter.incrementAndGet(); - RqueueMessage rqueueMessage = - RqueueMessage.builder() - .message("Message ::" + id + "::" + i) - .id(UUID.randomUUID().toString()) - .queueName(fastQueue) - .processAt(System.currentTimeMillis()) - .queuedTime(System.currentTimeMillis()) - .build(); + RqueueMessage rqueueMessage = RqueueMessage.builder() + .message("Message ::" + id + "::" + i) + .id(UUID.randomUUID().toString()) + .queueName(fastQueue) + .processAt(System.currentTimeMillis()) + .queuedTime(System.currentTimeMillis()) + .build(); rqueueMessageList.add(rqueueMessage); } lastCalledAt.set(System.currentTimeMillis()); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/HardStrictPriorityPollerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/HardStrictPriorityPollerTest.java index 7a58721c..5d9e0396 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/HardStrictPriorityPollerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/HardStrictPriorityPollerTest.java @@ -33,9 +33,14 @@ @CoreUnitTest class HardStrictPriorityPollerTest extends TestBase { - @Mock private RqueueBeanProvider rqueueBeanProvider; - @Mock private QueueStateMgr queueStateMgr; - @Mock private PostProcessingHandler postProcessingHandler; + @Mock + private RqueueBeanProvider rqueueBeanProvider; + + @Mock + private QueueStateMgr queueStateMgr; + + @Mock + private PostProcessingHandler postProcessingHandler; private final String highPriorityQueue = "high-priority-" + UUID.randomUUID(); private final String lowPriorityQueue = "low-priority-" + UUID.randomUUID(); @@ -55,20 +60,18 @@ public void setUp() { queueNameToThread.put(highPriorityQueue, mock(QueueThreadPool.class)); queueNameToThread.put(lowPriorityQueue, mock(QueueThreadPool.class)); - poller = - spy( - new HardStrictPriorityPoller( - "test-group", - queueDetails, - queueNameToThread, - rqueueBeanProvider, - queueStateMgr, - Collections.emptyList(), - 50L, - 50L, - postProcessingHandler, - new MessageHeaders(Collections.emptyMap()), - new HardStrictPriorityPollerProperties())); + poller = spy(new HardStrictPriorityPoller( + "test-group", + queueDetails, + queueNameToThread, + rqueueBeanProvider, + queueStateMgr, + Collections.emptyList(), + 50L, + 50L, + postProcessingHandler, + new MessageHeaders(Collections.emptyMap()), + new HardStrictPriorityPollerProperties())); // Allowing queue polling lenient().doReturn(true).when(poller).eligibleForPolling(anyString()); @@ -114,22 +117,20 @@ void testStrictExecutionPreventsLowPriorityPoll() throws Exception { // High Priority always has messages lenient().doReturn(true).when(poller).existAvailableMessagesForPoll(highDetail); lenient() - .doAnswer( - invocation -> { - highQueuePollCount.incrementAndGet(); - return 1; - }) + .doAnswer(invocation -> { + highQueuePollCount.incrementAndGet(); + return 1; + }) .when(poller) .poll(anyInt(), eq(highPriorityQueue), eq(highDetail), any()); // Low Priority also has messages lenient().doReturn(true).when(poller).existAvailableMessagesForPoll(lowDetail); lenient() - .doAnswer( - invocation -> { - lowQueuePollCount.incrementAndGet(); - return 1; - }) + .doAnswer(invocation -> { + lowQueuePollCount.incrementAndGet(); + return 1; + }) .when(poller) .poll(anyInt(), eq(lowPriorityQueue), eq(lowDetail), any()); @@ -157,11 +158,10 @@ void testLowPriorityIsPolledWhenHighIsEmpty() throws Exception { // Low has messages lenient().doReturn(true).when(poller).existAvailableMessagesForPoll(lowDetail); lenient() - .doAnswer( - invocation -> { - lowQueuePollCount.incrementAndGet(); - return 1; - }) + .doAnswer(invocation -> { + lowQueuePollCount.incrementAndGet(); + return 1; + }) .when(poller) .poll(anyInt(), eq(lowPriorityQueue), eq(lowDetail), any()); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/JobImplTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/JobImplTest.java index 1e8add28..3f23abf5 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/JobImplTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/JobImplTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2025 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -72,11 +72,22 @@ class JobImplTest extends TestBase { private final MessageMetadata messageMetadata = new MessageMetadata(rqueueMessage, MessageStatus.PROCESSING); private final Object userMessage = "Test Object"; - @Mock private RedisConnectionFactory redisConnectionFactory; - @Mock private RqueueMessageMetadataService messageMetadataService; - @Mock private RqueueJobDao rqueueJobDao; - @Mock private RqueueMessageTemplate rqueueMessageTemplate; - @Mock private RqueueLockManager rqueueLockManager; + + @Mock + private RedisConnectionFactory redisConnectionFactory; + + @Mock + private RqueueMessageMetadataService messageMetadataService; + + @Mock + private RqueueJobDao rqueueJobDao; + + @Mock + private RqueueMessageTemplate rqueueMessageTemplate; + + @Mock + private RqueueLockManager rqueueLockManager; + private RqueueConfig rqueueConfig; @BeforeEach @@ -196,7 +207,8 @@ void updateMessageStatus() { assertEquals(MessageStatus.PROCESSING, job.getMessageMetadata().getStatus()); assertEquals(JobStatus.PROCESSING, job.getStatus()); verify(rqueueJobDao, times(1)).createJob(any(RqueueJob.class), any(Duration.class)); - verify(messageMetadataService, times(1)).save(any(MessageMetadata.class), any(Duration.class), anyBoolean()); + verify(messageMetadataService, times(1)) + .save(any(MessageMetadata.class), any(Duration.class), anyBoolean()); verify(rqueueJobDao, times(1)).save(any(), any()); } @@ -318,13 +330,12 @@ void testMessageWasDeletedWhileRunning() throws IllegalAccessException { job.updateMessageStatus(MessageStatus.FAILED); verify(rqueueJobDao, times(1)).createJob(any(), any()); verify(rqueueJobDao, times(2)).save(any(), any()); - doAnswer( - invocation -> { - MessageMetadata messageMetadata = invocation.getArgument(0); - assertTrue(messageMetadata.isDeleted()); - assertEquals(MessageStatus.DELETED, messageMetadata.getStatus()); - return null; - }) + doAnswer(invocation -> { + MessageMetadata messageMetadata = invocation.getArgument(0); + assertTrue(messageMetadata.isDeleted()); + assertEquals(MessageStatus.DELETED, messageMetadata.getStatus()); + return null; + }) .when(messageMetadataService) .save( any(MessageMetadata.class), diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/MappingInformationTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/MappingInformationTest.java index a868581b..c8dc0f30 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/MappingInformationTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/MappingInformationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -30,76 +30,71 @@ class MappingInformationTest extends TestBase { @Test void testToString() { - MappingInformation mappingInformation = - MappingInformation.builder() - .queueNames(Collections.singleton("test-queue")) - .active(true) - .build(); + MappingInformation mappingInformation = MappingInformation.builder() + .queueNames(Collections.singleton("test-queue")) + .active(true) + .build(); assertEquals("test-queue", mappingInformation.toString()); } @Test void isValidNoQueue() { - MappingInformation mappingInformation = - MappingInformation.builder().active(true).queueNames(Collections.emptySet()).build(); + MappingInformation mappingInformation = MappingInformation.builder() + .active(true) + .queueNames(Collections.emptySet()) + .build(); assertFalse(mappingInformation.isValid()); } @Test void isValidInvalidVisibilityTimeout() { - MappingInformation mappingInformation = - MappingInformation.builder() - .active(true) - .queueNames(Collections.emptySet()) - .visibilityTimeout(100) - .build(); + MappingInformation mappingInformation = MappingInformation.builder() + .active(true) + .queueNames(Collections.emptySet()) + .visibilityTimeout(100) + .build(); assertFalse(mappingInformation.isValid()); } @Test void isValid() { - MappingInformation mappingInformation = - MappingInformation.builder() - .active(true) - .queueNames(Collections.singleton("test")) - .visibilityTimeout(1101) - .build(); + MappingInformation mappingInformation = MappingInformation.builder() + .active(true) + .queueNames(Collections.singleton("test")) + .visibilityTimeout(1101) + .build(); assertTrue(mappingInformation.isValid()); } @Test void equality() { - MappingInformation mappingInformation = - MappingInformation.builder() - .active(true) - .queueNames(Collections.singleton("test")) - .visibilityTimeout(1101) - .build(); + MappingInformation mappingInformation = MappingInformation.builder() + .active(true) + .queueNames(Collections.singleton("test")) + .visibilityTimeout(1101) + .build(); - MappingInformation mappingInformation1 = - MappingInformation.builder() - .active(false) - .queueNames(Collections.singleton("test")) - .visibilityTimeout(1201) - .build(); + MappingInformation mappingInformation1 = MappingInformation.builder() + .active(false) + .queueNames(Collections.singleton("test")) + .visibilityTimeout(1201) + .build(); assertEquals(mappingInformation, mappingInformation1); } @Test void compare() { - MappingInformation mappingInformation = - MappingInformation.builder() - .active(true) - .queueNames(Collections.singleton("test")) - .visibilityTimeout(1101) - .build(); + MappingInformation mappingInformation = MappingInformation.builder() + .active(true) + .queueNames(Collections.singleton("test")) + .visibilityTimeout(1101) + .build(); - MappingInformation mappingInformation1 = - MappingInformation.builder() - .active(false) - .queueNames(Collections.singleton("test")) - .visibilityTimeout(1201) - .build(); + MappingInformation mappingInformation1 = MappingInformation.builder() + .active(false) + .queueNames(Collections.singleton("test")) + .visibilityTimeout(1201) + .build(); assertEquals(0, mappingInformation.compareTo(mappingInformation1)); } } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/PriorityGroupListenerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/PriorityGroupListenerTest.java index 56a64944..543ff927 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/PriorityGroupListenerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/PriorityGroupListenerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -63,18 +63,25 @@ class PriorityGroupListenerTest extends TestBase { private static final String fastProcessingQueueChannel = "rqueue-processing-channel::" + fastQueue; private static final long VISIBILITY_TIMEOUT = 900000L; + @Mock private RqueueMessageHandler rqueueMessageHandler; + @Mock private RedisConnectionFactory redisConnectionFactory; + @Mock private ApplicationEventPublisher applicationEventPublisher; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + private RqueueBeanProvider beanProvider; @BeforeEach @@ -123,17 +130,15 @@ void priorityGroupListener() throws Exception { TestTaskExecutor taskExecutor = new TestTaskExecutor(); taskExecutor.afterPropertiesSet(); AtomicInteger fastQueueCounter = new AtomicInteger(0); - doAnswer( - invocation -> { + doAnswer(invocation -> { fastQueueCounter.incrementAndGet(); - return Collections.singletonList( - RqueueMessage.builder() - .queueName(fastQueue) - .message("fastQueueMessage") - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .id(UUID.randomUUID().toString()) - .build()); + return Collections.singletonList(RqueueMessage.builder() + .queueName(fastQueue) + .message("fastQueueMessage") + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .id(UUID.randomUUID().toString()) + .build()); }) .when(rqueueMessageTemplate) .pop(fastQueue, fastProcessingQueue, fastProcessingQueueChannel, VISIBILITY_TIMEOUT, 1); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/QueueDetailTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/QueueDetailTest.java index ee24f722..ad3f0953 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/QueueDetailTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/QueueDetailTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -16,16 +16,16 @@ package com.github.sonus21.rqueue.listener; +import static org.junit.jupiter.api.Assertions.*; + import com.github.sonus21.TestBase; import com.github.sonus21.rqueue.CoreUnitTest; import com.github.sonus21.rqueue.models.db.DeadLetterQueue; import com.github.sonus21.rqueue.models.db.QueueConfig; import com.github.sonus21.rqueue.utils.Constants; import com.github.sonus21.rqueue.utils.TestUtils; -import org.junit.jupiter.api.Test; import java.util.*; - -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; @CoreUnitTest class QueueDetailTest extends TestBase { @@ -41,21 +41,20 @@ void isDlqSet() { @Test void toConfig() { QueueDetail queueDetail = TestUtils.createQueueDetail("test"); - QueueConfig expectedConfig = - QueueConfig.builder() - .name(queueDetail.getName()) - .numRetry(queueDetail.getNumRetry()) - .queueName(queueDetail.getQueueName()) - .scheduledQueueName(queueDetail.getScheduledQueueName()) - .completedQueueName(queueDetail.getCompletedQueueName()) - .processingQueueName(queueDetail.getProcessingQueueName()) - .visibilityTimeout(queueDetail.getVisibilityTimeout()) - .deadLetterQueues(new LinkedList<>()) - .concurrency(queueDetail.getConcurrency().toMinMax()) - .priority(queueDetail.getPriority()) - .priorityGroup(queueDetail.getPriorityGroup()) - .systemGenerated(queueDetail.isSystemGenerated()) - .build(); + QueueConfig expectedConfig = QueueConfig.builder() + .name(queueDetail.getName()) + .numRetry(queueDetail.getNumRetry()) + .queueName(queueDetail.getQueueName()) + .scheduledQueueName(queueDetail.getScheduledQueueName()) + .completedQueueName(queueDetail.getCompletedQueueName()) + .processingQueueName(queueDetail.getProcessingQueueName()) + .visibilityTimeout(queueDetail.getVisibilityTimeout()) + .deadLetterQueues(new LinkedList<>()) + .concurrency(queueDetail.getConcurrency().toMinMax()) + .priority(queueDetail.getPriority()) + .priorityGroup(queueDetail.getPriorityGroup()) + .systemGenerated(queueDetail.isSystemGenerated()) + .build(); QueueConfig queueConfig = queueDetail.toConfig(); assertNotNull(queueConfig.getUpdatedOn()); @@ -81,41 +80,39 @@ void expandQueueDetail() { QueueDetail queueDetail = TestUtils.createQueueDetail("test", priority, 3, 1000L, null); List queueDetails = queueDetail.expandQueueDetail(true, -1); priority.put(Constants.DEFAULT_PRIORITY_KEY, 5); - QueueDetail queueDetail2 = - QueueDetail.builder() - .name(queueDetail.getName() + "_critical") - .numRetry(queueDetail.getNumRetry()) - .queueName(queueDetail.getQueueName() + "_critical") - .scheduledQueueName(queueDetail.getScheduledQueueName() + "_critical") - .completedQueueName(queueDetail.getCompletedQueueName() + "_critical") - .scheduledQueueChannelName(queueDetail.getScheduledQueueChannelName() + "_critical") - .processingQueueName(queueDetail.getProcessingQueueName() + "_critical") - .processingQueueChannelName(queueDetail.getProcessingQueueChannelName() + "_critical") - .visibilityTimeout(queueDetail.getVisibilityTimeout()) - .concurrency(queueDetail.getConcurrency()) - .priority(Collections.singletonMap(Constants.DEFAULT_PRIORITY_KEY, 10)) - .priorityGroup(queueDetail.getName()) - .active(true) - .systemGenerated(true) - .build(); + QueueDetail queueDetail2 = QueueDetail.builder() + .name(queueDetail.getName() + "_critical") + .numRetry(queueDetail.getNumRetry()) + .queueName(queueDetail.getQueueName() + "_critical") + .scheduledQueueName(queueDetail.getScheduledQueueName() + "_critical") + .completedQueueName(queueDetail.getCompletedQueueName() + "_critical") + .scheduledQueueChannelName(queueDetail.getScheduledQueueChannelName() + "_critical") + .processingQueueName(queueDetail.getProcessingQueueName() + "_critical") + .processingQueueChannelName(queueDetail.getProcessingQueueChannelName() + "_critical") + .visibilityTimeout(queueDetail.getVisibilityTimeout()) + .concurrency(queueDetail.getConcurrency()) + .priority(Collections.singletonMap(Constants.DEFAULT_PRIORITY_KEY, 10)) + .priorityGroup(queueDetail.getName()) + .active(true) + .systemGenerated(true) + .build(); - QueueDetail queueDetail3 = - QueueDetail.builder() - .name(queueDetail.getName() + "_high") - .numRetry(queueDetail.getNumRetry()) - .queueName(queueDetail.getQueueName() + "_high") - .completedQueueName(queueDetail.getCompletedQueueName() + "_high") - .scheduledQueueName(queueDetail.getScheduledQueueName() + "_high") - .scheduledQueueChannelName(queueDetail.getScheduledQueueChannelName() + "_high") - .processingQueueName(queueDetail.getProcessingQueueName() + "_high") - .processingQueueChannelName(queueDetail.getProcessingQueueChannelName() + "_high") - .visibilityTimeout(queueDetail.getVisibilityTimeout()) - .concurrency(queueDetail.getConcurrency()) - .priority(Collections.singletonMap(Constants.DEFAULT_PRIORITY_KEY, 5)) - .priorityGroup(queueDetail.getName()) - .systemGenerated(true) - .active(true) - .build(); + QueueDetail queueDetail3 = QueueDetail.builder() + .name(queueDetail.getName() + "_high") + .numRetry(queueDetail.getNumRetry()) + .queueName(queueDetail.getQueueName() + "_high") + .completedQueueName(queueDetail.getCompletedQueueName() + "_high") + .scheduledQueueName(queueDetail.getScheduledQueueName() + "_high") + .scheduledQueueChannelName(queueDetail.getScheduledQueueChannelName() + "_high") + .processingQueueName(queueDetail.getProcessingQueueName() + "_high") + .processingQueueChannelName(queueDetail.getProcessingQueueChannelName() + "_high") + .visibilityTimeout(queueDetail.getVisibilityTimeout()) + .concurrency(queueDetail.getConcurrency()) + .priority(Collections.singletonMap(Constants.DEFAULT_PRIORITY_KEY, 5)) + .priorityGroup(queueDetail.getName()) + .systemGenerated(true) + .active(true) + .build(); assertEquals(3, queueDetails.size()); assertEquals(queueDetail3, queueDetails.get(0)); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueExecutorTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueExecutorTest.java index 6efbf1ba..607f3eb4 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueExecutorTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueExecutorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -72,27 +72,37 @@ class RqueueExecutorTest extends TestBase { private final TaskExecutionBackOff taskBackOff = new FixedTaskExecutionBackOff(); private final String queueName = "test-queue"; private final Object payload = "test message"; + @Mock private RqueueLockManager rqueueLockManager; + @Mock private RqueueConfig rqueueConfig; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + @Mock private RqueueJobDao rqueueJobDao; @Mock private RqueueMessageHandler messageHandler; + @Mock private QueueStateMgr queueStateMgr; + @Mock private RqueueBeanProvider rqueueBeanProvider; + @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private RedisTemplate redisTemplate; + @Mock private ApplicationEventPublisher applicationEventPublisher; + @Mock private RqueueMessageTemplate messageTemplate; @@ -104,26 +114,24 @@ class RqueueExecutorTest extends TestBase { public void init() throws IllegalAccessException { MockitoAnnotations.openMocks(this); MessageConverter messageConverter = new GenericMessageConverter(); - rqueueMessage = - RqueueMessageUtils.buildMessage( - messageConverter, - queueName, - null, - payload, - null, - null, - RqueueMessageHeaders.emptyMessageHeaders()); + rqueueMessage = RqueueMessageUtils.buildMessage( + messageConverter, + queueName, + null, + payload, + null, + null, + RqueueMessageHeaders.emptyMessageHeaders()); defaultMessageMetadata = new MessageMetadata(rqueueMessage, MessageStatus.ENQUEUED); MessageProcessorHandler messageProcessorHandler = new MessageProcessorHandler(null, deadLetterProcessor, discardProcessor, null); - postProcessingHandler = - new PostProcessingHandler( - rqueueWebConfig, - applicationEventPublisher, - messageTemplate, - taskBackOff, - messageProcessorHandler, - rqueueSystemConfigDao); + postProcessingHandler = new PostProcessingHandler( + rqueueWebConfig, + applicationEventPublisher, + messageTemplate, + taskBackOff, + messageProcessorHandler, + rqueueSystemConfigDao); doReturn(rqueueMessageMetadataService) .when(rqueueBeanProvider) .getRqueueMessageMetadataService(); @@ -147,16 +155,17 @@ void callDiscardProcessor() { doReturn(defaultMessageMetadata) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any(RqueueMessage.class)); - doReturn(defaultMessageMetadata).when(rqueueMessageMetadataService) + doReturn(defaultMessageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - null, - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + null, + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); assertEquals(1, discardProcessor.getCount()); } @@ -173,19 +182,21 @@ void callDeadLetterProcessor() { doReturn(defaultMessageMetadata) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any(RqueueMessage.class)); - doReturn(defaultMessageMetadata).when(rqueueMessageMetadataService) + doReturn(defaultMessageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); - doReturn(Collections.emptyList()).when(redisTemplate) + doReturn(Collections.emptyList()) + .when(redisTemplate) .executePipelined(any(RedisCallback.class)); doReturn(3).when(rqueueConfig).getRetryPerPoll(); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - null, - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + null, + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); assertEquals(1, deadLetterProcessor.getCount()); } @@ -198,17 +209,18 @@ void messageIsParkedForRetry() { doReturn(defaultMessageMetadata) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any(RqueueMessage.class)); - doReturn(defaultMessageMetadata).when(rqueueMessageMetadataService) + doReturn(defaultMessageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); doThrow(new MessagingException("Failing on purpose")).when(messageHandler).handleMessage(any()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - null, - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + null, + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); verify(messageTemplate, times(1)) .moveMessageWithDelay( @@ -229,28 +241,27 @@ void messageIsNotExecutedWhenDeletedManually() { .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(eq(rqueueMessage)); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - null, - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + null, + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); verify(messageHandler, times(0)).handleMessage(any()); } @Test void messageIsDeletedWhileExecuting() { - doAnswer(i->i.getArgument(0)).when(rqueueConfig).getLockKey(anyString()); + doAnswer(i -> i.getArgument(0)).when(rqueueConfig).getLockKey(anyString()); doReturn(true).when(rqueueLockManager).acquireLock(anyString(), anyString(), any()); QueueDetail queueDetail = TestUtils.createQueueDetail(queueName); AtomicInteger atomicInteger = new AtomicInteger(0); doReturn(preProcessMessageProcessor).when(rqueueBeanProvider).getPreExecutionMessageProcessor(); MessageMetadata messageMetadata = new MessageMetadata(rqueueMessage, MessageStatus.ENQUEUED); doReturn(2).when(rqueueConfig).getRetryPerPoll(); - doAnswer( - invocation -> { + doAnswer(invocation -> { if (atomicInteger.get() < 2) { atomicInteger.incrementAndGet(); return messageMetadata; @@ -260,17 +271,18 @@ void messageIsDeletedWhileExecuting() { }) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(rqueueMessage); - doReturn(messageMetadata).when(rqueueMessageMetadataService) + doReturn(messageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); doThrow(new MessagingException("Failing on purpose")).when(messageHandler).handleMessage(any()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - null, - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + null, + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); verify(messageHandler, times(1)).handleMessage(any()); } @@ -284,13 +296,13 @@ void handleIgnoredMessage() { .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - null, - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + null, + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); verify(messageHandler, times(0)).handleMessage(any()); verify(messageTemplate, times(1)) @@ -299,40 +311,42 @@ void handleIgnoredMessage() { @Test void handlePeriodicMessage() { - doAnswer(i->i.getArgument(0)).when(rqueueConfig).getLockKey(anyString()); + doAnswer(i -> i.getArgument(0)).when(rqueueConfig).getLockKey(anyString()); doReturn(true).when(rqueueLockManager).acquireLock(anyString(), anyString(), any()); QueueDetail queueDetail = TestUtils.createQueueDetail(queueName); long period = 10000L; - RqueueMessage periodicMessage = - rqueueMessage.toBuilder().period(period).processAt(System.currentTimeMillis()).build(); + RqueueMessage periodicMessage = rqueueMessage.toBuilder() + .period(period) + .processAt(System.currentTimeMillis()) + .build(); RqueueMessage newMessage = periodicMessage.toBuilder().processAt(periodicMessage.nextProcessAt()).build(); - String messageKey = - "__rq::queue::" - + queueName - + Constants.REDIS_KEY_SEPARATOR - + periodicMessage.getId() - + Constants.REDIS_KEY_SEPARATOR - + "sch" - + Constants.REDIS_KEY_SEPARATOR - + newMessage.getProcessAt(); + String messageKey = "__rq::queue::" + + queueName + + Constants.REDIS_KEY_SEPARATOR + + periodicMessage.getId() + + Constants.REDIS_KEY_SEPARATOR + + "sch" + + Constants.REDIS_KEY_SEPARATOR + + newMessage.getProcessAt(); doReturn(1).when(rqueueConfig).getRetryPerPoll(); doReturn(preProcessMessageProcessor).when(rqueueBeanProvider).getPreExecutionMessageProcessor(); doReturn(messageTemplate).when(rqueueBeanProvider).getRqueueMessageTemplate(); doReturn(defaultMessageMetadata) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); - doReturn(defaultMessageMetadata).when(rqueueMessageMetadataService) + doReturn(defaultMessageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); doThrow(new MessagingException("Failing on purpose")).when(messageHandler).handleMessage(any()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - null, - postProcessingHandler, - periodicMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + null, + postProcessingHandler, + periodicMessage, + queueDetail, + queueThreadPool) .run(); verify(messageTemplate, times(1)) .scheduleMessage( diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessageHandlerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessageHandlerTest.java index 142ddf13..c5c7f032 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessageHandlerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessageHandlerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -373,9 +373,9 @@ void priorityResolverSingleValue() { @ParameterizedTest @CsvSource({ - "slowQueue1,-1,10-20,10", // default batch size 10 - "slowQueue2,-1,-1,1", // default batch size 1 no concurrency - "slowQueue3,20,10-20,20", // 20 with concurrency + "slowQueue1,-1,10-20,10", // default batch size 10 + "slowQueue2,-1,-1,1", // default batch size 1 no concurrency + "slowQueue3,20,10-20,20", // 20 with concurrency }) void batchSizeResolver( String queue, String batchSize, String concurrency, Integer expectedValue) { @@ -418,10 +418,10 @@ void multipleMessageHandlerWithDuplicateMapping() throws TimedOutException { @ParameterizedTest @CsvSource({ - "\"slowQueue,smartQueue1\",-3", // < 0 - "\"slowQueue,smartQueue2\",high", // number format error - "\"slowQueue,smartQueue3\",1,1,1", // multiple priority is used - "\"slowQueue,smartQueue4\",critical=10,high=high", // number format error + "\"slowQueue,smartQueue1\",-3", // < 0 + "\"slowQueue,smartQueue2\",high", // number format error + "\"slowQueue,smartQueue3\",1,1,1", // multiple priority is used + "\"slowQueue,smartQueue4\",critical=10,high=high", // number format error }) void priorityResolverInvalidValue(String queue, String priority) { StaticApplicationContext applicationContext = new StaticApplicationContext(); @@ -439,9 +439,9 @@ void priorityResolverInvalidValue(String queue, String priority) { @ParameterizedTest @CsvSource({ - "smartQueue3, \"\"", // empty value - "smartQueue4, xyz", // invalid value - "smartQueue4, 1345", // invalid value + "smartQueue3, \"\"", // empty value + "smartQueue4, xyz", // invalid value + "smartQueue4, 1345", // invalid value }) void activeInvalidValue(String queue, String active) { StaticApplicationContext applicationContext = new StaticApplicationContext(); @@ -460,10 +460,10 @@ void activeInvalidValue(String queue, String active) { @ParameterizedTest @CsvSource({ - "smartQueue1, -1", // < 9 - "smartQueue2, 9", // < 10 - "smartQueue3, high", // number format error - "smartQueue3, \"\"", // empty value + "smartQueue1, -1", // < 9 + "smartQueue2, 9", // < 10 + "smartQueue3, high", // number format error + "smartQueue3, \"\"", // empty value }) void visibilityInvalidValue(String queue, String visibilityTimeout) { StaticApplicationContext applicationContext = new StaticApplicationContext(); @@ -482,8 +482,8 @@ void visibilityInvalidValue(String queue, String visibilityTimeout) { @ParameterizedTest @CsvSource({ - "smartQueue3, high", // number format error - "smartQueue3, \"\"", // empty value + "smartQueue3, high", // number format error + "smartQueue3, \"\"", // empty value }) void numRetriesInvalidValue(String queue, String numRetries) { StaticApplicationContext applicationContext = new StaticApplicationContext(); @@ -501,8 +501,8 @@ void numRetriesInvalidValue(String queue, String numRetries) { @ParameterizedTest @CsvSource({ - "\"slowQueue{smartQueue1\",-3", - "\"slowQueue{smartQueue2\",100", + "\"slowQueue{smartQueue1\",-3", + "\"slowQueue{smartQueue2\",100", }) void queueInvalidValue(String queue, String priority) { StaticApplicationContext applicationContext = new StaticApplicationContext(); @@ -535,12 +535,12 @@ void duplicatePrimaryHandler() { @ParameterizedTest @CsvSource({ - "\"slowQueue,smartQueue1\",-3", // less than 1 is not allowed - "\"slowQueue,smartQueue2\",0", // less than 1 is not allowed - "\"slowQueue,smartQueue3\",foo", // number format error - "\"slowQueue,smartQueue4\", foo-bar", // number format error after split - "\"slowQueue,smartQueue5\", 10-5", // min > max - "\"slowQueue,smartQueue5\", \"\"", // empty concurrency + "\"slowQueue,smartQueue1\",-3", // less than 1 is not allowed + "\"slowQueue,smartQueue2\",0", // less than 1 is not allowed + "\"slowQueue,smartQueue3\",foo", // number format error + "\"slowQueue,smartQueue4\", foo-bar", // number format error after split + "\"slowQueue,smartQueue5\", 10-5", // min > max + "\"slowQueue,smartQueue5\", \"\"", // empty concurrency }) void concurrencyInvalidValue(String queue, String concurrency) { StaticApplicationContext applicationContext = new StaticApplicationContext(); @@ -558,8 +558,8 @@ void concurrencyInvalidValue(String queue, String concurrency) { @ParameterizedTest @CsvSource({ - "\"slowQueue,smartQueue1\",foo, 10-20", // number format error - "\"slowQueue,smartQueue1\",foo, \"\"", // empty value error + "\"slowQueue,smartQueue1\",foo, 10-20", // number format error + "\"slowQueue,smartQueue1\",foo, \"\"", // empty value error }) void batchSizeInvalidValue(String queue, String batchSize, String concurrency) { StaticApplicationContext applicationContext = new StaticApplicationContext(); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessageListenerContainerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessageListenerContainerTest.java index d1145f7f..34346d66 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessageListenerContainerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessageListenerContainerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -79,22 +79,31 @@ class RqueueMessageListenerContainerTest extends TestBase { private static final String fastProcessingQueueChannel = "rqueue-processing-channel::" + fastQueue; private static final long VISIBILITY_TIMEOUT = 900000L; + @Mock private RqueueMessageHandler rqueueMessageHandler; + @Mock private RedisConnectionFactory redisConnectionFactory; + @Mock private ApplicationEventPublisher applicationEventPublisher; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + @Mock private RqueueWebConfig rqueueWebConfig; + @Mock private RqueueLockManager rqueueLockManager; + private RqueueMessageListenerContainer container; private RqueueBeanProvider beanProvider; @@ -237,16 +246,14 @@ void messagesAreGettingFetchedFromRedis() throws Exception { AtomicInteger fastQueueCounter = new AtomicInteger(0); AtomicInteger slowQueueCounter = new AtomicInteger(0); - doAnswer( - invocation -> { + doAnswer(invocation -> { fastQueueCounter.incrementAndGet(); return null; }) .when(rqueueMessageTemplate) .pop(fastQueue, fastProcessingQueue, fastProcessingQueueChannel, VISIBILITY_TIMEOUT, 1); - doAnswer( - invocation -> { + doAnswer(invocation -> { slowQueueCounter.incrementAndGet(); return null; }) @@ -264,14 +271,13 @@ void messagesAreGettingFetchedFromRedis() throws Exception { void messageFetcherRetryWorking() throws Exception { AtomicInteger fastQueueCounter = new AtomicInteger(0); String fastQueueMessage = "This is fast queue"; - RqueueMessage message = - RqueueMessage.builder() - .id(UUID.randomUUID().toString()) - .queueName(fastQueue) - .message(fastQueueMessage) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .build(); + RqueueMessage message = RqueueMessage.builder() + .id(UUID.randomUUID().toString()) + .queueName(fastQueue) + .message(fastQueueMessage) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .build(); StaticApplicationContext applicationContext = new StaticApplicationContext(); applicationContext.registerSingleton("messageHandler", RqueueMessageHandler.class); applicationContext.registerSingleton("fastMessageListener", FastMessageListener.class); @@ -281,10 +287,10 @@ void messageFetcherRetryWorking() throws Exception { messageHandler.afterPropertiesSet(); Map messageMetadataMap = new ConcurrentHashMap<>(); doReturn(true).when(rqueueLockManager).acquireLock(anyString(), anyString(), any()); - doAnswer(i -> messageMetadataMap.get(i.getArgument(0))).when(rqueueMessageMetadataService) + doAnswer(i -> messageMetadataMap.get(i.getArgument(0))) + .when(rqueueMessageMetadataService) .get(any()); - doAnswer( - i -> { + doAnswer(i -> { RqueueMessage rqueueMessage = i.getArgument(0); MessageMetadata messageMetadata = new MessageMetadata(rqueueMessage, MessageStatus.ENQUEUED); @@ -297,8 +303,7 @@ void messageFetcherRetryWorking() throws Exception { beanProvider.setRqueueMessageHandler(messageHandler); RqueueMessageListenerContainer container = new TestListenerContainer(messageHandler); - doAnswer( - invocation -> { + doAnswer(invocation -> { if (fastQueueCounter.get() < 2) { if (fastQueueCounter.incrementAndGet() == 1) { throw new RedisCommandExecutionException("Some error occurred"); @@ -343,8 +348,7 @@ void messageHandlersAreInvoked() throws Exception { String fastQueueMessage = "This is fast queue"; String slowQueueMessage = "This is slow queue"; Map messageMetadataMap = new ConcurrentHashMap<>(); - doAnswer( - i -> { + doAnswer(i -> { RqueueMessage rqueueMessage = i.getArgument(0); MessageMetadata messageMetadata = new MessageMetadata(rqueueMessage, MessageStatus.ENQUEUED); @@ -353,38 +357,35 @@ void messageHandlersAreInvoked() throws Exception { }) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); - doAnswer(i -> messageMetadataMap.get(i.getArgument(0))).when(rqueueMessageMetadataService) + doAnswer(i -> messageMetadataMap.get(i.getArgument(0))) + .when(rqueueMessageMetadataService) .get(any()); - doAnswer( - invocation -> { + doAnswer(invocation -> { if (slowQueueCounter.get() == 0) { slowQueueCounter.incrementAndGet(); - return Collections.singletonList( - RqueueMessage.builder() - .queueName(slowQueue) - .message(slowQueueMessage) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .id(UUID.randomUUID().toString()) - .build()); + return Collections.singletonList(RqueueMessage.builder() + .queueName(slowQueue) + .message(slowQueueMessage) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .id(UUID.randomUUID().toString()) + .build()); } return null; }) .when(rqueueMessageTemplate) .pop(slowQueue, slowProcessingQueue, slowProcessingChannel, VISIBILITY_TIMEOUT, 1); - doAnswer( - invocation -> { + doAnswer(invocation -> { if (fastQueueCounter.get() == 0) { fastQueueCounter.incrementAndGet(); - return Collections.singletonList( - RqueueMessage.builder() - .queueName(fastQueue) - .message(fastQueueMessage) - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .id(UUID.randomUUID().toString()) - .build()); + return Collections.singletonList(RqueueMessage.builder() + .queueName(fastQueue) + .message(fastQueueMessage) + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .id(UUID.randomUUID().toString()) + .build()); } return null; }) @@ -522,8 +523,7 @@ public void publishEvent(ApplicationEvent event) { } @Override - public void publishEvent(Object event) { - } + public void publishEvent(Object event) {} } private class TestListenerContainer extends RqueueMessageListenerContainer { diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessagePollerTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessagePollerTest.java index 7e8325ab..5958a49a 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessagePollerTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMessagePollerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -25,6 +25,5 @@ class RqueueMessagePollerTest extends TestBase { // DefaultRqueuePoller poller = new DefaultRqueuePoller(); @BeforeEach - void setUp() { - } + void setUp() {} } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMiddlewareTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMiddlewareTest.java index d838cdf0..6351adfa 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMiddlewareTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/listener/RqueueMiddlewareTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2025 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -87,26 +87,37 @@ class RqueueMiddlewareTest extends TestBase { private final String queueName = "test-queue"; private final Object payload = "test message"; private final MessageConverter messageConverter = new GenericMessageConverter(); + @Mock private RqueueLockManager rqueueLockManager; + @Mock private RqueueConfig rqueueConfig; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + @Mock private RqueueBeanProvider rqueueBeanProvider; + @Mock private QueueStateMgr queueStateMgr; + @Mock private RqueueJobDao rqueueJobDao; + @Mock private RqueueMessageTemplate messageTemplate; + @Mock private RqueueMessageHandler messageHandler; + @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private ApplicationEventPublisher applicationEventPublisher; + private RqueueMessage rqueueMessage = new RqueueMessage(); private PostProcessingHandler postProcessingHandler; private MessageMetadata defaultMessageMetadata; @@ -114,32 +125,30 @@ class RqueueMiddlewareTest extends TestBase { @BeforeEach public void init() throws IllegalAccessException { MockitoAnnotations.openMocks(this); - rqueueMessage = - RqueueMessageUtils.buildMessage( - messageConverter, - queueName, - null, - payload, - null, - null, - RqueueMessageHeaders.emptyMessageHeaders()); + rqueueMessage = RqueueMessageUtils.buildMessage( + messageConverter, + queueName, + null, + payload, + null, + null, + RqueueMessageHeaders.emptyMessageHeaders()); defaultMessageMetadata = new MessageMetadata(rqueueMessage, MessageStatus.ENQUEUED); MessageProcessorHandler messageProcessorHandler = - new MessageProcessorHandler( - null, job -> true, job -> true, null); - postProcessingHandler = - new PostProcessingHandler( - rqueueWebConfig, - applicationEventPublisher, - messageTemplate, - taskBackOff, - messageProcessorHandler, - rqueueSystemConfigDao); + new MessageProcessorHandler(null, job -> true, job -> true, null); + postProcessingHandler = new PostProcessingHandler( + rqueueWebConfig, + applicationEventPublisher, + messageTemplate, + taskBackOff, + messageProcessorHandler, + rqueueSystemConfigDao); doReturn(rqueueMessageMetadataService) .when(rqueueBeanProvider) .getRqueueMessageMetadataService(); doReturn(true).when(queueStateMgr).isQueueActive(anyString()); - doReturn((MessageProcessor) job -> true).when(rqueueBeanProvider) + doReturn((MessageProcessor) job -> true) + .when(rqueueBeanProvider) .getPreExecutionMessageProcessor(); doReturn(messageHandler).when(rqueueBeanProvider).getRqueueMessageHandler(); doReturn(messageConverter).when(messageHandler).getMessageConverter(); @@ -147,7 +156,9 @@ public void init() throws IllegalAccessException { doReturn(rqueueConfig).when(rqueueBeanProvider).getRqueueConfig(); doReturn(1).when(rqueueConfig).getRetryPerPoll(); doReturn("test-job::" + UUID.randomUUID()).when(rqueueConfig).getJobId(); - doAnswer(invocationOnMock -> invocationOnMock.getArgument(0)).when(rqueueConfig).getLockKey(anyString()); + doAnswer(invocationOnMock -> invocationOnMock.getArgument(0)) + .when(rqueueConfig) + .getLockKey(anyString()); } @Test @@ -156,19 +167,20 @@ void logMiddleware() { QueueDetail queueDetail = TestUtils.createQueueDetail(queueName); doReturn(rqueueLockManager).when(rqueueBeanProvider).getRqueueLockManager(); doReturn(true).when(rqueueLockManager).acquireLock(anyString(), any(), any()); - doReturn(defaultMessageMetadata).when(rqueueMessageMetadataService) + doReturn(defaultMessageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); doReturn(defaultMessageMetadata) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - Collections.singletonList(logMiddleware), - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + Collections.singletonList(logMiddleware), + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); verify(messageHandler, times(1)).handleMessage(any()); verify(messageTemplate, times(1)) @@ -183,19 +195,20 @@ void logAndContextMiddleware() { QueueDetail queueDetail = TestUtils.createQueueDetail(queueName); doReturn(rqueueLockManager).when(rqueueBeanProvider).getRqueueLockManager(); doReturn(true).when(rqueueLockManager).acquireLock(anyString(), any(), any()); - doReturn(defaultMessageMetadata).when(rqueueMessageMetadataService) + doReturn(defaultMessageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); doReturn(defaultMessageMetadata) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - newArrayList(logMiddleware, contextMiddleware), - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + newArrayList(logMiddleware, contextMiddleware), + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); verify(messageHandler, times(1)).handleMessage(any()); verify(messageTemplate, times(1)) @@ -215,22 +228,21 @@ void logContextAndPermissionMiddleware() { TestPermissionMiddleware permissionMiddleware = new TestPermissionMiddleware(); doReturn(rqueueLockManager).when(rqueueBeanProvider).getRqueueLockManager(); doReturn(true).when(rqueueLockManager).acquireLock(anyString(), any(), any()); - doReturn(defaultMessageMetadata).when(rqueueMessageMetadataService) + doReturn(defaultMessageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); QueueDetail queueDetail = TestUtils.createQueueDetail(queueName); - RqueueMessage rqueueMessage1 = - RqueueMessageUtils.buildMessage( - messageConverter, - null, - queueName, - payload, - null, - null, - RqueueMessageHeaders.emptyMessageHeaders()); + RqueueMessage rqueueMessage1 = RqueueMessageUtils.buildMessage( + messageConverter, + null, + queueName, + payload, + null, + null, + RqueueMessageHeaders.emptyMessageHeaders()); permissionMiddleware.allowedMessageIds.add(rqueueMessage.getId()); MessageMetadata messageMetadata = new MessageMetadata(rqueueMessage1, MessageStatus.ENQUEUED); - doAnswer( - invocation -> { + doAnswer(invocation -> { RqueueMessage message = invocation.getArgument(0); if (message.getId().equals(defaultMessageMetadata.getRqueueMessage().getId())) { return defaultMessageMetadata; @@ -240,23 +252,23 @@ void logContextAndPermissionMiddleware() { .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - newArrayList(logMiddleware, contextMiddleware, permissionMiddleware), - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + newArrayList(logMiddleware, contextMiddleware, permissionMiddleware), + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - newArrayList(logMiddleware, contextMiddleware, permissionMiddleware), - postProcessingHandler, - rqueueMessage1, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + newArrayList(logMiddleware, contextMiddleware, permissionMiddleware), + postProcessingHandler, + rqueueMessage1, + queueDetail, + queueThreadPool) .run(); verify(messageHandler, times(1)).handleMessage(any()); @@ -282,32 +294,28 @@ void logAndRateLimiterMiddleware() throws TimedOutException { List messages = new ArrayList<>(); int jobCount = 100; for (int i = 0; i < jobCount; i++) { - RqueueMessage message = - RqueueMessageUtils.buildMessage( - messageConverter, - queueName, - null, - payload, - null, - null, - RqueueMessageHeaders.emptyMessageHeaders()); + RqueueMessage message = RqueueMessageUtils.buildMessage( + messageConverter, + queueName, + null, + payload, + null, + null, + RqueueMessageHeaders.emptyMessageHeaders()); MessageMetadata messageMetadata = new MessageMetadata(message, MessageStatus.ENQUEUED); messages.add(message); map.put(message.getId(), messageMetadata); } - doAnswer( - invocation -> { + doAnswer(invocation -> { RqueueMessage message = invocation.getArgument(0); return map.get(message.getId()); }) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); - doAnswer( - invocation -> defaultMessageMetadata) + doAnswer(invocation -> defaultMessageMetadata) .when(rqueueMessageMetadataService) .get(any()); - doAnswer( - invocation -> { + doAnswer(invocation -> { TimeoutUtils.sleep(randomTime(20, 100)); return null; }) @@ -316,15 +324,14 @@ void logAndRateLimiterMiddleware() throws TimedOutException { Executor executor = Executors.newSingleThreadExecutor(); long startTime = System.currentTimeMillis(); for (RqueueMessage message : messages) { - executor.execute( - new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - newArrayList(logMiddleware, testRateLimiter), - postProcessingHandler, - message, - queueDetail, - queueThreadPool)); + executor.execute(new RqueueExecutor( + rqueueBeanProvider, + queueStateMgr, + newArrayList(logMiddleware, testRateLimiter), + postProcessingHandler, + message, + queueDetail, + queueThreadPool)); } TimeoutUtils.waitFor(() -> testRateLimiter.jobs.size() == jobCount, "all jobs to proceed"); long endTime = System.currentTimeMillis(); @@ -345,19 +352,20 @@ void logAndProfilerMiddleware() { QueueDetail queueDetail = TestUtils.createQueueDetail(queueName); doReturn(rqueueLockManager).when(rqueueBeanProvider).getRqueueLockManager(); doReturn(true).when(rqueueLockManager).acquireLock(anyString(), any(), any()); - doReturn(defaultMessageMetadata).when(rqueueMessageMetadataService) + doReturn(defaultMessageMetadata) + .when(rqueueMessageMetadataService) .get(defaultMessageMetadata.getId()); doReturn(defaultMessageMetadata) .when(rqueueMessageMetadataService) .getOrCreateMessageMetadata(any()); new RqueueExecutor( - rqueueBeanProvider, - queueStateMgr, - newArrayList(logMiddleware, profilerMiddleware), - postProcessingHandler, - rqueueMessage, - queueDetail, - queueThreadPool) + rqueueBeanProvider, + queueStateMgr, + newArrayList(logMiddleware, profilerMiddleware), + postProcessingHandler, + rqueueMessage, + queueDetail, + queueThreadPool) .run(); verify(messageHandler, times(1)).handleMessage(any()); verify(messageTemplate, times(1)) diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/MetricsPropertiesTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/MetricsPropertiesTest.java index 3c94dbba..4008033e 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/MetricsPropertiesTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/MetricsPropertiesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -67,7 +67,5 @@ void countFailure() { assertTrue(metricProperties.countFailure()); } - static class MetricProperties extends MetricsProperties { - - } + static class MetricProperties extends MetricsProperties {} } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/QueueCounterTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/QueueCounterTest.java index 91188234..4f15e2df 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/QueueCounterTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/QueueCounterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueCounterTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueCounterTest.java index 6f0530c7..0f6927a6 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueCounterTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueCounterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -30,8 +30,10 @@ class RqueueCounterTest extends TestBase { private final String queueName = "test"; + @Mock private QueueCounter queueCounter; + private RqueueCounter rqueueCounter; @BeforeEach diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueMetricsTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueMetricsTest.java index 185e23d7..08b24e89 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueMetricsTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueMetricsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -44,8 +44,7 @@ @CoreUnitTest class RqueueMetricsTest extends TestBase { - private final MetricsProperties metricsProperties = new MetricsProperties() { - }; + private final MetricsProperties metricsProperties = new MetricsProperties() {}; private final String simpleQueue = "simple-queue"; private final String scheduledQueue = "scheduled-queue"; private final String deadLetterQueue = "dlq"; @@ -53,8 +52,10 @@ class RqueueMetricsTest extends TestBase { private final QueueDetail scheduledQueueDetail = TestUtils.createQueueDetail(scheduledQueue); private final QueueDetail simpleQueueDetail = TestUtils.createQueueDetail(simpleQueue, deadLetterQueue); + @Mock private RqueueStringDao rqueueStringDao; + @Mock private QueueCounter queueCounter; @@ -76,7 +77,9 @@ private void verifyQueueStatistics( Tags tags = Tags.of("queue", name); assertEquals(queueSize, registry.get("queue.size").tags(tags).gauge().value(), 0); assertEquals( - processingQueueSize, registry.get("processing.queue.size").tags(tags).gauge().value(), 0); + processingQueueSize, + registry.get("processing.queue.size").tags(tags).gauge().value(), + 0); try { double val = registry.get("dead.letter.queue.size").tags(tags).gauge().value(); assertEquals(deadLetterQueueCount, val, 0); @@ -122,8 +125,7 @@ private RqueueMetrics rqueueMetrics( @Test void queueStatistics() throws IllegalAccessException { - doAnswer( - invocation -> { + doAnswer(invocation -> { String zsetName = invocation.getArgument(0); if (zsetName.equals(scheduledQueueDetail.getScheduledQueueName())) { return 5L; @@ -139,8 +141,7 @@ void queueStatistics() throws IllegalAccessException { .when(rqueueStringDao) .getSortedSetSize(anyString()); - doAnswer( - invocation -> { + doAnswer(invocation -> { String listName = invocation.getArgument(0); if (listName.equals(simpleQueueDetail.getQueueName())) { return 100L; diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueQueueMetricsTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueQueueMetricsTest.java index 5d817c90..bd07a6cb 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueQueueMetricsTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/metrics/RqueueQueueMetricsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/db/QueueConfigTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/db/QueueConfigTest.java index 1972c43b..75dbfc54 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/db/QueueConfigTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/db/QueueConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -66,8 +66,12 @@ void visibilityTimeout() { @Test void builder() { - QueueConfig queueConfig = - QueueConfig.builder().id("__rq::q").name("q").visibilityTimeout(100L).numRetry(100).build(); + QueueConfig queueConfig = QueueConfig.builder() + .id("__rq::q") + .name("q") + .visibilityTimeout(100L) + .numRetry(100) + .build(); assertEquals("__rq::q", queueConfig.getId()); assertEquals("q", queueConfig.getName()); assertEquals(100L, queueConfig.getVisibilityTimeout()); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/db/QueueStatisticsTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/db/QueueStatisticsTest.java index 944b8ee2..343a006d 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/db/QueueStatisticsTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/db/QueueStatisticsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/request/ChartDataRequestTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/request/ChartDataRequestTest.java index b7650207..274da3ab 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/request/ChartDataRequestTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/request/ChartDataRequestTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/request/MessageMoveRequestTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/request/MessageMoveRequestTest.java index d2e17d7d..ab872d4e 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/request/MessageMoveRequestTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/models/request/MessageMoveRequestTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/DateTimeUtilsTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/DateTimeUtilsTest.java index 3ccc262c..5859cc74 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/DateTimeUtilsTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/DateTimeUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/HttpUtilsTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/HttpUtilsTest.java index 5c0b821f..5ed001d8 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/HttpUtilsTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/HttpUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/MessageMetadataTestUtils.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/MessageMetadataTestUtils.java index f77ae607..80c60fd7 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/MessageMetadataTestUtils.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/MessageMetadataTestUtils.java @@ -16,7 +16,6 @@ package com.github.sonus21.rqueue.utils; - import com.github.sonus21.rqueue.core.RqueueMessage; import com.github.sonus21.rqueue.core.support.RqueueMessageUtils; import com.github.sonus21.rqueue.models.db.MessageMetadata; @@ -30,8 +29,8 @@ public class MessageMetadataTestUtils { public static MessageMetadata createMessageMetadata( MessageConverter messageConverter, String queue) { - return new MessageMetadata(RqueueMessageTestUtils.createMessage(messageConverter, queue), - MessageStatus.ENQUEUED); + return new MessageMetadata( + RqueueMessageTestUtils.createMessage(messageConverter, queue), MessageStatus.ENQUEUED); } public static MessageMetadata createMessageMetadata( @@ -41,5 +40,4 @@ public static MessageMetadata createMessageMetadata( .get(0); return new MessageMetadata(rqueueMessage, MessageStatus.ENQUEUED); } - } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/RqueueMessageTestUtils.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/RqueueMessageTestUtils.java index d4256677..77f1b12f 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/RqueueMessageTestUtils.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/RqueueMessageTestUtils.java @@ -30,7 +30,6 @@ public static RqueueMessage createMessage(String queueName) { return createMessage(new DefaultRqueueMessageConverter(), queueName); } - public static RqueueMessage createMessage(MessageConverter messageConverter, String queue) { return RqueueMessageUtils.generateMessage(messageConverter, queue); } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/StringUtilsTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/StringUtilsTest.java index ac55bef8..db3c5556 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/StringUtilsTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/StringUtilsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/TestUtils.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/TestUtils.java index 8c4346c2..492627fc 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/TestUtils.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/TestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -36,10 +36,11 @@ public final class TestUtils extends TestBase { public static RqueueMessageTemplate rqueueMessageTemplate( RedisConnectionFactory redisConnectionFactory, - RedisTemplate redisTemplate, DefaultScriptExecutor scriptExecutor) + RedisTemplate redisTemplate, + DefaultScriptExecutor scriptExecutor) throws IllegalAccessException { - RqueueMessageTemplate rqueueMessageTemplate = new RqueueMessageTemplateImpl( - redisConnectionFactory, null); + RqueueMessageTemplate rqueueMessageTemplate = + new RqueueMessageTemplateImpl(redisConnectionFactory, null); FieldUtils.writeField(rqueueMessageTemplate, "redisTemplate", redisTemplate, true); if (scriptExecutor != null) { FieldUtils.writeField(rqueueMessageTemplate, "scriptExecutor", scriptExecutor, true); @@ -49,7 +50,8 @@ public static RqueueMessageTemplate rqueueMessageTemplate( public static QueueConfig createQueueConfig( String name, int numRetry, long visibilityTimeout, String dlq) { - QueueConfig queueConfig = createQueueDetail(name, numRetry, visibilityTimeout, dlq).toConfig(); + QueueConfig queueConfig = + createQueueDetail(name, numRetry, visibilityTimeout, dlq).toConfig(); queueConfig.setId(getQueueConfigKey(name)); return queueConfig; } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/ValidatorTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/ValidatorTest.java index ddbfa456..ceb37283 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/ValidatorTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/ValidatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/backoff/ExponentialTaskExecutionBackOffTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/backoff/ExponentialTaskExecutionBackOffTest.java index 51902a53..d68c19de 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/backoff/ExponentialTaskExecutionBackOffTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/backoff/ExponentialTaskExecutionBackOffTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/backoff/FixedTaskExecutionBackOffTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/backoff/FixedTaskExecutionBackOffTest.java index 670ae9dd..f0f23880 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/backoff/FixedTaskExecutionBackOffTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/utils/backoff/FixedTaskExecutionBackOffTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueDashboardChartServiceTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueDashboardChartServiceTest.java index e51d8c29..6f30fb63 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueDashboardChartServiceTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueDashboardChartServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -56,25 +56,28 @@ class RqueueDashboardChartServiceTest extends TestBase { private final List queues = new ArrayList<>(); + @Mock private RqueueQStatsDao rqueueQStatsDao; + @Mock private RqueueWebConfig rqueueWebConfig; + @Mock private RqueueConfig rqueueConfig; + @Mock private RqueueSystemManagerService rqueueSystemManagerService; + private RqueueDashboardChartService rqueueDashboardChartService; @BeforeEach public void init() { MockitoAnnotations.openMocks(this); - rqueueDashboardChartService = - new RqueueDashboardChartServiceImpl( - rqueueQStatsDao, rqueueConfig, rqueueWebConfig, rqueueSystemManagerService); + rqueueDashboardChartService = new RqueueDashboardChartServiceImpl( + rqueueQStatsDao, rqueueConfig, rqueueWebConfig, rqueueSystemManagerService); doReturn(180).when(rqueueWebConfig).getHistoryDay(); - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-stat::" + name; }) @@ -171,7 +174,8 @@ private void verifyStatsChartHeaders(ChartDataRequest chartDataRequest, int dpoi list.add(ChartDataType.MOVED_TO_DLQ.getDescription()); list.add(ChartDataType.RETRIED.getDescription()); } else { - assertEquals(1 + chartDataRequest.getDateTypes().size(), response.getData().get(0).size()); + assertEquals( + 1 + chartDataRequest.getDateTypes().size(), response.getData().get(0).size()); for (ChartDataType d : chartDataRequest.getDateTypes()) { list.add(d.getDescription()); } diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueMessageMetadataServiceTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueMessageMetadataServiceTest.java index 0384a596..9a534e3a 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueMessageMetadataServiceTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueMessageMetadataServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -48,25 +48,32 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @CoreUnitTest class RqueueMessageMetadataServiceTest extends TestBase { private final String queueName = "test-queue"; - @Mock private RqueueMessageMetadataDao rqueueMessageMetadataDao; - @Mock private RqueueStringDao rqueueStringDao; - @Mock private RqueueLockManager lockManager; - @Mock private RqueueConfig rqueueConfig; + + @Mock + private RqueueMessageMetadataDao rqueueMessageMetadataDao; + + @Mock + private RqueueStringDao rqueueStringDao; + + @Mock + private RqueueLockManager lockManager; + + @Mock + private RqueueConfig rqueueConfig; + private RqueueMessageMetadataService rqueueMessageMetadataService; @BeforeEach public void init() { MockitoAnnotations.openMocks(this); - rqueueMessageMetadataService = - new RqueueMessageMetadataServiceImpl( - rqueueMessageMetadataDao, rqueueStringDao, lockManager, rqueueConfig); + rqueueMessageMetadataService = new RqueueMessageMetadataServiceImpl( + rqueueMessageMetadataDao, rqueueStringDao, lockManager, rqueueConfig); } @Test @@ -102,13 +109,12 @@ void deleteMessageShouldCreateMessageMetadata() { .when(lockManager) .acquireLock( eq(Constants.MESSAGE_LOCK_KEY_PREFIX + id), anyString(), eq(Duration.ofSeconds(1))); - doAnswer( - invocation -> { - MessageMetadata metadata = invocation.getArgument(0); - assertTrue(metadata.isDeleted()); - assertNotNull(metadata.getDeletedOn()); - return null; - }) + doAnswer(invocation -> { + MessageMetadata metadata = invocation.getArgument(0); + assertTrue(metadata.isDeleted()); + assertNotNull(metadata.getDeletedOn()); + return null; + }) .when(rqueueMessageMetadataDao) .save(any(), eq(Duration.ofDays(7)), eq(false)); assertTrue(rqueueMessageMetadataService.deleteMessage(queueName, id, Duration.ofDays(7))); @@ -124,20 +130,18 @@ void deleteMessage() { .when(lockManager) .acquireLock( eq(Constants.MESSAGE_LOCK_KEY_PREFIX + id), anyString(), eq(Duration.ofSeconds(1))); - MessageMetadata metadata = - new MessageMetadata( - RqueueMessageUtils.getMessageMetaId(queueName, id), MessageStatus.ENQUEUED); + MessageMetadata metadata = new MessageMetadata( + RqueueMessageUtils.getMessageMetaId(queueName, id), MessageStatus.ENQUEUED); metadata.setDeleted(false); doReturn(metadata) .when(rqueueMessageMetadataDao) .get(RqueueMessageUtils.getMessageMetaId(queueName, id)); - doAnswer( - invocation -> { - MessageMetadata metadataBeingSaved = invocation.getArgument(0); - assertTrue(metadataBeingSaved.isDeleted()); - assertNotNull(metadataBeingSaved.getDeletedOn()); - return null; - }) + doAnswer(invocation -> { + MessageMetadata metadataBeingSaved = invocation.getArgument(0); + assertTrue(metadataBeingSaved.isDeleted()); + assertNotNull(metadataBeingSaved.getDeletedOn()); + return null; + }) .when(rqueueMessageMetadataDao) .save(any(), eq(Duration.ofDays(7)), eq(false)); assertTrue(rqueueMessageMetadataService.deleteMessage(queueName, id, Duration.ofDays(7))); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueQDetailServiceTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueQDetailServiceTest.java index 2bb3786e..89618d13 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueQDetailServiceTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueQDetailServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -74,16 +74,22 @@ class RqueueQDetailServiceTest extends TestBase { private final MessageConverter messageConverter = new GenericMessageConverter(); + @Mock private RedisTemplate redisTemplate; + @Mock private RqueueRedisTemplate stringRqueueRedisTemplate; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RqueueSystemManagerService rqueueSystemManagerService; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + private RqueueQDetailService rqueueQDetailService; private QueueConfig queueConfig; private QueueConfig queueConfig2; @@ -94,13 +100,12 @@ class RqueueQDetailServiceTest extends TestBase { @BeforeEach public void init() { MockitoAnnotations.openMocks(this); - rqueueQDetailService = - new RqueueQDetailServiceImpl( - stringRqueueRedisTemplate, - rqueueMessageTemplate, - rqueueSystemManagerService, - rqueueMessageMetadataService, - rqueueConfig); + rqueueQDetailService = new RqueueQDetailServiceImpl( + stringRqueueRedisTemplate, + rqueueMessageTemplate, + rqueueSystemManagerService, + rqueueMessageMetadataService, + rqueueConfig); queueConfig = createQueueConfig("test", 10, 10000L, "test-dlq"); queueConfig2 = createQueueConfig("test2", 10, 10000L, null); queueConfigList = Arrays.asList(queueConfig, queueConfig2); @@ -115,22 +120,18 @@ void getQueueDataStructureDetail() { doReturn(12L).when(stringRqueueRedisTemplate).getZsetSize("__rq::d-queue::test"); doReturn(5L).when(stringRqueueRedisTemplate).getZsetSize("__rq::p-queue::test"); List> queueRedisDataDetails = new ArrayList<>(); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.PENDING, new RedisDataDetail("__rq::queue::test", DataType.LIST, 10))); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.RUNNING, new RedisDataDetail("__rq::p-queue::test", DataType.ZSET, 5))); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.SCHEDULED, new RedisDataDetail("__rq::d-queue::test", DataType.ZSET, 12))); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.DEAD, - new RedisDataDetail( - queueConfig.getDeadLetterQueues().stream().findFirst().get().getName(), - DataType.LIST, - 11))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.PENDING, new RedisDataDetail("__rq::queue::test", DataType.LIST, 10))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.RUNNING, new RedisDataDetail("__rq::p-queue::test", DataType.ZSET, 5))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.SCHEDULED, new RedisDataDetail("__rq::d-queue::test", DataType.ZSET, 12))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.DEAD, + new RedisDataDetail( + queueConfig.getDeadLetterQueues().stream().findFirst().get().getName(), + DataType.LIST, + 11))); assertEquals( queueRedisDataDetails, rqueueQDetailService.getQueueDataStructureDetail(queueConfig)); } @@ -142,37 +143,30 @@ void getQueueDataStructureDetails() { doReturn(12L).when(stringRqueueRedisTemplate).getZsetSize("__rq::d-queue::test"); doReturn(5L).when(stringRqueueRedisTemplate).getZsetSize("__rq::p-queue::test"); List> queueRedisDataDetails = new ArrayList<>(); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.PENDING, new RedisDataDetail("__rq::queue::test", DataType.LIST, 10))); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.RUNNING, new RedisDataDetail("__rq::p-queue::test", DataType.ZSET, 5))); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.SCHEDULED, new RedisDataDetail("__rq::d-queue::test", DataType.ZSET, 12))); - queueRedisDataDetails.add( - new HashMap.SimpleEntry<>( - NavTab.DEAD, - new RedisDataDetail( - queueConfig.getDeadLetterQueues().stream().findFirst().get().getName(), - DataType.LIST, - 11))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.PENDING, new RedisDataDetail("__rq::queue::test", DataType.LIST, 10))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.RUNNING, new RedisDataDetail("__rq::p-queue::test", DataType.ZSET, 5))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.SCHEDULED, new RedisDataDetail("__rq::d-queue::test", DataType.ZSET, 12))); + queueRedisDataDetails.add(new HashMap.SimpleEntry<>( + NavTab.DEAD, + new RedisDataDetail( + queueConfig.getDeadLetterQueues().stream().findFirst().get().getName(), + DataType.LIST, + 11))); doReturn(5L).when(stringRqueueRedisTemplate).getListSize("__rq::queue::test2"); doReturn(2L).when(stringRqueueRedisTemplate).getZsetSize("__rq::p-queue::test2"); doReturn(8L).when(stringRqueueRedisTemplate).getZsetSize("__rq::d-queue::test2"); List> queueRedisDataDetails2 = new ArrayList<>(); - queueRedisDataDetails2.add( - new HashMap.SimpleEntry<>( - NavTab.PENDING, new RedisDataDetail("__rq::queue::test2", DataType.LIST, 5))); - queueRedisDataDetails2.add( - new HashMap.SimpleEntry<>( - NavTab.RUNNING, new RedisDataDetail("__rq::p-queue::test2", DataType.ZSET, 2))); - queueRedisDataDetails2.add( - new HashMap.SimpleEntry<>( - NavTab.SCHEDULED, new RedisDataDetail("__rq::d-queue::test2", DataType.ZSET, 8))); + queueRedisDataDetails2.add(new HashMap.SimpleEntry<>( + NavTab.PENDING, new RedisDataDetail("__rq::queue::test2", DataType.LIST, 5))); + queueRedisDataDetails2.add(new HashMap.SimpleEntry<>( + NavTab.RUNNING, new RedisDataDetail("__rq::p-queue::test2", DataType.ZSET, 2))); + queueRedisDataDetails2.add(new HashMap.SimpleEntry<>( + NavTab.SCHEDULED, new RedisDataDetail("__rq::d-queue::test2", DataType.ZSET, 8))); Map>> map = new HashMap<>(); map.put("test", queueRedisDataDetails); @@ -206,12 +200,11 @@ void getExplorePageDataQueue() { for (RqueueMessage message : rqueueMessages) { List l = new ArrayList<>(); l.add(new TableColumn(message.getId())); - l.add( - new TableColumn( - TableColumnType.DISPLAY, - message.toString(), - Collections.singletonList( - new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); + l.add(new TableColumn( + TableColumnType.DISPLAY, + message.toString(), + Collections.singletonList( + new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); l.add(new TableColumn("Simple")); l.add(new TableColumn(TableColumnType.ACTION, ActionType.DELETE)); @@ -242,12 +235,11 @@ void getExplorePageDataDeadLetterQueue() { message.setReEnqueuedAt(System.currentTimeMillis()); List l = new ArrayList<>(); l.add(new TableColumn(message.getId())); - l.add( - new TableColumn( - TableColumnType.DISPLAY, - message.toString(), - Collections.singletonList( - new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); + l.add(new TableColumn( + TableColumnType.DISPLAY, + message.toString(), + Collections.singletonList( + new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); l.add(new TableColumn("Simple")); lists.add(new TableRow(l)); @@ -290,12 +282,11 @@ void getExplorePageDataTypeQueueDeleteFewItems() { RqueueMessage message = rqueueMessages.get(i); List l = new ArrayList<>(); l.add(new TableColumn(message.getId())); - l.add( - new TableColumn( - TableColumnType.DISPLAY, - message.toString(), - Collections.singletonList( - new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); + l.add(new TableColumn( + TableColumnType.DISPLAY, + message.toString(), + Collections.singletonList( + new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); l.add(new TableColumn("Simple")); if (i >= 5) { l.add(new TableColumn(TableColumnType.ACTION, ActionType.DELETE)); @@ -333,12 +324,11 @@ void getExplorePageDataTypeScheduledQueue() { for (RqueueMessage message : rqueueMessages) { List l = new ArrayList<>(); l.add(new TableColumn(message.getId())); - l.add( - new TableColumn( - TableColumnType.DISPLAY, - message.toString(), - Collections.singletonList( - new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); + l.add(new TableColumn( + TableColumnType.DISPLAY, + message.toString(), + Collections.singletonList( + new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); l.add(new TableColumn("Simple")); l.add(new TableColumn(TableColumnType.ACTION, ActionType.DELETE)); lists.add(new TableRow(l)); @@ -349,9 +339,8 @@ void getExplorePageDataTypeScheduledQueue() { doReturn(queueConfig).when(rqueueSystemManagerService).getQueueConfig("test"); doReturn(rqueueMessages).when(rqueueMessageTemplate).readFromZset("__rq::d-queue::test", 0, 9); - DataViewResponse response = - rqueueQDetailService.getExplorePageData( - "test", "__rq::d-queue::test", DataType.ZSET, 0, 10); + DataViewResponse response = rqueueQDetailService.getExplorePageData( + "test", "__rq::d-queue::test", DataType.ZSET, 0, 10); // clear time left for (TableRow tableRow : response.getRows()) { tableRow.getColumns().remove(3); @@ -377,12 +366,11 @@ void getExplorePageDataTypeProcessingQueue() { for (RqueueMessage message : rqueueMessages) { List l = new ArrayList<>(); l.add(new TableColumn(message.getId())); - l.add( - new TableColumn( - TableColumnType.DISPLAY, - message.toString(), - Collections.singletonList( - new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); + l.add(new TableColumn( + TableColumnType.DISPLAY, + message.toString(), + Collections.singletonList( + new RowColumnMeta(RowColumnMetaType.JOBS_BUTTON, message.getId())))); l.add(new TableColumn("Simple")); l.add(new TableColumn(TableColumnType.ACTION, ActionType.DELETE)); @@ -390,16 +378,14 @@ void getExplorePageDataTypeProcessingQueue() { } expectedResponse.setRows(lists); doReturn(queueConfig).when(rqueueSystemManagerService).getQueueConfig("test"); - doReturn( - rqueueMessages.stream() + doReturn(rqueueMessages.stream() .map(e -> new DefaultTypedTuple<>(e, (double) System.currentTimeMillis() + 100L)) .collect(Collectors.toList())) .when(rqueueMessageTemplate) .readFromZsetWithScore("__rq::p-queue::test", 0, 9); - DataViewResponse response = - rqueueQDetailService.getExplorePageData( - "test", "__rq::p-queue::test", DataType.ZSET, 0, 10); + DataViewResponse response = rqueueQDetailService.getExplorePageData( + "test", "__rq::p-queue::test", DataType.ZSET, 0, 10); // clear time left for (TableRow tableRow : response.getRows()) { tableRow.getColumns().remove(3); @@ -426,9 +412,8 @@ void viewDataKey() { void viewDataList() { List objects = new ArrayList<>(); objects.add("Test"); - objects.add( - RqueueMessageUtils.buildMessage( - messageConverter, "jobs", null, "buildMessage", null, null, null)); + objects.add(RqueueMessageUtils.buildMessage( + messageConverter, "jobs", null, "buildMessage", null, null, null)); objects.add(null); doReturn(objects).when(stringRqueueRedisTemplate).lrange("jobs", 0, 9); DataViewResponse response = rqueueQDetailService.viewData("jobs", DataType.LIST, null, 0, 10); @@ -446,11 +431,10 @@ void viewDataList() { void viewDataZset() { Set> objects = new HashSet<>(); objects.add(new DefaultTypedTuple<>("Test", 100.0)); - objects.add( - new DefaultTypedTuple<>( - RqueueMessageUtils.buildMessage( - messageConverter, "jobs", null, "buildMessage", null, null, null), - 200.0)); + objects.add(new DefaultTypedTuple<>( + RqueueMessageUtils.buildMessage( + messageConverter, "jobs", null, "buildMessage", null, null, null), + 200.0)); List tableRows = new ArrayList<>(); for (TypedTuple typedTuple : objects) { @@ -477,9 +461,8 @@ void viewDataZset() { void viewDataSet() { Set objects = new HashSet<>(); objects.add("Test"); - objects.add( - RqueueMessageUtils.buildMessage( - messageConverter, "jobs", null, "Test object", null, null, null)); + objects.add(RqueueMessageUtils.buildMessage( + messageConverter, "jobs", null, "Test object", null, null, null)); List tableRows = new ArrayList<>(); for (Object object : objects) { tableRows.add(new TableRow(new TableColumn(String.valueOf(object)))); @@ -571,7 +554,8 @@ void getDeadLetterTasks() { .executePipelined(any(RedisCallback.class)); List> response = rqueueQDetailService.getDeadLetterTasks(); assertEquals(3, response.size()); - List headers = Arrays.asList("Queue", "Dead Letter Queues [LIST]", "Number of Messages"); + List headers = + Arrays.asList("Queue", "Dead Letter Queues [LIST]", "Number of Messages"); List row = Arrays.asList(queueConfig.getName(), "test-dlq", 100L); List row2 = Arrays.asList(queueConfig2.getName(), "", ""); assertEquals(Arrays.asList(headers, row, row2), response); diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueSystemManagerServiceTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueSystemManagerServiceTest.java index e47dd4e8..5f67363e 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueSystemManagerServiceTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueSystemManagerServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -55,23 +55,27 @@ class RqueueSystemManagerServiceTest extends TestBase { private final QueueConfig fastQueueConfig = fastQueueDetail.toConfig(); private final QueueDetail slowQueueDetail = TestUtils.createQueueDetail(slowQueue, 900000L); private final QueueConfig slowQueueConfig = slowQueueDetail.toConfig(); + @Mock private RqueueConfig rqueueConfig; + @Mock private RqueueStringDao rqueueStringDao; + @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + private RqueueSystemManagerService rqueueSystemManagerService; private Set queues; @BeforeEach public void init() { MockitoAnnotations.openMocks(this); - rqueueSystemManagerService = - new RqueueSystemManagerServiceImpl( - rqueueConfig, rqueueStringDao, rqueueSystemConfigDao, rqueueMessageMetadataService); + rqueueSystemManagerService = new RqueueSystemManagerServiceImpl( + rqueueConfig, rqueueStringDao, rqueueSystemConfigDao, rqueueMessageMetadataService); queues = new HashSet<>(); queues.add(slowQueue); queues.add(fastQueue); @@ -105,8 +109,7 @@ void getQueues() { @Test void getQueueConfigs() { - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-config::" + name; }) @@ -125,8 +128,7 @@ void getQueueConfigs() { @Test void getSortedQueueConfigs() { - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-config::" + name; }) @@ -136,11 +138,10 @@ void getSortedQueueConfigs() { doReturn(new ArrayList<>(queues)).when(rqueueStringDao).readFromSet(TestUtils.getQueuesKey()); doReturn(Arrays.asList(slowQueueConfig, fastQueueConfig)) .when(rqueueSystemConfigDao) - .findAllQConfig( - queues.stream() - .map(TestUtils::getQueueConfigKey) - .sorted() - .collect(Collectors.toList())); + .findAllQConfig(queues.stream() + .map(TestUtils::getQueueConfigKey) + .sorted() + .collect(Collectors.toList())); assertEquals( Arrays.asList(fastQueueConfig, slowQueueConfig), rqueueSystemManagerService.getSortedQueueConfigs()); @@ -148,8 +149,7 @@ void getSortedQueueConfigs() { @Test void getQueueConfig() { - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-config::" + name; }) diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueTaskMetricsAggregatorServiceTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueTaskMetricsAggregatorServiceTest.java index 5c6185d4..feaefb72 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueTaskMetricsAggregatorServiceTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueTaskMetricsAggregatorServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -65,28 +65,35 @@ class RqueueTaskMetricsAggregatorServiceTest extends TestBase { private final String queueName = "test-queue"; + @Mock private RqueueQStatsDao rqueueQStatsDao; + @Mock private RqueueWebConfig rqueueWebConfig; + @Mock private RqueueLockManager rqueueLockManager; + @Mock private RqueueConfig rqueueConfig; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + @Mock private RqueueJobDao rqueueJobDao; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + private RqueueJobMetricsAggregatorService rqueueJobMetricsAggregatorService; @BeforeEach public void initService() throws IllegalAccessException { MockitoAnnotations.openMocks(this); - rqueueJobMetricsAggregatorService = - new RqueueJobMetricsAggregatorService( - rqueueConfig, rqueueWebConfig, rqueueLockManager, rqueueQStatsDao); + rqueueJobMetricsAggregatorService = new RqueueJobMetricsAggregatorService( + rqueueConfig, rqueueWebConfig, rqueueLockManager, rqueueQStatsDao); doReturn(true).when(rqueueWebConfig).isCollectListenerStats(); doReturn(1).when(rqueueWebConfig).getStatsAggregatorThreadCount(); doReturn(100).when(rqueueWebConfig).getAggregateEventWaitTimeInSecond(); @@ -103,29 +110,27 @@ public void initService() throws IllegalAccessException { private RqueueExecutionEvent generateTaskEventWithStatus(MessageStatus status) { double r = Math.random(); - RqueueMessage rqueueMessage = - RqueueMessage.builder() - .queueName("test-queue") - .message("test") - .processAt(System.currentTimeMillis()) - .queuedTime(System.nanoTime()) - .build(); + RqueueMessage rqueueMessage = RqueueMessage.builder() + .queueName("test-queue") + .message("test") + .processAt(System.currentTimeMillis()) + .queuedTime(System.nanoTime()) + .build(); MessageMetadata messageMetadata = new MessageMetadata(rqueueMessage, status); messageMetadata.setTotalExecutionTime(10 + (long) r * 10000); rqueueMessage.setFailureCount((int) r * 10); QueueDetail queueDetail = TestUtils.createQueueDetail(queueName); - Job job = - new JobImpl( - rqueueConfig, - rqueueMessageMetadataService, - rqueueJobDao, - rqueueMessageTemplate, - rqueueLockManager, - queueDetail, - messageMetadata, - rqueueMessage, - null, - null); + Job job = new JobImpl( + rqueueConfig, + rqueueMessageMetadataService, + rqueueJobDao, + rqueueMessageTemplate, + rqueueLockManager, + queueDetail, + messageMetadata, + rqueueMessage, + null, + null); return new RqueueExecutionEvent(job); } @@ -184,8 +189,7 @@ void onApplicationEvent() throws TimedOutException { .when(rqueueLockManager) .acquireLock(eq("__rq::lock::" + id), anyString(), eq(Duration.ofMillis(500L))); List queueStatistics = new ArrayList<>(); - doAnswer( - invocation -> { + doAnswer(invocation -> { queueStatistics.add(invocation.getArgument(0)); return null; }) diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueUtilityServiceTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueUtilityServiceTest.java index 06f680a5..e1446468 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueUtilityServiceTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/RqueueUtilityServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -60,32 +60,38 @@ class RqueueUtilityServiceTest extends TestBase { @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private RqueueWebConfig rqueueWebConfig; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RqueueMessageMetadataService messageMetadataService; + @Mock private RqueueConfig rqueueConfig; + @Mock private RqueueStringDao rqueueStringDao; + @Mock private RqueueInternalPubSubChannel rqueueInternalPubSubChannel; + private RqueueUtilityService rqueueUtilityService; @BeforeEach public void init() { MockitoAnnotations.openMocks(this); - rqueueUtilityService = - new RqueueUtilityServiceImpl( - rqueueConfig, - rqueueWebConfig, - rqueueStringDao, - rqueueSystemConfigDao, - rqueueMessageTemplate, - messageMetadataService, - rqueueInternalPubSubChannel); + rqueueUtilityService = new RqueueUtilityServiceImpl( + rqueueConfig, + rqueueWebConfig, + rqueueStringDao, + rqueueSystemConfigDao, + rqueueMessageTemplate, + messageMetadataService, + rqueueInternalPubSubChannel); } @Test diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/impl/RqueueSystemManagerServiceImplTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/impl/RqueueSystemManagerServiceImplTest.java index 9293fcf8..af45e25f 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/impl/RqueueSystemManagerServiceImplTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/service/impl/RqueueSystemManagerServiceImplTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -61,23 +61,27 @@ class RqueueSystemManagerServiceImplTest extends TestBase { private final QueueConfig fastQueueConfig = fastQueueDetail.toConfig(); private final QueueDetail normalQueueDetail = TestUtils.createQueueDetail(normalQueue, 3, 100000L, "normal-dlq"); + @Mock private RqueueStringDao rqueueStringDao; + @Mock private RqueueSystemConfigDao rqueueSystemConfigDao; + @Mock private RqueueConfig rqueueConfig; + @Mock private RqueueMessageMetadataService rqueueMessageMetadataService; + private RqueueSystemManagerServiceImpl rqueueSystemManagerService; @BeforeEach public void init() { MockitoAnnotations.openMocks(this); EndpointRegistry.delete(); - rqueueSystemManagerService = - new RqueueSystemManagerServiceImpl( - rqueueConfig, rqueueStringDao, rqueueSystemConfigDao, rqueueMessageMetadataService); + rqueueSystemManagerService = new RqueueSystemManagerServiceImpl( + rqueueConfig, rqueueStringDao, rqueueSystemConfigDao, rqueueMessageMetadataService); slowQueueConfig.setId(TestUtils.getQueueConfigKey(slowQueue)); fastQueueConfig.setId(TestUtils.getQueueConfigKey(fastQueue)); EndpointRegistry.register(slowQueueDetail); @@ -116,16 +120,14 @@ public void verifyConfigData(QueueConfig expectedConfig, QueueConfig queueConfig @Test void onApplicationEventStartCreateAllQueueConfigs() { doReturn("__rq::queues").when(rqueueConfig).getQueuesKey(); - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-config::" + name; }) .when(rqueueConfig) .getQueueConfigKey(anyString()); RqueueBootstrapEvent event = new RqueueBootstrapEvent("Container", true); - doAnswer( - invocation -> { + doAnswer(invocation -> { if (slowQueue.equals(invocation.getArgument(1))) { assertEquals(fastQueue, invocation.getArgument(2)); } else if (fastQueue.equals(invocation.getArgument(1))) { @@ -137,8 +139,7 @@ void onApplicationEventStartCreateAllQueueConfigs() { }) .when(rqueueStringDao) .appendToSet(eq(TestUtils.getQueuesKey()), any()); - doAnswer( - invocation -> { + doAnswer(invocation -> { List queueConfigs = invocation.getArgument(0); assertEquals(2, queueConfigs.size()); int slowId = 0, fastId = 1; @@ -161,35 +162,30 @@ void onApplicationEventStartCreateAllQueueConfigs() { void onApplicationEventStartCreateAndUpdateQueueConfigs() { RqueueBootstrapEvent event = new RqueueBootstrapEvent("Container", true); EndpointRegistry.register(normalQueueDetail); - doAnswer( - invocation -> { + doAnswer(invocation -> { String name = invocation.getArgument(0); return "__rq::q-config::" + name; }) .when(rqueueConfig) .getQueueConfigKey(anyString()); - QueueConfig fastQueueConfig = - TestUtils.createQueueConfig( - fastQueue, fastQueueDetail.getNumRetry(), fastQueueDetail.getVisibilityTimeout(), null); + QueueConfig fastQueueConfig = TestUtils.createQueueConfig( + fastQueue, fastQueueDetail.getNumRetry(), fastQueueDetail.getVisibilityTimeout(), null); doReturn(Arrays.asList(slowQueueConfig, fastQueueConfig)) .when(rqueueSystemConfigDao) .findAllQConfig(anyCollection()); - QueueConfig expectedFastQueueConfig = - TestUtils.createQueueConfig( - fastQueue, - fastQueueDetail.getNumRetry(), - fastQueueDetail.getVisibilityTimeout(), - fastQueueDetail.getDeadLetterQueueName()); - QueueConfig normalQueueConfig = - TestUtils.createQueueConfig( - normalQueue, - normalQueueDetail.getNumRetry(), - normalQueueDetail.getVisibilityTimeout(), - normalQueueDetail.getDeadLetterQueueName()); - - doAnswer( - invocation -> { + QueueConfig expectedFastQueueConfig = TestUtils.createQueueConfig( + fastQueue, + fastQueueDetail.getNumRetry(), + fastQueueDetail.getVisibilityTimeout(), + fastQueueDetail.getDeadLetterQueueName()); + QueueConfig normalQueueConfig = TestUtils.createQueueConfig( + normalQueue, + normalQueueDetail.getNumRetry(), + normalQueueDetail.getVisibilityTimeout(), + normalQueueDetail.getDeadLetterQueueName()); + + doAnswer(invocation -> { List queueConfigs = invocation.getArgument(0); assertEquals(2, queueConfigs.size()); int normalId = 0, fastId = 1; diff --git a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/view/DateTimeFunctionTest.java b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/view/DateTimeFunctionTest.java index 094ff761..4673a9b5 100644 --- a/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/view/DateTimeFunctionTest.java +++ b/rqueue-core/src/test/java/com/github/sonus21/rqueue/web/view/DateTimeFunctionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-example/README.md b/rqueue-spring-boot-example/README.md index 1245bc87..2f7bb016 100644 --- a/rqueue-spring-boot-example/README.md +++ b/rqueue-spring-boot-example/README.md @@ -12,7 +12,7 @@ This sample project should be used only for spring-boot application. #### Requirements * Redis -* Java 8 +* Java 21 * Gradle Run boot app as @@ -39,4 +39,3 @@ Application MessageListener logs the job in console, so we can see in the consol with the scheduled job. - diff --git a/rqueue-spring-boot-example/build.gradle b/rqueue-spring-boot-example/build.gradle index 84041b5c..049acd45 100644 --- a/rqueue-spring-boot-example/build.gradle +++ b/rqueue-spring-boot-example/build.gradle @@ -5,7 +5,7 @@ plugins { dependencies { implementation project(":rqueue-spring-boot-starter") implementation "org.springframework.boot:spring-boot-starter-data-redis:${springBootVersion}" - implementation "org.springframework.boot:spring-boot-starter-webmvc:${springBootVersion}" + implementation "org.springframework.boot:spring-boot-starter-web:${springBootVersion}" // https://mvnrepository.com/artifact/ch.qos.logback/logback-core implementation "ch.qos.logback:logback-core:${logbackVersion}" // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic diff --git a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/Controller.java b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/Controller.java index 58fae36b..51535af1 100644 --- a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/Controller.java +++ b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/Controller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -51,7 +51,6 @@ public String push( return "Message sent successfully, message id " + messageId; } - private String getQueue(String queue) { if (queue == null) { return "job-queue"; @@ -99,5 +98,4 @@ public String scheduleJob( job.setMessageId(messageId); return job.toString(); } - } diff --git a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/Job.java b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/Job.java index fa215529..bb9bb2b7 100644 --- a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/Job.java +++ b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/Job.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -28,5 +28,4 @@ public class Job { private String id; private String message; private String messageId; - } diff --git a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/MessageListener.java b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/MessageListener.java index 467b6f11..2f010442 100644 --- a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/MessageListener.java +++ b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/MessageListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -32,8 +32,10 @@ public class MessageListener { private static final Random random = new Random(); + @Autowired private RqueueMessageManager rqueueMessageManager; + @Value("${job.fail.percentage:0}") private int percentageFailure; @@ -65,19 +67,30 @@ public void onSimpleMessage(String message) { execute("simple: {}", message, false); } - @RqueueListener(value = {"${rqueue.delay.queue}", - "${rqueue.delay2.queue}"}, numRetries = "${rqueue.delay.queue.retries}", visibilityTimeout = "60*60*1000") + @RqueueListener( + value = {"${rqueue.delay.queue}", "${rqueue.delay2.queue}"}, + numRetries = "${rqueue.delay.queue.retries}", + visibilityTimeout = "60*60*1000") public void onMessage(String message) { execute("delay: {}", message, true); } - @RqueueListener(value = "job-queue", deadLetterQueue = "job-morgue", numRetries = "2", deadLetterQueueListenerEnabled = "false", concurrency = "10-20") + @RqueueListener( + value = "job-queue", + deadLetterQueue = "job-morgue", + numRetries = "2", + deadLetterQueueListenerEnabled = "false", + concurrency = "10-20") public void onJobMessage(Job job) { execute("job-queue: {}", job, true); } - - @RqueueListener(value = "sch-job-queue", deadLetterQueue = "job-morgue", numRetries = "2", deadLetterQueueListenerEnabled = "false", concurrency = "1-3") + @RqueueListener( + value = "sch-job-queue", + deadLetterQueue = "job-morgue", + numRetries = "2", + deadLetterQueueListenerEnabled = "false", + concurrency = "1-3") public void onSchJobMessage(Job job, @Header(RqueueMessageHeaders.ID) String messageId) { execute("sch-job-queue: {}", job, false); count += 1; @@ -87,7 +100,6 @@ public void onSchJobMessage(Job job, @Header(RqueueMessageHeaders.ID) String mes } } - @RqueueListener(value = "job-morgue", numRetries = "1", concurrency = "1-3") public void onJobDlqMessage(Job job) { execute("job-morgue: {}", job, true); diff --git a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/MvcConfig.java b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/MvcConfig.java index 468e9cbb..ec2dfa18 100644 --- a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/MvcConfig.java +++ b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/MvcConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/RQueueApplication.java b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/RQueueApplication.java index a3da7921..456a9a9a 100644 --- a/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/RQueueApplication.java +++ b/rqueue-spring-boot-example/src/main/java/com/github/sonus21/rqueue/example/RQueueApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-reactive-example/README.md b/rqueue-spring-boot-reactive-example/README.md index 4c6021d6..dec2c3ca 100644 --- a/rqueue-spring-boot-reactive-example/README.md +++ b/rqueue-spring-boot-reactive-example/README.md @@ -12,7 +12,7 @@ This sample project should be used only for spring-boot reactive/webflux project #### Requirements * Redis -* Java 8 +* Java 21 * Gradle Run boot app as @@ -36,4 +36,4 @@ It has three APIs to play with | http://localhost:8080/push?q=test&msg=test | schedule/send simple string notification on any queue |q=>queue name, options are simple-queue,delay-queue,delay-queue2,msg=message that should be enqueued, numRetries=> number of retry count (optional), delay => optional delay for message | Application MessageListener logs the job in console, so we can see in the console what's happening -with the scheduled job. \ No newline at end of file +with the scheduled job. diff --git a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/Controller.java b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/Controller.java index c1a864e7..c40f3a87 100644 --- a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/Controller.java +++ b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/Controller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/Job.java b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/Job.java index 35da1886..a2372c54 100644 --- a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/Job.java +++ b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/Job.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/MessageListener.java b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/MessageListener.java index 4462cf13..07434fa7 100644 --- a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/MessageListener.java +++ b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/MessageListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/RqueueReactiveApplication.java b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/RqueueReactiveApplication.java index 6f9d39fc..64548c48 100644 --- a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/RqueueReactiveApplication.java +++ b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/RqueueReactiveApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/WebFluxConfig.java b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/WebFluxConfig.java index 55e9d90b..f383496e 100644 --- a/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/WebFluxConfig.java +++ b/rqueue-spring-boot-reactive-example/src/main/java/com/github/sonus21/task/executor/WebFluxConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-reactive-example/src/test/java/com/github/sonus21/task/executor/RqueueReactiveTaskExecutorApplicationTests.java b/rqueue-spring-boot-reactive-example/src/test/java/com/github/sonus21/task/executor/RqueueReactiveTaskExecutorApplicationTests.java index 1fea1584..21dcb35b 100644 --- a/rqueue-spring-boot-reactive-example/src/test/java/com/github/sonus21/task/executor/RqueueReactiveTaskExecutorApplicationTests.java +++ b/rqueue-spring-boot-reactive-example/src/test/java/com/github/sonus21/task/executor/RqueueReactiveTaskExecutorApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -23,6 +23,5 @@ class RqueueReactiveTaskExecutorApplicationTests { @Test - void contextLoads() { - } + void contextLoads() {} } diff --git a/rqueue-spring-boot-starter/build.gradle b/rqueue-spring-boot-starter/build.gradle index ec202564..828d5243 100644 --- a/rqueue-spring-boot-starter/build.gradle +++ b/rqueue-spring-boot-starter/build.gradle @@ -46,7 +46,7 @@ dependencies { api "org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}" testImplementation project(":rqueue-spring-common-test") testImplementation "org.springframework.boot:spring-boot-starter-test:${springBootVersion}" - testImplementation "org.springframework.boot:spring-boot-starter-webflux-test:${springBootVersion}" + testImplementation "org.springframework.boot:spring-boot-starter-webflux:${springBootVersion}" testImplementation "org.springframework.boot:spring-boot-webtestclient:${springBootVersion}" testImplementation "org.springframework.boot:spring-boot-starter-data-redis-reactive:${springBootVersion}" testImplementation "org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}" diff --git a/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueListenerAutoConfig.java b/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueListenerAutoConfig.java index 0949474f..a2e64f75 100644 --- a/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueListenerAutoConfig.java +++ b/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueListenerAutoConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -33,7 +33,6 @@ import com.github.sonus21.rqueue.utils.condition.RqueueEnabled; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; - import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -70,7 +69,6 @@ public RqueueMessageTemplate rqueueMessageTemplate( return getMessageTemplate(rqueueConfig); } - @Bean @ConditionalOnMissingBean public RqueueMessageManager rqueueMessageManager( diff --git a/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueMetricsAutoConfig.java b/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueMetricsAutoConfig.java index d47f932b..bf370c8f 100644 --- a/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueMetricsAutoConfig.java +++ b/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueMetricsAutoConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueMetricsProperties.java b/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueMetricsProperties.java index 64b5ddca..3cbc39c9 100644 --- a/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueMetricsProperties.java +++ b/rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueMetricsProperties.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -22,6 +22,4 @@ @Configuration @ConfigurationProperties(prefix = "rqueue.metrics") -public class RqueueMetricsProperties extends MetricsProperties { - -} +public class RqueueMetricsProperties extends MetricsProperties {} diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/Application.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/Application.java index 00a70883..790aabfb 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/Application.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/Application.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationListenerDisabled.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationListenerDisabled.java index 29b277ca..8175834b 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationListenerDisabled.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationListenerDisabled.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import com.github.sonus21.rqueue.listener.RqueueMessageListenerContainer; import com.github.sonus21.rqueue.test.application.BaseApplication; import jakarta.annotation.PostConstruct; +import java.io.IOException; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -31,7 +32,6 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.transaction.annotation.EnableTransactionManagement; -import java.io.IOException; @PropertySource("classpath:application.properties") @SpringBootApplication(scanBasePackages = {"com.github.sonus21.rqueue.test"}) @@ -67,8 +67,7 @@ public RqueueMessageListenerContainer rqueueMessageListenerContainer( } return new RqueueMessageListenerContainer(rqueueMessageHandler, rqueueMessageTemplate) { @Override - protected void startQueue(String queueName, QueueDetail queueDetail) { - } + protected void startQueue(String queueName, QueueDetail queueDetail) {} }; } } diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithCustomConfiguration.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithCustomConfiguration.java index d2f7b7f6..65ac0c83 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithCustomConfiguration.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithCustomConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithCustomMessageConverter.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithCustomMessageConverter.java index 83c6d3e0..482ba8b5 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithCustomMessageConverter.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithCustomMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithMessageProcessor.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithMessageProcessor.java index 42f287f6..7f51fa6e 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithMessageProcessor.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithMessageProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithRestart.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithRestart.java index 247c8bfe..983076a1 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithRestart.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithRestart.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithTaskExecutionBackoff.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithTaskExecutionBackoff.java index 18855225..2efb5da7 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithTaskExecutionBackoff.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ApplicationWithTaskExecutionBackoff.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -41,12 +41,10 @@ public static void main(String[] args) { public static void restart() { ApplicationArguments args = context.getBean(ApplicationArguments.class); - Thread thread = - new Thread( - () -> { - context.close(); - context = SpringApplication.run(Application.class, args.getSourceArgs()); - }); + Thread thread = new Thread(() -> { + context.close(); + context = SpringApplication.run(Application.class, args.getSourceArgs()); + }); thread.setContextClassLoader(mainThreadClassLoader); thread.setDaemon(false); thread.start(); diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/BootMetricApplication.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/BootMetricApplication.java index e4e7ca3c..73e68087 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/BootMetricApplication.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/BootMetricApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/MultiRedisSetupApplication.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/MultiRedisSetupApplication.java index 0fae332e..ea473ab8 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/MultiRedisSetupApplication.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/MultiRedisSetupApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ProducerOnlyApplication.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ProducerOnlyApplication.java index 6b8161c8..1d2cc683 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ProducerOnlyApplication.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/ProducerOnlyApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/RedisClusterApplication.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/RedisClusterApplication.java index eac7f639..751673c4 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/RedisClusterApplication.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/application/RedisClusterApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/reactive/ReactiveWebApplication.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/reactive/ReactiveWebApplication.java index c24c0de6..2d2db950 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/reactive/ReactiveWebApplication.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/reactive/ReactiveWebApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/reactive/WebFluxConfig.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/reactive/WebFluxConfig.java index 9fbf94b7..02162b6c 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/reactive/WebFluxConfig.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/reactive/WebFluxConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/SpringBootIntegrationTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/SpringBootIntegrationTest.java index 87ed41c1..14cbab55 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/SpringBootIntegrationTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/SpringBootIntegrationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -30,6 +30,4 @@ @Tag("integration") @Tag("springBoot") @ExtendWith({TestTracerExtension.class}) -public @interface SpringBootIntegrationTest { - -} +public @interface SpringBootIntegrationTest {} diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/SpringBootUnitTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/SpringBootUnitTest.java index 22be887c..35b2532e 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/SpringBootUnitTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/SpringBootUnitTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,6 +31,4 @@ @Tag("unit") @Tag("springBootUnit") @ExtendWith({MockitoExtension.class, TestTracerExtension.class}) -public @interface SpringBootUnitTest { - -} +public @interface SpringBootUnitTest {} diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ApplicationTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ApplicationTest.java index ef13ace7..20f2a437 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ApplicationTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ApplicationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,14 +31,14 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1000", - "spring.data.redis.port=8001", - "reservation.request.dead.letter.consumer.enabled=true", - "reservation.request.active=true", - "list.email.queue.enabled=true", - "mysql.db.name=BootApplicationTest", - "use.system.redis=false", - "user.banned.queue.active=true", + "rqueue.retry.per.poll=1000", + "spring.data.redis.port=8001", + "reservation.request.dead.letter.consumer.enabled=true", + "reservation.request.active=true", + "list.email.queue.enabled=true", + "mysql.db.name=BootApplicationTest", + "use.system.redis=false", + "user.banned.queue.active=true", }) @SpringBootIntegrationTest class ApplicationTest extends BasicListenerTest { diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootDoNotRetrySingleAttemptTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootDoNotRetrySingleAttemptTest.java index ef12f670..b6a5e44b 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootDoNotRetrySingleAttemptTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootDoNotRetrySingleAttemptTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2024 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -16,6 +16,9 @@ package com.github.sonus21.rqueue.spring.boot.tests.integration; +import static com.github.sonus21.rqueue.utils.TimeoutUtils.waitFor; +import static org.junit.jupiter.api.Assertions.assertEquals; + import com.github.sonus21.rqueue.exception.TimedOutException; import com.github.sonus21.rqueue.spring.boot.application.Application; import com.github.sonus21.rqueue.spring.boot.tests.SpringBootIntegrationTest; @@ -23,31 +26,27 @@ import com.github.sonus21.rqueue.test.dto.Job; import com.github.sonus21.rqueue.test.entity.ConsumedMessage; import com.github.sonus21.rqueue.test.tests.RetryTests; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; -import java.util.List; - -import static com.github.sonus21.rqueue.utils.TimeoutUtils.waitFor; -import static org.junit.jupiter.api.Assertions.assertEquals; - @ContextConfiguration(classes = Application.class) @SpringBootTest @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1", - "spring.data.redis.port=6379", - "reservation.request.dead.letter.consumer.enabled=true", - "reservation.request.active=true", - "list.email.queue.enabled=true", - "mysql.db.name=BootDoNotSingleAttemptRetryTest", - "record.failed.execution=true", - "use.system.redis=true", - "donot.retry=true" + "rqueue.retry.per.poll=1", + "spring.data.redis.port=6379", + "reservation.request.dead.letter.consumer.enabled=true", + "reservation.request.active=true", + "list.email.queue.enabled=true", + "mysql.db.name=BootDoNotSingleAttemptRetryTest", + "record.failed.execution=true", + "use.system.redis=true", + "donot.retry=true" }) @SpringBootIntegrationTest class BootDoNotRetrySingleAttemptTest extends RetryTests { @@ -70,8 +69,8 @@ void taskIsNotRetried() throws TimedOutException { return !messages.contains(job); }, "message should be deleted from internal storage"); - ConsumedMessage message = consumedMessageStore.getConsumedMessage(job.getId(), - MessageListener.FAILED_TAG); + ConsumedMessage message = + consumedMessageStore.getConsumedMessage(job.getId(), MessageListener.FAILED_TAG); assertEquals(1, message.getCount()); List messages = consumedMessageStore.getAllMessages(job.getId()); assertEquals(1, messages.size()); diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootDoNotRetryTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootDoNotRetryTest.java index 26667cfd..5d3afd71 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootDoNotRetryTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootDoNotRetryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2024 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -38,15 +38,15 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1000", - "spring.data.redis.port=8024", - "reservation.request.dead.letter.consumer.enabled=true", - "reservation.request.active=true", - "list.email.queue.enabled=true", - "mysql.db.name=BootDoNotRetryTest", - "record.failed.execution=true", - "use.system.redis=false", - "donot.retry=true" + "rqueue.retry.per.poll=1000", + "spring.data.redis.port=8024", + "reservation.request.dead.letter.consumer.enabled=true", + "reservation.request.active=true", + "list.email.queue.enabled=true", + "mysql.db.name=BootDoNotRetryTest", + "record.failed.execution=true", + "use.system.redis=false", + "donot.retry=true" }) @SpringBootIntegrationTest class BootDoNotRetryTest extends RetryTests { @@ -69,8 +69,8 @@ void taskIsNotRetried() throws TimedOutException { return !messages.contains(job); }, "message should be deleted from internal storage"); - ConsumedMessage message = consumedMessageStore.getConsumedMessage(job.getId(), - MessageListener.FAILED_TAG); + ConsumedMessage message = + consumedMessageStore.getConsumedMessage(job.getId(), MessageListener.FAILED_TAG); assertEquals(1, message.getCount()); List messages = consumedMessageStore.getAllMessages(job.getId()); assertEquals(1, messages.size()); diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootMetricsTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootMetricsTest.java index 062a952c..db058e97 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootMetricsTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootMetricsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -33,13 +33,13 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=20", - "rqueue.scheduler.auto.start=false", - "spring.data.redis.port=8003", - "mysql.db.name=test4", - "rqueue.metrics.count.failure=true", - "rqueue.metrics.count.execution=true", - "sms.queue.active=true" + "rqueue.retry.per.poll=20", + "rqueue.scheduler.auto.start=false", + "spring.data.redis.port=8003", + "mysql.db.name=test4", + "rqueue.metrics.count.failure=true", + "rqueue.metrics.count.execution=true", + "sms.queue.active=true" }) @SpringBootIntegrationTest @EnabledIfEnvironmentVariable(named = "CI", matches = "true") diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootProcessingChannelTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootProcessingChannelTest.java index 087c5d26..6b88c6ed 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootProcessingChannelTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootProcessingChannelTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -30,13 +30,13 @@ @ContextConfiguration(classes = ApplicationListenerDisabled.class) @TestPropertySource( properties = { - "rqueue.scheduler.auto.start=false", - "spring.data.redis.port=8011", - "mysql.db.name=BootProcessingChannelTest", - "max.workers.count=120", - "use.system.redis=false", - "monitor.enabled=true", - "start.queue.enabled=true", + "rqueue.scheduler.auto.start=false", + "spring.data.redis.port=8011", + "mysql.db.name=BootProcessingChannelTest", + "max.workers.count=120", + "use.system.redis=false", + "monitor.enabled=true", + "start.queue.enabled=true", }) @SpringBootTest @Slf4j diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootRetryTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootRetryTest.java index 8806c2dd..c2614c52 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootRetryTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootRetryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -32,13 +32,13 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1000", - "spring.data.redis.port=8016", - "reservation.request.dead.letter.consumer.enabled=true", - "reservation.request.active=true", - "list.email.queue.enabled=true", - "mysql.db.name=BootRetryTest", - "use.system.redis=false", + "rqueue.retry.per.poll=1000", + "spring.data.redis.port=8016", + "reservation.request.dead.letter.consumer.enabled=true", + "reservation.request.active=true", + "list.email.queue.enabled=true", + "mysql.db.name=BootRetryTest", + "use.system.redis=false", }) @SpringBootIntegrationTest class BootRetryTest extends RetryTests { @@ -69,8 +69,7 @@ void jobIsRetriedAndMessageIsInProcessingQueue() throws TimedOutException { } @Test - void messageIsConsumedByDeadLetterQueueListener() - throws TimedOutException, JacksonException { + void messageIsConsumedByDeadLetterQueueListener() throws TimedOutException, JacksonException { verifyMessageIsConsumedByDeadLetterQueueListener(); } } diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootScheduledChannelTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootScheduledChannelTest.java index 5e83a9e8..7d26a109 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootScheduledChannelTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/BootScheduledChannelTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,12 +31,12 @@ @ContextConfiguration(classes = ApplicationListenerDisabled.class) @TestPropertySource( properties = { - "rqueue.scheduler.auto.start=false", - "spring.data.redis.port=8002", - "mysql.db.name=BootScheduledChannelTest", - "max.workers.count=120", - "use.system.redis=false", - "monitor.enabled=true" + "rqueue.scheduler.auto.start=false", + "spring.data.redis.port=8002", + "mysql.db.name=BootScheduledChannelTest", + "max.workers.count=120", + "use.system.redis=false", + "monitor.enabled=true" }) @SpringBootTest @Slf4j diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/CustomMessageConverterTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/CustomMessageConverterTest.java index 5116080c..af87e9b0 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/CustomMessageConverterTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/CustomMessageConverterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -42,13 +42,13 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1000", - "spring.data.redis.port=8010", - "reservation.request.active=true", - "mysql.db.name=CustomMessageConverterTest", - "use.system.redis=false", - "monitor.enabled=true", - "rqueue.message.converter.provider.class=com.github.sonus21.rqueue.test.util.TestMessageConverterProvider", + "rqueue.retry.per.poll=1000", + "spring.data.redis.port=8010", + "reservation.request.active=true", + "mysql.db.name=CustomMessageConverterTest", + "use.system.redis=false", + "monitor.enabled=true", + "rqueue.message.converter.provider.class=com.github.sonus21.rqueue.test.util.TestMessageConverterProvider", }) @SpringBootIntegrationTest class CustomMessageConverterTest extends BasicListenerTest { diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/JobCheckinTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/JobCheckinTest.java index d3ca65c2..c6edda0f 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/JobCheckinTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/JobCheckinTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -46,14 +46,14 @@ @Slf4j @TestPropertySource( properties = { - "spring.data.redis.port=8015", - "mysql.db.name=JobCheckinTest", - "long.running.job.queue.active=true", - "use.system.redis=false", - "monitor.enabled=false", - "rqueue.retry.per.poll=4", - "periodic.job.queue.active=true", - "checkin.enabled=true", + "spring.data.redis.port=8015", + "mysql.db.name=JobCheckinTest", + "long.running.job.queue.active=true", + "use.system.redis=false", + "monitor.enabled=false", + "rqueue.retry.per.poll=4", + "periodic.job.queue.active=true", + "checkin.enabled=true", }) @SpringBootIntegrationTest class JobCheckinTest extends SpringTestBase { @@ -93,10 +93,14 @@ void jobMultipleExecution() throws TimedOutException { assertFalse(rqueueJobs.get(0).getCheckins().isEmpty()); assertTrue(rqueueJobs.get(0).getCheckins().size() > 1); assertEquals(4, rqueueJobs.get(0).getExecutions().size()); - assertEquals(ExecutionStatus.FAILED, rqueueJobs.get(0).getExecutions().get(0).getStatus()); - assertEquals(ExecutionStatus.FAILED, rqueueJobs.get(0).getExecutions().get(1).getStatus()); - assertEquals(ExecutionStatus.FAILED, rqueueJobs.get(0).getExecutions().get(2).getStatus()); - assertEquals(ExecutionStatus.SUCCESSFUL, rqueueJobs.get(0).getExecutions().get(3).getStatus()); + assertEquals( + ExecutionStatus.FAILED, rqueueJobs.get(0).getExecutions().get(0).getStatus()); + assertEquals( + ExecutionStatus.FAILED, rqueueJobs.get(0).getExecutions().get(1).getStatus()); + assertEquals( + ExecutionStatus.FAILED, rqueueJobs.get(0).getExecutions().get(2).getStatus()); + assertEquals( + ExecutionStatus.SUCCESSFUL, rqueueJobs.get(0).getExecutions().get(3).getStatus()); assertNotNull(rqueueJobs.get(0).getExecutions().get(0).getError()); assertNotNull(rqueueJobs.get(0).getExecutions().get(1).getError()); assertNotNull(rqueueJobs.get(0).getExecutions().get(2).getError()); diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ListenerConcurrencyTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ListenerConcurrencyTest.java index 7e4eb7d9..b526bdd5 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ListenerConcurrencyTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ListenerConcurrencyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -34,15 +34,15 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.job.durability.in-terminal-state=0", - "rqueue.job.enabled=false", - "rqueue.retry.per.poll=1", - "spring.data.redis.port=8022", - "job.queue.active=false", - "notification.queue.active=false", - "email.queue.active=false", - "sms.queue.concurrency=20-40", - "sms.queue.active=true", + "rqueue.job.durability.in-terminal-state=0", + "rqueue.job.enabled=false", + "rqueue.retry.per.poll=1", + "spring.data.redis.port=8022", + "job.queue.active=false", + "notification.queue.active=false", + "email.queue.active=false", + "sms.queue.concurrency=20-40", + "sms.queue.active=true", }) @SpringBootIntegrationTest @LocalTest diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageDeduplicationTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageDeduplicationTest.java index 603a084d..cb183a83 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageDeduplicationTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageDeduplicationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -32,7 +32,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; -import org.springframework.util.Assert; @SpringBootTest @ContextConfiguration(classes = Application.class) @@ -60,15 +59,13 @@ void enqueueUnique() throws TimedOutException { @Test void enqueueUniqueIn() throws TimedOutException { Notification notification = Notification.newInstance(); - Assertions.assertTrue( - rqueueMessageEnqueuer.enqueueUniqueIn( - notificationQueue, notification.getId(), notification, 1000L)); + Assertions.assertTrue(rqueueMessageEnqueuer.enqueueUniqueIn( + notificationQueue, notification.getId(), notification, 1000L)); Notification newNotification = Notification.newInstance(); newNotification.setId(notification.getId()); sleep(100); - Assertions.assertFalse( - rqueueMessageEnqueuer.enqueueUniqueIn( - notificationQueue, newNotification.getId(), newNotification, 1000L)); + Assertions.assertFalse(rqueueMessageEnqueuer.enqueueUniqueIn( + notificationQueue, newNotification.getId(), newNotification, 1000L)); waitFor(() -> getMessageCount(notificationQueue) == 0, 60_000, "notification to be sent"); Notification notificationFromDb = consumedMessageStore.getMessage(notification.getId(), Notification.class); diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageEnqueuerTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageEnqueuerTest.java index 0c70e030..9424504a 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageEnqueuerTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageEnqueuerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -40,26 +40,26 @@ @Slf4j @TestPropertySource( properties = { - "spring.data.redis.port=8008", - "mysql.db.name=MessageEnqueuerTest", - "rqueue.metrics.count.failure=false", - "rqueue.metrics.count.execution=false", - "sms.queue.active=true", - "sms.queue.group=sms-test", - "notification.queue.active=true", - "email.queue.active=true", - "job.queue.active=true", - "priority.mode=STRICT", - "reservation.queue.active=true", - "reservation.queue.group=", - "feed.generation.queue.active=true", - "feed.generation.queue.group=", - "chat.indexing.queue.active=true", - "chat.indexing.queue.group=", - "sms.queue.concurrency=5", - "reservation.queue.concurrency=2", - "feed.generation.queue.concurrency=1-5", - "chat.indexing.queue.concurrency=3-5" + "spring.data.redis.port=8008", + "mysql.db.name=MessageEnqueuerTest", + "rqueue.metrics.count.failure=false", + "rqueue.metrics.count.execution=false", + "sms.queue.active=true", + "sms.queue.group=sms-test", + "notification.queue.active=true", + "email.queue.active=true", + "job.queue.active=true", + "priority.mode=STRICT", + "reservation.queue.active=true", + "reservation.queue.group=", + "feed.generation.queue.active=true", + "feed.generation.queue.group=", + "chat.indexing.queue.active=true", + "chat.indexing.queue.group=", + "sms.queue.concurrency=5", + "reservation.queue.concurrency=2", + "feed.generation.queue.concurrency=1-5", + "chat.indexing.queue.concurrency=3-5" }) @SpringBootIntegrationTest class MessageEnqueuerTest extends SpringTestBase { @@ -74,9 +74,8 @@ void enqueueWithMessageId() throws TimedOutException { @Test void enqueueWithRetryWithMessageId() throws TimedOutException { ChatIndexing chatIndexing = ChatIndexing.newInstance(); - assertTrue( - rqueueMessageEnqueuer.enqueueWithRetry( - chatIndexingQueue, chatIndexing.getId(), chatIndexing, 3)); + assertTrue(rqueueMessageEnqueuer.enqueueWithRetry( + chatIndexingQueue, chatIndexing.getId(), chatIndexing, 3)); waitFor(() -> getMessageCount(chatIndexingQueue) == 0, "ChatIndexing to be done"); } @@ -97,9 +96,8 @@ void enqueueInWithMessageId() throws TimedOutException { @Test void enqueueInWithRetryWithMessageId() throws TimedOutException { Notification notification = Notification.newInstance(); - assertTrue( - rqueueMessageEnqueuer.enqueueInWithRetry( - notificationQueue, notification.getId(), notification, 3, 1000)); + assertTrue(rqueueMessageEnqueuer.enqueueInWithRetry( + notificationQueue, notification.getId(), notification, 3, 1000)); waitFor(() -> getMessageCount(notificationQueue) == 0, "notification to be consumed"); } @@ -114,12 +112,11 @@ void enqueueInWithPriorityWithMessageId() throws TimedOutException { @Test void enqueueAtWithMessageId() throws TimedOutException { FeedGeneration feedGeneration = FeedGeneration.newInstance(); - assertTrue( - rqueueMessageEnqueuer.enqueueAt( - feedGenerationQueue, - feedGeneration.getId(), - feedGeneration, - System.currentTimeMillis() + 1000)); + assertTrue(rqueueMessageEnqueuer.enqueueAt( + feedGenerationQueue, + feedGeneration.getId(), + feedGeneration, + System.currentTimeMillis() + 1000)); waitFor(() -> getMessageCount(feedGenerationQueue) == 0, "Feed to be generated"); } } diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageProcessorTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageProcessorTest.java index d792b9e3..4c3b8f68 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageProcessorTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MessageProcessorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -35,7 +35,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; -import org.springframework.util.Assert; @ContextConfiguration(classes = ApplicationWithMessageProcessor.class) @SpringBootTest diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MultiExecutionTests.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MultiExecutionTests.java index 34b6ba96..817ba5e6 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MultiExecutionTests.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MultiExecutionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -37,17 +37,17 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1", - "email.queue.retry.count=3", - "spring.data.redis.port=8017", - "mysql.db.name=MultiExecutionTests", - // 1500 ms - "email.execution.time=1500", - // 20 seconds is worker shutdown wait-time - "long.running.job.queue.visibility.timeout=35000", - "long.running.job.queue.active=true", - "use.system.redis=false", - "fixed.backoff.interval=100", + "rqueue.retry.per.poll=1", + "email.queue.retry.count=3", + "spring.data.redis.port=8017", + "mysql.db.name=MultiExecutionTests", + // 1500 ms + "email.execution.time=1500", + // 20 seconds is worker shutdown wait-time + "long.running.job.queue.visibility.timeout=35000", + "long.running.job.queue.active=true", + "use.system.redis=false", + "fixed.backoff.interval=100", }) @SpringBootIntegrationTest class MultiExecutionTests extends RetryTests { diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MultiRedisSetup.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MultiRedisSetup.java index bd0e5321..3c27cd8d 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MultiRedisSetup.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/MultiRedisSetup.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,11 +31,11 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1000", - "spring.data.redis.port=8005", - "spring.data.redis2.port=8006", - "spring.data.redis2.host=localhost", - "monitor.enabled=true", + "rqueue.retry.per.poll=1000", + "spring.data.redis.port=8005", + "spring.data.redis2.port=8006", + "spring.data.redis2.host=localhost", + "monitor.enabled=true", }) @SpringBootIntegrationTest class MultiRedisSetup extends RetryTests { diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/PauseUnpauseTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/PauseUnpauseTest.java index 06350ec3..9b206d64 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/PauseUnpauseTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/PauseUnpauseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -45,10 +45,10 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1", - "spring.data.redis.port=8021", - "mysql.db.name=PauseUnpauseTest", - "use.system.redis=false", + "rqueue.retry.per.poll=1", + "spring.data.redis.port=8021", + "mysql.db.name=PauseUnpauseTest", + "use.system.redis=false", }) @SpringBootIntegrationTest @Tag("redisCluster") @@ -56,6 +56,7 @@ class PauseUnpauseTest extends SpringTestBase { @Autowired private PauseUnpauseEventListener eventListener; + @Autowired private RqueueUtilityService rqueueUtilityService; @@ -63,7 +64,8 @@ class PauseUnpauseTest extends SpringTestBase { void onMessageNotification() throws TimedOutException { enqueue(notificationQueue, (i) -> Notification.newInstance(), 500, false); TimeoutUtils.waitFor( - () -> consumedMessageStore.getConsumedMessagesForQueue(notificationQueue).size() > 10, + () -> + consumedMessageStore.getConsumedMessagesForQueue(notificationQueue).size() > 10, "10 messages to be consumed"); log.info("Requesting to pause queue {}", notificationQueue); @@ -72,18 +74,22 @@ void onMessageNotification() throws TimedOutException { rqueueUtilityService.pauseUnpauseQueue(pauseRequest); TimeoutUtils.waitFor(() -> eventListener.getEventList().size() == 1, "pause event"); TimeoutUtils.sleep(Constants.ONE_MILLI); - int messageCount = consumedMessageStore.getConsumedMessagesForQueue(notificationQueue).size(); + int messageCount = + consumedMessageStore.getConsumedMessagesForQueue(notificationQueue).size(); AtomicValueHolder holder = new AtomicValueHolder<>(messageCount); TimeoutUtils.waitFor( () -> { - int newCount = consumedMessageStore.getConsumedMessagesForQueue(notificationQueue).size(); + int newCount = consumedMessageStore + .getConsumedMessagesForQueue(notificationQueue) + .size(); boolean eq = holder.get() == newCount; holder.set(newCount); return eq; }, "message consumer to stopped"); TimeoutUtils.sleep(Constants.ONE_MILLI); - messageCount = consumedMessageStore.getConsumedMessagesForQueue(notificationQueue).size(); + messageCount = + consumedMessageStore.getConsumedMessagesForQueue(notificationQueue).size(); assertEquals(holder.get(), messageCount); log.info("Re-request to pause queue {}", pauseRequest); @@ -100,7 +106,9 @@ void onMessageNotification() throws TimedOutException { TimeoutUtils.waitFor( () -> { - int newCount = consumedMessageStore.getConsumedMessagesForQueue(notificationQueue).size(); + int newCount = consumedMessageStore + .getConsumedMessagesForQueue(notificationQueue) + .size(); boolean neq = holder.get() != newCount; holder.set(newCount); return neq; diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/PeriodicMessageTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/PeriodicMessageTest.java index 3301af3c..101f94ce 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/PeriodicMessageTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/PeriodicMessageTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -45,13 +45,13 @@ @Slf4j @TestPropertySource( properties = { - "spring.data.redis.port=8013", - "mysql.db.name=PeriodicMessageTest", - "rqueue.metrics.count.failure=false", - "rqueue.metrics.count.execution=false", - "periodic.job.queue.active=true", - "use.system.redis=false", - "monitor.enabled=false" + "spring.data.redis.port=8013", + "mysql.db.name=PeriodicMessageTest", + "rqueue.metrics.count.failure=false", + "rqueue.metrics.count.execution=false", + "periodic.job.queue.active=true", + "use.system.redis=false", + "monitor.enabled=false" }) @SpringBootIntegrationTest class PeriodicMessageTest extends SpringTestBase { @@ -95,7 +95,6 @@ void periodicMessageMilliseconds() throws TimedOutException { rqueueMessageManager.deleteMessage(periodicJobQueue, messageId); } - @Test void testPeriodicMessageDelete() throws TimedOutException, InterruptedException { rqueueEventListener.clearQueue(); @@ -125,11 +124,11 @@ public void run() { assertEquals(l.get(0), consumedMessageStore.getConsumedMessageCount(job.getId())); assertTrue( // already scheduled job - 1 + l.get(1) == rqueueEventListener.getEventCount() || + 1 + l.get(1) == rqueueEventListener.getEventCount() + || // deleted just now, so no future scheduling l.get(1) == rqueueEventListener.getEventCount(), - () -> String.format("Event Count does not match %d %d", rqueueEventListener.getEventCount(), - l.get(1)) - ); + () -> String.format( + "Event Count does not match %d %d", rqueueEventListener.getEventCount(), l.get(1))); } } diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ProducerOnlyTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ProducerOnlyTest.java index ed40b324..f6af8d57 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ProducerOnlyTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ProducerOnlyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -61,7 +61,8 @@ private void validateQueue(Object message, String queue) { @Test void queueCount() { log.info("Rqueue System Mode {}", rqueueConfig.getMode()); - assertEquals(35, EndpointRegistry.getRegisteredQueueCount(), rqueueConfig.getMode().toString()); + assertEquals( + 35, EndpointRegistry.getRegisteredQueueCount(), rqueueConfig.getMode().toString()); for (int i = 0; i < 10; i++) { String queueName = "new_queue_" + i; // no listeners are attached so enqueue any thing diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveRestApiTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveRestApiTest.java index 1b5638b6..b02d6330 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveRestApiTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveRestApiTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -80,15 +80,15 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1000", - "spring.data.redis.port=8019", - "reservation.request.dead.letter.consumer.enabled=true", - "reservation.request.active=true", - "list.email.queue.enabled=true", - "mysql.db.name=ReactiveRestApiTest", - "use.system.redis=false", - "user.banned.queue.active=true", - "spring.main.web-application-type=reactive" + "rqueue.retry.per.poll=1000", + "spring.data.redis.port=8019", + "reservation.request.dead.letter.consumer.enabled=true", + "reservation.request.active=true", + "list.email.queue.enabled=true", + "mysql.db.name=ReactiveRestApiTest", + "use.system.redis=false", + "user.banned.queue.active=true", + "spring.main.web-application-type=reactive" }) @AutoConfigureWebTestClient @SpringBootIntegrationTest @@ -97,8 +97,10 @@ class ReactiveRestApiTest extends BasicListenerTest { @Autowired private WebTestClient webTestClient; + @Autowired private RqueueConfig rqueueConfig; + @Autowired private DeleteMessageListener deleteMessageListener; @@ -120,21 +122,20 @@ void verifyChartAndQueueData() throws Exception { void verifyChartLatency() { ChartDataRequest chartDataRequest = new ChartDataRequest(ChartType.LATENCY, AggregationType.DAILY); - ChartDataResponse dataResponse = - this.webTestClient - .post() - .uri("/rqueue/api/v1/chart") - .contentType(MediaType.APPLICATION_JSON) - .body(Mono.just(chartDataRequest), ChartDataRequest.class) - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(ChartDataResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + ChartDataResponse dataResponse = this.webTestClient + .post() + .uri("/rqueue/api/v1/chart") + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(chartDataRequest), ChartDataRequest.class) + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(ChartDataResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(dataResponse.getMessage()); assertEquals(0, dataResponse.getCode()); assertEquals(91, dataResponse.getData().size()); @@ -146,52 +147,49 @@ void verifyCompletedQueueData() throws Exception { request.setType(DataType.ZSET); request.setSrc(jobQueue); request.setName(queueDetail.getCompletedQueueName()); - DataViewResponse dataViewResponse = - this.webTestClient - .post() - .uri("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), QueueExploreRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(DataViewResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + DataViewResponse dataViewResponse = this.webTestClient + .post() + .uri("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), QueueExploreRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(DataViewResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(dataViewResponse.getMessage()); assertEquals(0, dataViewResponse.getCode()); assertEquals(20, dataViewResponse.getRows().size()); assertEquals(4, dataViewResponse.getRows().get(0).getColumns().size()); assertEquals( - Collections.singletonList( - new Action( - ActionType.DELETE, - String.format( - "Completed messages for queue '%s'", queueDetail.getCompletedQueueName()))), + Collections.singletonList(new Action( + ActionType.DELETE, + String.format( + "Completed messages for queue '%s'", queueDetail.getCompletedQueueName()))), dataViewResponse.getActions()); } void verifyChartStats() throws Exception { ChartDataRequest chartDataRequest = new ChartDataRequest(ChartType.STATS, AggregationType.DAILY); - ChartDataResponse dataResponse = - this.webTestClient - .post() - .uri("/rqueue/api/v1/chart") - .contentType(MediaType.APPLICATION_JSON) - .body(Mono.just(chartDataRequest), ChartDataRequest.class) - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(ChartDataResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + ChartDataResponse dataResponse = this.webTestClient + .post() + .uri("/rqueue/api/v1/chart") + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(chartDataRequest), ChartDataRequest.class) + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(ChartDataResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(dataResponse.getMessage()); assertEquals(0, dataResponse.getCode()); assertEquals(91, dataResponse.getData().size()); @@ -204,27 +202,25 @@ void exploreDataList() throws Exception { request.setType(DataType.LIST); request.setSrc(emailQueue); request.setName(emailDeadLetterQueue); - DataViewResponse dataViewResponse = - this.webTestClient - .post() - .uri("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), QueueExploreRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(DataViewResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + DataViewResponse dataViewResponse = this.webTestClient + .post() + .uri("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), QueueExploreRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(DataViewResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(dataViewResponse.getMessage()); assertEquals(0, dataViewResponse.getCode()); assertEquals( - Collections.singletonList( - new Action( - ActionType.DELETE, String.format("dead letter queue '%s'", emailDeadLetterQueue))), + Collections.singletonList(new Action( + ActionType.DELETE, String.format("dead letter queue '%s'", emailDeadLetterQueue))), dataViewResponse.getActions()); assertEquals(20, dataViewResponse.getRows().size()); assertEquals(4, dataViewResponse.getRows().get(0).getColumns().size()); @@ -240,21 +236,20 @@ void exploreDataZset() throws Exception { request.setType(DataType.ZSET); request.setSrc(emailQueue); request.setName(rqueueConfig.getScheduledQueueName(emailQueue)); - DataViewResponse dataViewResponse = - this.webTestClient - .post() - .uri("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), QueueExploreRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(DataViewResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + DataViewResponse dataViewResponse = this.webTestClient + .post() + .uri("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), QueueExploreRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(DataViewResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(dataViewResponse.getMessage()); assertEquals(0, dataViewResponse.getCode()); assertEquals(1, dataViewResponse.getActions().size()); @@ -274,21 +269,20 @@ void exploreDataProcessingQueue() throws Exception { request.setSrc(emailQueue); request.setName(processingSet); - DataViewResponse dataViewResponse = - this.webTestClient - .post() - .uri("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), QueueExploreRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(DataViewResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + DataViewResponse dataViewResponse = this.webTestClient + .post() + .uri("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), QueueExploreRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(DataViewResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(dataViewResponse.getMessage()); assertEquals(0, dataViewResponse.getCode()); assertEquals(0, dataViewResponse.getActions().size()); @@ -303,21 +297,20 @@ void deleteDataSet() throws Exception { DataDeleteRequest request = new DataDeleteRequest(); request.setQueueName(emailQueue); request.setDatasetName(emailDeadLetterQueue); - BooleanResponse booleanResponse = - this.webTestClient - .post() - .uri("/rqueue/api/v1/delete-queue-part") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), DataDeleteRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(BooleanResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + BooleanResponse booleanResponse = this.webTestClient + .post() + .uri("/rqueue/api/v1/delete-queue-part") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), DataDeleteRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(BooleanResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(booleanResponse.getMessage()); assertEquals(0, booleanResponse.getCode()); assertTrue(booleanResponse.isValue()); @@ -331,21 +324,20 @@ void dataType() throws Exception { enqueue(Email.newInstance(), emailDeadLetterQueue); DataTypeRequest request = new DataTypeRequest(); request.setName(emailDeadLetterQueue); - StringResponse response = - this.webTestClient - .post() - .uri("/rqueue/api/v1/data-type") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), DataTypeRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(StringResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + StringResponse response = this.webTestClient + .post() + .uri("/rqueue/api/v1/data-type") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), DataTypeRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(StringResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(response.getMessage()); assertEquals(0, response.getCode()); assertEquals("LIST", response.getVal()); @@ -356,21 +348,20 @@ void moveMessage() throws Exception { enqueue(emailDeadLetterQueue, i -> Email.newInstance(), 30, true); MessageMoveRequest request = new MessageMoveRequest(emailDeadLetterQueue, DataType.LIST, emailQueue, DataType.LIST); - MessageMoveResponse response = - this.webTestClient - .post() - .uri("/rqueue/api/v1/move-data") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), MessageMoveRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(MessageMoveResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + MessageMoveResponse response = this.webTestClient + .post() + .uri("/rqueue/api/v1/move-data") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), MessageMoveRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(MessageMoveResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertNull(response.getMessage()); assertEquals(0, response.getCode()); assertEquals(100, response.getNumberOfMessageTransferred()); @@ -383,21 +374,20 @@ void viewData() throws Exception { DateViewRequest dateViewRequest = new DateViewRequest(); dateViewRequest.setName(emailDeadLetterQueue); dateViewRequest.setType(DataType.LIST); - DataViewResponse dataViewResponse = - this.webTestClient - .post() - .uri("/rqueue/api/v1/view-data") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(dateViewRequest), DateViewRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(DataViewResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + DataViewResponse dataViewResponse = this.webTestClient + .post() + .uri("/rqueue/api/v1/view-data") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(dateViewRequest), DateViewRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(DataViewResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertEquals(0, dataViewResponse.getCode()); assertEquals(Collections.emptyList(), dataViewResponse.getActions()); assertEquals(20, dataViewResponse.getRows().size()); @@ -410,21 +400,20 @@ void deleteQueue() throws Exception { } DataTypeRequest request = new DataTypeRequest(); request.setName(jobQueue); - BaseResponse response = - this.webTestClient - .post() - .uri("/rqueue/api/v1/delete-queue") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), DataTypeRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(BaseResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + BaseResponse response = this.webTestClient + .post() + .uri("/rqueue/api/v1/delete-queue") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), DataTypeRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(BaseResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertEquals(0, response.getCode()); assertEquals("Queue deleted", response.getMessage()); } @@ -434,32 +423,29 @@ void deleteMessage() throws Exception { Email email = Email.newInstance(); deleteMessageListener.clear(); enqueueIn(emailQueue, email, 10 * Constants.ONE_MILLI); - RqueueMessage message = - rqueueMessageTemplate - .readFromZset(rqueueConfig.getScheduledQueueName(emailQueue), 0, -1) - .get(0); + RqueueMessage message = rqueueMessageTemplate + .readFromZset(rqueueConfig.getScheduledQueueName(emailQueue), 0, -1) + .get(0); MessageDeleteRequest request = new MessageDeleteRequest(); request.setMessageId(message.getId()); request.setQueueName(emailQueue); - BaseResponse response = - this.webTestClient - .post() - .uri("/rqueue/api/v1/delete-message") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - .body(Mono.just(request), MessageDeleteRequest.class) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(BooleanResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + BaseResponse response = this.webTestClient + .post() + .uri("/rqueue/api/v1/delete-message") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .body(Mono.just(request), MessageDeleteRequest.class) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(BooleanResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertEquals(0, response.getCode()); - Object metadata = - stringRqueueRedisTemplate.get( - RqueueMessageUtils.getMessageMetaId(emailQueue, message.getId())); + Object metadata = stringRqueueRedisTemplate.get( + RqueueMessageUtils.getMessageMetaId(emailQueue, message.getId())); assertTrue(((MessageMetadata) metadata).isDeleted()); TimeoutUtils.waitFor( () -> { @@ -481,19 +467,18 @@ void jobsData() throws Exception { Constants.SECONDS_IN_A_MINUTE * Constants.ONE_MILLI, "notifications to be sent"); String messageId = messageIds.get(random.nextInt(messageIds.size())); - DataViewResponse response = - this.webTestClient - .get() - .uri("/rqueue/api/v1/jobs?message-id=" + messageId) - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(DataViewResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + DataViewResponse response = this.webTestClient + .get() + .uri("/rqueue/api/v1/jobs?message-id=" + messageId) + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(DataViewResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertEquals(0, response.getCode()); assertEquals(6, response.getHeaders().size()); assertEquals(1, response.getRows().size()); @@ -502,19 +487,18 @@ void jobsData() throws Exception { assertNotNull(column.getValue(), column.toString()); assertEquals(TableColumnType.DISPLAY, column.getType()); } - response = - this.webTestClient - .get() - .uri("/rqueue/api/v1/jobs?message-id=" + UUID.randomUUID().toString()) - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(DataViewResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + response = this.webTestClient + .get() + .uri("/rqueue/api/v1/jobs?message-id=" + UUID.randomUUID().toString()) + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(DataViewResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertEquals(0, response.getCode()); assertEquals("No jobs found", response.getMessage()); assertNull(response.getHeaders()); @@ -523,19 +507,18 @@ void jobsData() throws Exception { @Test void aggregateDataSelector() throws Exception { - DataSelectorResponse response = - this.webTestClient - .get() - .uri("/rqueue/api/v1/aggregate-data-selector?type=" + AggregationType.WEEKLY) - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(DataSelectorResponse.class) - .getResponseBody() - .collectList() - .block() - .get(0); + DataSelectorResponse response = this.webTestClient + .get() + .uri("/rqueue/api/v1/aggregate-data-selector?type=" + AggregationType.WEEKLY) + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(DataSelectorResponse.class) + .getResponseBody() + .collectList() + .block() + .get(0); assertEquals(0, response.getCode()); assertEquals("Select Number of Weeks", response.getTitle()); assertEquals(14, response.getData().size()); diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveWebDisabledTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveWebDisabledTest.java index 2a416d97..08dfc1a8 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveWebDisabledTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveWebDisabledTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -51,17 +51,17 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1000", - "spring.data.redis.port=8018", - "reservation.request.dead.letter.consumer.enabled=true", - "reservation.request.active=true", - "list.email.queue.enabled=true", - "mysql.db.name=ReactiveWebDisabledTest", - "use.system.redis=false", - "user.banned.queue.active=true", - "spring.main.web-application-type=reactive", - "rqueue.reactive.enabled=true", - "rqueue.web.enable=false", + "rqueue.retry.per.poll=1000", + "spring.data.redis.port=8018", + "reservation.request.dead.letter.consumer.enabled=true", + "reservation.request.active=true", + "list.email.queue.enabled=true", + "mysql.db.name=ReactiveWebDisabledTest", + "use.system.redis=false", + "user.banned.queue.active=true", + "spring.main.web-application-type=reactive", + "rqueue.reactive.enabled=true", + "rqueue.web.enable=false", }) @AutoConfigureWebTestClient @SpringBootIntegrationTest @@ -74,16 +74,16 @@ class ReactiveWebDisabledTest extends BasicListenerTest { @ParameterizedTest @ValueSource( strings = { - "", - "/queues", - "/running", - "/scheduled", - "/dead", - "/pending", - "/utility", - "/queues/test-queue", - "/api/v1/aggregate-data-selector?type=WEEKLY", - "/api/v1/jobs?message-id=1234567890" + "", + "/queues", + "/running", + "/scheduled", + "/dead", + "/pending", + "/utility", + "/queues/test-queue", + "/api/v1/aggregate-data-selector?type=WEEKLY", + "/api/v1/jobs?message-id=1234567890" }) void testPath(String path) throws Exception { this.webTestClient diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveWebViewTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveWebViewTest.java index 94f5a03b..eee93e7d 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveWebViewTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/ReactiveWebViewTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -43,12 +43,12 @@ @Slf4j @TestPropertySource( properties = { - "rqueue.retry.per.poll=1000", - "spring.data.redis.port=8020", - "list.email.queue.enabled=true", - "mysql.db.name=ReactiveWebTest", - "use.system.redis=false", - "spring.main.web-application-type=reactive" + "rqueue.retry.per.poll=1000", + "spring.data.redis.port=8020", + "list.email.queue.enabled=true", + "mysql.db.name=ReactiveWebTest", + "use.system.redis=false", + "spring.main.web-application-type=reactive" }) @SpringBootIntegrationTest @EnabledIfEnvironmentVariable(named = "RQUEUE_REACTIVE_ENABLED", matches = "true") @@ -58,8 +58,10 @@ class ReactiveWebViewTest extends BasicListenerTest { @Autowired private WebTestClient webTestClient; + @Autowired private RqueueConfig rqueueConfig; + private boolean initialized = false; private void initialize() throws TimedOutException { @@ -84,105 +86,97 @@ public void init() throws TimedOutException { @Test void home() throws Exception { - FluxExchangeResult result = - this.webTestClient - .get() - .uri("/rqueue") - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(String.class); + FluxExchangeResult result = this.webTestClient + .get() + .uri("/rqueue") + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(String.class); List body = result.getResponseBody().collectList().block(); } @Test void queues() throws Exception { - FluxExchangeResult result = - this.webTestClient - .get() - .uri("/rqueue/queues") - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(String.class); + FluxExchangeResult result = this.webTestClient + .get() + .uri("/rqueue/queues") + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(String.class); List body = result.getResponseBody().collectList().block(); } @Test void queueDetail() throws Exception { - FluxExchangeResult result = - this.webTestClient - .get() - .uri("/rqueue/queues/" + emailQueue) - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(String.class); + FluxExchangeResult result = this.webTestClient + .get() + .uri("/rqueue/queues/" + emailQueue) + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(String.class); List body = result.getResponseBody().collectList().block(); } @Test void running() throws Exception { - FluxExchangeResult result = - this.webTestClient - .get() - .uri("/rqueue/running") - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(String.class); + FluxExchangeResult result = this.webTestClient + .get() + .uri("/rqueue/running") + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(String.class); List body = result.getResponseBody().collectList().block(); } @Test void scheduled() throws Exception { - FluxExchangeResult result = - this.webTestClient - .get() - .uri("/rqueue/scheduled") - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(String.class); + FluxExchangeResult result = this.webTestClient + .get() + .uri("/rqueue/scheduled") + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(String.class); List body = result.getResponseBody().collectList().block(); } @Test void dead() throws Exception { - FluxExchangeResult result = - this.webTestClient - .get() - .uri("/rqueue/dead") - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(String.class); + FluxExchangeResult result = this.webTestClient + .get() + .uri("/rqueue/dead") + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(String.class); List body = result.getResponseBody().collectList().block(); } @Test void pending() throws Exception { - FluxExchangeResult result = - this.webTestClient - .get() - .uri("/rqueue/pending") - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(String.class); + FluxExchangeResult result = this.webTestClient + .get() + .uri("/rqueue/pending") + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(String.class); List body = result.getResponseBody().collectList().block(); } @Test void utility() throws Exception { - FluxExchangeResult result = - this.webTestClient - .get() - .uri("/rqueue/utility") - .exchange() - .expectStatus() - .is2xxSuccessful() - .returnResult(String.class); + FluxExchangeResult result = this.webTestClient + .get() + .uri("/rqueue/utility") + .exchange() + .expectStatus() + .is2xxSuccessful() + .returnResult(String.class); List body = result.getResponseBody().collectList().block(); } } diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RedisClusterTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RedisClusterTest.java index 105291bb..5e735a4b 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RedisClusterTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RedisClusterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RqueueMessageManagerTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RqueueMessageManagerTest.java index 628f6706..f1387273 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RqueueMessageManagerTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RqueueMessageManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -37,9 +37,9 @@ @Slf4j @TestPropertySource( properties = { - "use.system.redis=false", - "spring.data.redis.port=8014", - "monitor.enabled=true", + "use.system.redis=false", + "spring.data.redis.port=8014", + "monitor.enabled=true", }) @SpringBootIntegrationTest @Tag("local") @@ -57,12 +57,10 @@ void deleteAll() throws TimedOutException { 30_000L, 500L, "all messages to be deleted", - () -> { - }); + () -> {}); TimeoutUtils.waitFor( - () -> - CollectionUtils.isEmpty( - stringRqueueRedisTemplate.getRedisTemplate().keys("__rq::m-mdata::*")), + () -> CollectionUtils.isEmpty( + stringRqueueRedisTemplate.getRedisTemplate().keys("__rq::m-mdata::*")), 15_000L, "metadata deletion"); } diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RqueueMessageTemplateTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RqueueMessageTemplateTest.java index 6085cb7e..cbc45661 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RqueueMessageTemplateTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/integration/RqueueMessageTemplateTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/unit/RqueueListenerAutoConfigTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/unit/RqueueListenerAutoConfigTest.java index 77528c0e..88e2125b 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/unit/RqueueListenerAutoConfigTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/unit/RqueueListenerAutoConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -47,14 +47,19 @@ class RqueueListenerAutoConfigTest extends TestBase { @Mock private SimpleRqueueListenerContainerFactory simpleRqueueListenerContainerFactory; + @Mock private BeanFactory beanFactory; + @Mock private RqueueMessageTemplate messageTemplate; + @Mock private RqueueMessageHandler rqueueMessageHandler; + @Mock private RedisConnectionFactory redisConnectionFactory; + @InjectMocks private RqueueListenerAutoConfig rqueueMessageAutoConfig; @@ -87,7 +92,8 @@ void rqueueMessageHandlerReused() true); FieldUtils.writeField(messageAutoConfig, "simpleRqueueListenerContainerFactory", factory, true); assertEquals( - rqueueMessageHandler.hashCode(), messageAutoConfig.rqueueMessageHandler().hashCode()); + rqueueMessageHandler.hashCode(), + messageAutoConfig.rqueueMessageHandler().hashCode()); } @Test diff --git a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/unit/RqueueMetricsAutoConfigTest.java b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/unit/RqueueMetricsAutoConfigTest.java index da2f64e9..9dd1938c 100644 --- a/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/unit/RqueueMetricsAutoConfigTest.java +++ b/rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/tests/unit/RqueueMetricsAutoConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/DeleteMessageListener.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/DeleteMessageListener.java index f3c0089a..f32f4598 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/DeleteMessageListener.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/DeleteMessageListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/MessageListener.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/MessageListener.java index 49f58c65..efa7ee6e 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/MessageListener.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/MessageListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2024 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ package com.github.sonus21.rqueue.test; +import static org.junit.jupiter.api.Assertions.assertTrue; + import com.github.sonus21.rqueue.annotation.RqueueListener; import com.github.sonus21.rqueue.config.RqueueConfig; import com.github.sonus21.rqueue.core.RqueueMessage; @@ -25,13 +27,6 @@ import com.github.sonus21.rqueue.test.service.FailureManager; import com.github.sonus21.rqueue.utils.TimeoutUtils; import jakarta.annotation.PostConstruct; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.messaging.handler.annotation.Header; -import org.springframework.messaging.handler.annotation.Payload; import java.lang.ref.WeakReference; import java.time.Duration; import java.util.List; @@ -39,10 +34,15 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; import tools.jackson.core.JacksonException; -import static org.junit.jupiter.api.Assertions.assertTrue; - @com.github.sonus21.rqueue.annotation.MessageListener @RequiredArgsConstructor(onConstructor = @__(@Autowired)) @Slf4j @@ -50,10 +50,13 @@ public class MessageListener { @NonNull private final ConsumedMessageStore consumedMessageStore; + @NonNull private final FailureManager failureManager; + @NonNull private final RqueueConfig rqueueConfig; + private ScheduledExecutorService scheduledExecutorService; @Value("${job.queue.name}") @@ -111,7 +114,6 @@ public static class DoNotRetryException extends Exception { public DoNotRetryException(String message) { super(message); } - } public static class DoNotRetry2Exception extends Exception { @@ -119,7 +121,6 @@ public static class DoNotRetry2Exception extends Exception { public DoNotRetry2Exception(String message) { super(message); } - } @RqueueListener( diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/PauseUnpauseEventListener.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/PauseUnpauseEventListener.java index c65c2851..faddb090 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/PauseUnpauseEventListener.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/PauseUnpauseEventListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/UserBannedMessageListener.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/UserBannedMessageListener.java index a5f3a4dc..6fb73309 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/UserBannedMessageListener.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/UserBannedMessageListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationBasicConfiguration.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationBasicConfiguration.java index cd4849fb..6138f46e 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationBasicConfiguration.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationBasicConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -58,18 +58,16 @@ public abstract class ApplicationBasicConfiguration extends RedisBootstrapperBas protected void init() throws IOException { final BootstrapRedis bootstrapRedis = - Javanna.createAnnotation( - BootstrapRedis.class, - new HashMap() { - private static final long serialVersionUID = -786051705319430908L; + Javanna.createAnnotation(BootstrapRedis.class, new HashMap() { + private static final long serialVersionUID = -786051705319430908L; - { - put("port", redisPort); - put("monitorRedis", monitoringEnabled); - put("monitorThreadsCount", monitorThreads); - put("systemRedis", useSystemRedis); - } - }); + { + put("port", redisPort); + put("monitorRedis", monitoringEnabled); + put("monitorThreadsCount", monitorThreads); + put("systemRedis", useSystemRedis); + } + }); super.bootstrap(bootstrapRedis); } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithCustomMessageConverter.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithCustomMessageConverter.java index 612856d4..806c960f 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithCustomMessageConverter.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithCustomMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -54,11 +54,8 @@ public SimpleRqueueListenerContainerFactory simpleRqueueListenerContainerFactory simpleRqueueListenerContainerFactory.setReactiveRedisConnectionFactory( redisConnectionFactory); } - MessageHeaders messageHeaders = - new MessageHeaders( - Collections.singletonMap( - MessageHeaders.CONTENT_TYPE, - new MimeType("application", "json", StandardCharsets.UTF_8))); + MessageHeaders messageHeaders = new MessageHeaders(Collections.singletonMap( + MessageHeaders.CONTENT_TYPE, new MimeType("application", "json", StandardCharsets.UTF_8))); simpleRqueueListenerContainerFactory.setMessageHeaders(messageHeaders); return simpleRqueueListenerContainerFactory; } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithMessageProcessor.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithMessageProcessor.java index 9033b0a4..c66bb90d 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithMessageProcessor.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithMessageProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2025 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -51,10 +51,13 @@ public TestMessageProcessor discardMessageProcessor() { @Bean public SimpleRqueueListenerContainerFactory simpleRqueueListenerContainerFactory( @Qualifier("preExecutionMessageProcessor") TestMessageProcessor preExecutionMessageProcessor, - @Qualifier("postExecutionMessageProcessor") TestMessageProcessor postExecutionMessageProcessor, - @Qualifier("manualDeletionMessageProcessor") TestMessageProcessor manualDeletionMessageProcessor, + @Qualifier("postExecutionMessageProcessor") + TestMessageProcessor postExecutionMessageProcessor, + @Qualifier("manualDeletionMessageProcessor") + TestMessageProcessor manualDeletionMessageProcessor, @Qualifier("discardMessageProcessor") TestMessageProcessor discardMessageProcessor, - @Qualifier("deadLetterQueueMessageProcessor") TestMessageProcessor deadLetterQueueMessageProcessor) { + @Qualifier("deadLetterQueueMessageProcessor") + TestMessageProcessor deadLetterQueueMessageProcessor) { SimpleRqueueListenerContainerFactory factory = new SimpleRqueueListenerContainerFactory(); factory.setInspectAllBean(false); factory.setPreExecutionMessageProcessor(preExecutionMessageProcessor); diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithMiddleware.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithMiddleware.java index 0bab46f2..2acbd24c 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithMiddleware.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/ApplicationWithMiddleware.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/BaseApplication.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/BaseApplication.java index 06034fee..85264eac 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/BaseApplication.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/BaseApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -18,12 +18,12 @@ import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; +import java.io.IOException; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import java.io.IOException; @Slf4j public abstract class BaseApplication extends ApplicationBasicConfiguration { diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/BaseApplicationWithBackoff.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/BaseApplicationWithBackoff.java index 4cdfe4b1..3d3b17d8 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/BaseApplicationWithBackoff.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/BaseApplicationWithBackoff.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -22,9 +22,9 @@ import com.github.sonus21.rqueue.utils.backoff.TaskExecutionBackOff; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; +import java.io.IOException; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; -import java.io.IOException; public abstract class BaseApplicationWithBackoff extends ApplicationBasicConfiguration { diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/MultiRedisSprigBaseApplication.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/MultiRedisSprigBaseApplication.java index a40c1062..715339d1 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/MultiRedisSprigBaseApplication.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/MultiRedisSprigBaseApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import com.github.sonus21.rqueue.config.SimpleRqueueListenerContainerFactory; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; +import java.io.IOException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -27,7 +28,6 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import redis.embedded.RedisServer; -import java.io.IOException; @Slf4j public abstract class MultiRedisSprigBaseApplication extends ApplicationBasicConfiguration { diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/RedisClusterBaseApplication.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/RedisClusterBaseApplication.java index 9ee5024f..6d8db170 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/RedisClusterBaseApplication.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/application/RedisClusterBaseApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/common/SpringTestBase.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/common/SpringTestBase.java index 340d07d3..0e946b8a 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/common/SpringTestBase.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/common/SpringTestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -19,15 +19,12 @@ import com.github.sonus21.TestBase; import com.github.sonus21.rqueue.common.RqueueRedisTemplate; import com.github.sonus21.rqueue.config.RqueueConfig; -import com.github.sonus21.rqueue.config.RqueueWebConfig; import com.github.sonus21.rqueue.core.EndpointRegistry; import com.github.sonus21.rqueue.core.ReactiveRqueueMessageEnqueuer; import com.github.sonus21.rqueue.core.RqueueEndpointManager; import com.github.sonus21.rqueue.core.RqueueMessage; import com.github.sonus21.rqueue.core.RqueueMessageEnqueuer; import com.github.sonus21.rqueue.core.RqueueMessageManager; -import com.github.sonus21.rqueue.core.RqueueMessageManager; -import com.github.sonus21.rqueue.core.RqueueMessageManager; import com.github.sonus21.rqueue.core.RqueueMessageTemplate; import com.github.sonus21.rqueue.core.support.RqueueMessageUtils; import com.github.sonus21.rqueue.dao.RqueueJobDao; @@ -58,24 +55,50 @@ @Slf4j public abstract class SpringTestBase extends TestBase { - @Autowired protected RqueueMessageTemplate rqueueMessageTemplate; - @Autowired protected RqueueConfig rqueueConfig; - @Autowired protected RqueueRedisTemplate stringRqueueRedisTemplate; - @Autowired protected ConsumedMessageStore consumedMessageStore; - @Autowired protected RqueueMessageListenerContainer rqueueMessageListenerContainer; - @Autowired protected FailureManager failureManager; - @Autowired protected RqueueMessageEnqueuer rqueueMessageEnqueuer; - @Autowired protected RqueueEventListener rqueueEventListener; + @Autowired + protected RqueueMessageTemplate rqueueMessageTemplate; + + @Autowired + protected RqueueConfig rqueueConfig; + + @Autowired + protected RqueueRedisTemplate stringRqueueRedisTemplate; + + @Autowired + protected ConsumedMessageStore consumedMessageStore; + + @Autowired + protected RqueueMessageListenerContainer rqueueMessageListenerContainer; + + @Autowired + protected FailureManager failureManager; + + @Autowired + protected RqueueMessageEnqueuer rqueueMessageEnqueuer; + + @Autowired + protected RqueueEventListener rqueueEventListener; @Autowired(required = false) protected ReactiveRqueueMessageEnqueuer reactiveRqueueMessageEnqueuer; - @Autowired protected RqueueEndpointManager rqueueEndpointManager; - @Autowired protected RqueueMessageManager rqueueMessageManager; - @Autowired protected RqueueJobDao rqueueJobDao; - @Autowired protected RqueueMessageMetadataService rqueueMessageMetadataService; - @Autowired protected ObjectMapper objectMapper; - @Autowired protected RqueueQueueMetrics rqueueQueueMetrics; + @Autowired + protected RqueueEndpointManager rqueueEndpointManager; + + @Autowired + protected RqueueMessageManager rqueueMessageManager; + + @Autowired + protected RqueueJobDao rqueueJobDao; + + @Autowired + protected RqueueMessageMetadataService rqueueMessageMetadataService; + + @Autowired + protected ObjectMapper objectMapper; + + @Autowired + protected RqueueQueueMetrics rqueueQueueMetrics; @Value("${email.queue.name}") protected String emailQueue; @@ -135,9 +158,8 @@ public abstract class SpringTestBase extends TestBase { protected boolean reactiveEnabled; protected void enqueue(Object message, String queueName) { - RqueueMessage rqueueMessage = - RqueueMessageUtils.buildMessage( - rqueueMessageManager.getMessageConverter(), queueName, null, message, null, null, null); + RqueueMessage rqueueMessage = RqueueMessageUtils.buildMessage( + rqueueMessageManager.getMessageConverter(), queueName, null, message, null, null, null); rqueueMessageTemplate.addMessage(queueName, rqueueMessage); } @@ -145,15 +167,14 @@ protected void enqueue(String queueName, Factory factory, int n, boolean useMess for (int i = 0; i < n; i++) { Object message = factory.next(i); if (useMessageTemplate) { - RqueueMessage rqueueMessage = - RqueueMessageUtils.buildMessage( - rqueueMessageManager.getMessageConverter(), - queueName, - null, - message, - null, - null, - rqueueMessageListenerContainer.getMessageHeaders()); + RqueueMessage rqueueMessage = RqueueMessageUtils.buildMessage( + rqueueMessageManager.getMessageConverter(), + queueName, + null, + message, + null, + null, + rqueueMessageListenerContainer.getMessageHeaders()); rqueueMessageTemplate.addMessage(queueName, rqueueMessage); } else { enqueue(queueName, message); @@ -167,15 +188,14 @@ protected void enqueueIn( Object message = factory.next(i); long delay = delayFunc.getDelay(i); if (useMessageTemplate) { - RqueueMessage rqueueMessage = - RqueueMessageUtils.buildMessage( - rqueueMessageManager.getMessageConverter(), - queueName, - null, - message, - null, - delay, - null); + RqueueMessage rqueueMessage = RqueueMessageUtils.buildMessage( + rqueueMessageManager.getMessageConverter(), + queueName, + null, + message, + null, + delay, + null); rqueueMessageTemplate.addToZset(queueName, rqueueMessage, rqueueMessage.getProcessAt()); } else { enqueueIn(queueName, message, delay); @@ -184,9 +204,8 @@ protected void enqueueIn( } protected void enqueueIn(Object message, String zsetName, long delay) { - RqueueMessage rqueueMessage = - RqueueMessageUtils.buildMessage( - rqueueMessageManager.getMessageConverter(), zsetName, null, message, null, delay, null); + RqueueMessage rqueueMessage = RqueueMessageUtils.buildMessage( + rqueueMessageManager.getMessageConverter(), zsetName, null, message, null, delay, null); rqueueMessageTemplate.addToZset(zsetName, rqueueMessage, rqueueMessage.getProcessAt()); } @@ -270,14 +289,20 @@ protected boolean enqueue(String queueName, Object message) { protected boolean enqueueAt(String queueName, Object message, Date instant) { if (reactiveEnabled) { - return reactiveRqueueMessageEnqueuer.enqueueAt(queueName, message, instant).block() != null; + return reactiveRqueueMessageEnqueuer + .enqueueAt(queueName, message, instant) + .block() + != null; } return rqueueMessageEnqueuer.enqueueAt(queueName, message, instant) != null; } protected boolean enqueueAt(String queueName, Object message, Instant instant) { if (reactiveEnabled) { - return reactiveRqueueMessageEnqueuer.enqueueAt(queueName, message, instant).block() != null; + return reactiveRqueueMessageEnqueuer + .enqueueAt(queueName, message, instant) + .block() + != null; } return rqueueMessageEnqueuer.enqueueAt(queueName, message, instant) != null; } @@ -305,7 +330,9 @@ protected boolean enqueueIn(String queueName, Object message, long delay) { protected boolean enqueueIn(String queueName, Object message, long delay, TimeUnit timeUnit) { if (reactiveEnabled) { - return reactiveRqueueMessageEnqueuer.enqueueIn(queueName, message, delay, timeUnit).block() + return reactiveRqueueMessageEnqueuer + .enqueueIn(queueName, message, delay, timeUnit) + .block() != null; } return rqueueMessageEnqueuer.enqueueIn(queueName, message, delay, timeUnit) != null; @@ -313,14 +340,19 @@ protected boolean enqueueIn(String queueName, Object message, long delay, TimeUn protected boolean enqueueIn(String queueName, Object message, Duration duration) { if (reactiveEnabled) { - return reactiveRqueueMessageEnqueuer.enqueueIn(queueName, message, duration).block() != null; + return reactiveRqueueMessageEnqueuer + .enqueueIn(queueName, message, duration) + .block() + != null; } return rqueueMessageEnqueuer.enqueueIn(queueName, message, duration) != null; } protected boolean enqueueWithPriority(String queueName, String priority, Object message) { if (reactiveEnabled) { - return reactiveRqueueMessageEnqueuer.enqueueWithPriority(queueName, priority, message).block() + return reactiveRqueueMessageEnqueuer + .enqueueWithPriority(queueName, priority, message) + .block() != null; } return rqueueMessageEnqueuer.enqueueWithPriority(queueName, priority, message) != null; @@ -397,7 +429,9 @@ protected boolean enqueueAtWithPriority( protected boolean enqueueWithRetry(String queueName, Object message, int retry) { if (reactiveEnabled) { - return reactiveRqueueMessageEnqueuer.enqueueWithRetry(queueName, message, retry).block() + return reactiveRqueueMessageEnqueuer + .enqueueWithRetry(queueName, message, retry) + .block() != null; } return rqueueMessageEnqueuer.enqueueWithRetry(queueName, message, retry) != null; diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/common/SpringWebTestBase.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/common/SpringWebTestBase.java index 1d576be1..38c44bb3 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/common/SpringWebTestBase.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/common/SpringWebTestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -34,20 +34,20 @@ public abstract class SpringWebTestBase extends SpringTestBase { protected WebClient webClient; protected MockMvc mockMvc; + @Autowired protected ObjectMapper mapper; + @Autowired ApplicationContext applicationContext; @BeforeEach public void init() { if (reactiveEnabled) { - webClient = - WebClient.builder() - .clientConnector( - new HttpHandlerConnector( - WebHttpHandlerBuilder.applicationContext(applicationContext).build())) - .build(); + webClient = WebClient.builder() + .clientConnector(new HttpHandlerConnector( + WebHttpHandlerBuilder.applicationContext(applicationContext).build())) + .build(); } else { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/BaseQueueMessage.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/BaseQueueMessage.java index 51c17362..240dce77 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/BaseQueueMessage.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/BaseQueueMessage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/ChatIndexing.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/ChatIndexing.java index f516a19b..061ba70b 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/ChatIndexing.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/ChatIndexing.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Email.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Email.java index bfb14376..30f63941 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Email.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Email.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/FeedGeneration.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/FeedGeneration.java index b399061d..86e15ea9 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/FeedGeneration.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/FeedGeneration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Job.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Job.java index f43fd58d..f3349980 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Job.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Job.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/LongRunningJob.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/LongRunningJob.java index 832c5941..45b45946 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/LongRunningJob.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/LongRunningJob.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Notification.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Notification.java index 3c172bd4..518af8f2 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Notification.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Notification.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/OrderConfirmation.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/OrderConfirmation.java index 28713d0d..e7491b9e 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/OrderConfirmation.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/OrderConfirmation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -37,9 +37,8 @@ public class OrderConfirmation extends BaseQueueMessage { private long timestamp; public static OrderConfirmation newInstance() { - OrderConfirmation orderConfirmation = - new OrderConfirmation( - UUID.randomUUID().toString(), UUID.randomUUID().toString(), System.currentTimeMillis()); + OrderConfirmation orderConfirmation = new OrderConfirmation( + UUID.randomUUID().toString(), UUID.randomUUID().toString(), System.currentTimeMillis()); orderConfirmation.setId(UUID.randomUUID().toString()); return orderConfirmation; } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/PeriodicJob.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/PeriodicJob.java index aa7c5994..72404cf4 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/PeriodicJob.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/PeriodicJob.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Reservation.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Reservation.java index 4b9c7e4c..0135973b 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Reservation.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Reservation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/ReservationRequest.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/ReservationRequest.java index 12ed9b2f..29873133 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/ReservationRequest.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/ReservationRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Sms.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Sms.java index 1ef93071..7988fced 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Sms.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/Sms.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/UserBanned.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/UserBanned.java index 7f261f1a..d9d6485b 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/UserBanned.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/dto/UserBanned.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/entity/ConsumedMessage.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/entity/ConsumedMessage.java index a9ee2d49..1482859e 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/entity/ConsumedMessage.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/entity/ConsumedMessage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -40,9 +40,9 @@ @Table( name = "consumed_messages", uniqueConstraints = { - @UniqueConstraint( - name = "message_id_and_tag_unique", - columnNames = {"message_id", "tag"}) + @UniqueConstraint( + name = "message_id_and_tag_unique", + columnNames = {"message_id", "tag"}) }) public class ConsumedMessage { diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/entity/FailureDetail.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/entity/FailureDetail.java index ec3df0a1..200e0895 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/entity/FailureDetail.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/entity/FailureDetail.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -36,8 +36,10 @@ public class FailureDetail { // if minFailureCount is -1 then fail always @Column private int minFailureCount; + @Column private int maxFailureCount; + @Column private int failureCount; } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/repository/ConsumedMessageRepository.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/repository/ConsumedMessageRepository.java index efb18824..cb8094a7 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/repository/ConsumedMessageRepository.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/repository/ConsumedMessageRepository.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/repository/FailureDetailRepository.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/repository/FailureDetailRepository.java index 94139460..0ba35fbf 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/repository/FailureDetailRepository.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/repository/FailureDetailRepository.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -19,6 +19,4 @@ import com.github.sonus21.rqueue.test.entity.FailureDetail; import org.springframework.data.repository.CrudRepository; -public interface FailureDetailRepository extends CrudRepository { - -} +public interface FailureDetailRepository extends CrudRepository {} diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/ConsumedMessageStore.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/ConsumedMessageStore.java index df3dbc2c..8de14b8d 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/ConsumedMessageStore.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/ConsumedMessageStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2025 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -38,15 +38,17 @@ @Slf4j public class ConsumedMessageStore { - @NonNull private final ConsumedMessageRepository consumedMessageRepository; - @NonNull private final ObjectMapper objectMapper; + @NonNull + private final ConsumedMessageRepository consumedMessageRepository; + + @NonNull + private final ObjectMapper objectMapper; public void deleteAll() { consumedMessageRepository.deleteAll(); } - public void save(BaseQueueMessage message, Object tag, String queueName) - throws JacksonException { + public void save(BaseQueueMessage message, Object tag, String queueName) throws JacksonException { log.info("Queue '{}' Message: {} Tag: '{}'", queueName, message, tag); String tagStr; if (tag == null) { @@ -83,17 +85,14 @@ public T getMessage(String messageId, Class tClass) { public Map getMessages(Collection messageIds, Class tClass) { Map idToMessage = new HashMap<>(); - getMessages(messageIds) - .values() - .forEach( - consumedMessage -> { - try { - T value = objectMapper.readValue(consumedMessage.getMessage(), tClass); - idToMessage.put(consumedMessage.getMessageId(), value); - } catch (JacksonException e) { - e.printStackTrace(); - } - }); + getMessages(messageIds).values().forEach(consumedMessage -> { + try { + T value = objectMapper.readValue(consumedMessage.getMessage(), tClass); + idToMessage.put(consumedMessage.getMessageId(), value); + } catch (JacksonException e) { + e.printStackTrace(); + } + }); return idToMessage; } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/FailureManager.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/FailureManager.java index 9ca489d0..fe5fc50e 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/FailureManager.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/FailureManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2025 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -22,14 +22,14 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class FailureManager { - @NonNull private final FailureDetailRepository failureDetailRepository; + @NonNull + private final FailureDetailRepository failureDetailRepository; public void deleteAll() { failureDetailRepository.deleteAll(); diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/QueueRegistryUpdater.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/QueueRegistryUpdater.java index 95b7dc5c..5232d060 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/QueueRegistryUpdater.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/QueueRegistryUpdater.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/RqueueEventListener.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/RqueueEventListener.java index b3b85bd2..a40bb946 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/RqueueEventListener.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/service/RqueueEventListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -38,5 +38,4 @@ public int getEventCount() { public void listen(RqueueExecutionEvent event) { executionEvents.add(event); } - } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/AllQueueMode.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/AllQueueMode.java index 8545fd71..62d253bc 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/AllQueueMode.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/AllQueueMode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -52,15 +52,13 @@ protected void checkQueueLevelConsumer() throws TimedOutException { enqueueWithPriority(smsQueue, "medium", Sms.newInstance()); enqueueWithPriority(smsQueue, "low", Sms.newInstance()); TimeoutUtils.waitFor( - () -> - getMessageCount( - Arrays.asList( - smsQueue, - smsQueue + "_critical", - smsQueue + "_high", - smsQueue + "_medium", - smsQueue + "_low")) - == 0, + () -> getMessageCount(Arrays.asList( + smsQueue, + smsQueue + "_critical", + smsQueue + "_high", + smsQueue + "_medium", + smsQueue + "_low")) + == 0, 20 * Constants.ONE_MILLI, "multi level queues to drain"); } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/BasicListenerTest.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/BasicListenerTest.java index 1fe5cc48..37f2169c 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/BasicListenerTest.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/BasicListenerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -67,24 +67,20 @@ protected void verifyListMessageListener() throws TimedOutException { enqueueIn(listEmailQueue, scheduledEmails, 1, TimeUnit.SECONDS); TimeoutUtils.waitFor( () -> getMessageCount(listEmailQueue) == 0, "waiting for email list queue to drain"); - Collection messages = - consumedMessageStore.getConsumedMessages( - emails.stream().map(Email::getId).collect(Collectors.toList())); - Collection scheduledMessages = - consumedMessageStore.getConsumedMessages( - scheduledEmails.stream().map(Email::getId).collect(Collectors.toList())); + Collection messages = consumedMessageStore.getConsumedMessages( + emails.stream().map(Email::getId).collect(Collectors.toList())); + Collection scheduledMessages = consumedMessageStore.getConsumedMessages( + scheduledEmails.stream().map(Email::getId).collect(Collectors.toList())); assertEquals(n, messages.size()); assertEquals(n, scheduledEmails.size()); - Set scheduledTags = - scheduledMessages.stream() - .map(ConsumedMessage::getTag) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - Set simpleTags = - messages.stream() - .map(ConsumedMessage::getTag) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); + Set scheduledTags = scheduledMessages.stream() + .map(ConsumedMessage::getTag) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Set simpleTags = messages.stream() + .map(ConsumedMessage::getTag) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); assertEquals(1, scheduledTags.size()); assertEquals(1, simpleTags.size()); } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/GroupPriorityTest.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/GroupPriorityTest.java index 60dd536d..73da5450 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/GroupPriorityTest.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/GroupPriorityTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MessageChannelTests.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MessageChannelTests.java index cc63ae7a..e8fd0970 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MessageChannelTests.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MessageChannelTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -52,13 +52,10 @@ protected void verifyPublishMessageIsTriggeredOnMessageAddition() throws TimedOu assertTrue( stringRqueueRedisTemplate.getListSize(rqueueConfig.getQueueName(emailQueue)) >= 200, "Messages are correctly moved"); - assertEquals( - 200 + 1L, - getMessageCount(emailQueue), - () -> { - printQueueStats(emailQueue); - return "message count is not correct"; - }); + assertEquals(200 + 1L, getMessageCount(emailQueue), () -> { + printQueueStats(emailQueue); + return "message count is not correct"; + }); } /** diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MetricTest.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MetricTest.java index af772898..f8c8661a 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MetricTest.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MetricTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -38,6 +38,7 @@ public abstract class MetricTest extends SpringTestBase { @Autowired protected MeterRegistry meterRegistry; + @Autowired protected RqueueQueueMetrics rqueueQueueMetrics; @@ -63,25 +64,23 @@ protected void verifyScheduledQueueStatus() throws TimedOutException { } waitFor( - () -> - meterRegistry + () -> meterRegistry .get("scheduled.queue.size") .tag("rqueue", "test") .tag("queue", notificationQueue) .gauge() .value() - > 0, + > 0, 60000, "stats collection"); waitFor( - () -> - meterRegistry + () -> meterRegistry .get("queue.size") .tag("rqueue", "test") .tag("queue", notificationQueue) .gauge() .value() - > 0, + > 0, 60000, "Message in original queue"); deleteAllMessages(notificationQueue); @@ -96,24 +95,22 @@ protected void verifyMetricStatus() throws TimedOutException { enqueue(jobQueue, job); waitFor( - () -> - meterRegistry + () -> meterRegistry .get("dead.letter.queue.size") .tags("rqueue", "test") .tags("queue", emailQueue) .gauge() .value() - == 10, + == 10, "stats collection"); waitFor( - () -> - meterRegistry + () -> meterRegistry .get("processing.queue.size") .tags("rqueue", "test") .tags("queue", jobQueue) .gauge() .value() - == 1, + == 1, 30 * Constants.ONE_MILLI, "processing queue message"); } @@ -124,38 +121,35 @@ protected void verifyCountStatus() throws TimedOutException { failureManager.createFailureDetail(job.getId(), 1, 1); enqueue(jobQueue, job); waitFor( - () -> - meterRegistry + () -> meterRegistry .get("failure.count") .tags("rqueue", "test") .tags("queue", jobQueue) .counter() .count() - >= 1, + >= 1, 30000, "job process", () -> printQueueStats(newArrayList(jobQueue, emailQueue, notificationQueue))); waitFor( - () -> - meterRegistry + () -> meterRegistry .get("execution.count") .tags("rqueue", "test") .tags("queue", emailQueue) .counter() .count() - == 1, + == 1, "message process", () -> printQueueStats(newArrayList(jobQueue, emailQueue, notificationQueue))); waitFor( - () -> - meterRegistry + () -> meterRegistry .get("failure.count") .tags("rqueue", "test") .tags("queue", emailQueue) .counter() .count() - == 0, + == 0, "stats collection"); } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MultiLevelQueueTest.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MultiLevelQueueTest.java index 749aa88b..b1ad4ba6 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MultiLevelQueueTest.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/MultiLevelQueueTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -33,15 +33,13 @@ protected void checkQueueLevelConsumer() throws TimedOutException { enqueueWithPriority(smsQueue, "medium", Sms.newInstance()); enqueueWithPriority(smsQueue, "low", Sms.newInstance()); TimeoutUtils.waitFor( - () -> - getMessageCount( - Arrays.asList( - smsQueue, - smsQueue + "_critical", - smsQueue + "_high", - smsQueue + "_medium", - smsQueue + "_low")) - == 0, + () -> getMessageCount(Arrays.asList( + smsQueue, + smsQueue + "_critical", + smsQueue + "_high", + smsQueue + "_medium", + smsQueue + "_low")) + == 0, "Waiting for multi level queues to drain"); } @@ -52,15 +50,13 @@ protected void checkQueueLevelConsumerWithDelay() throws TimedOutException { enqueueInWithPriority(smsQueue, "medium", Sms.newInstance(), Duration.ofMillis(1000L)); enqueueInWithPriority(smsQueue, "low", Sms.newInstance(), 1000L); TimeoutUtils.waitFor( - () -> - getMessageCount( - Arrays.asList( - smsQueue, - smsQueue + "_critical", - smsQueue + "_high", - smsQueue + "_medium", - smsQueue + "_low")) - == 0, + () -> getMessageCount(Arrays.asList( + smsQueue, + smsQueue + "_critical", + smsQueue + "_high", + smsQueue + "_medium", + smsQueue + "_low")) + == 0, "Waiting for multi level queues to drain"); } } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/RetryTests.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/RetryTests.java index 2e537d58..860908eb 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/RetryTests.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/tests/RetryTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/util/TestMessageConverterProvider.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/util/TestMessageConverterProvider.java index b5e184e5..33ffc43d 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/util/TestMessageConverterProvider.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/util/TestMessageConverterProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -16,14 +16,14 @@ package com.github.sonus21.rqueue.test.util; +import com.github.sonus21.rqueue.converter.JsonMessageConverter; import com.github.sonus21.rqueue.converter.MessageConverterProvider; -import org.springframework.messaging.converter.JacksonJsonMessageConverter; import org.springframework.messaging.converter.MessageConverter; public class TestMessageConverterProvider implements MessageConverterProvider { @Override public MessageConverter getConverter() { - return new JacksonJsonMessageConverter(); + return new JsonMessageConverter(); } } diff --git a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/util/TestMessageProcessor.java b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/util/TestMessageProcessor.java index c18bc759..f5e848cd 100644 --- a/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/util/TestMessageProcessor.java +++ b/rqueue-spring-common-test/src/main/java/com/github/sonus21/rqueue/test/util/TestMessageProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -47,8 +47,11 @@ public int count() { @Override public boolean process(Job job) { - log.info("{}MessageProcessor called queued {} with {}", name, - job.getRqueueMessage().getQueueName(), job.getRqueueMessage()); + log.info( + "{}MessageProcessor called queued {} with {}", + name, + job.getRqueueMessage().getQueueName(), + job.getRqueueMessage()); rqueueMessageList.add( new RqueueMessageEnvelop(job.getRqueueMessage(), System.currentTimeMillis())); return true; diff --git a/rqueue-spring-example/README.md b/rqueue-spring-example/README.md index 24c92328..49abc3e7 100644 --- a/rqueue-spring-example/README.md +++ b/rqueue-spring-example/README.md @@ -13,7 +13,7 @@ spring-boot refer to one of the following samples #### Requirements * Redis -* Java 8 +* Java 21 * Gradle Run Spring app as @@ -37,4 +37,4 @@ It has three APIs to play with | http://localhost:8080/push?q=test&msg=test | schedule/send simple string notification on any queue |q=>queue name, options are simple-queue,delay-queue,delay-queue2,msg=message that should be enqueued, numRetries=> number of retry count (optional), delay => optional delay for message | Application MessageListener logs the job in console, so we can see in the console what's happening -with the scheduled job. \ No newline at end of file +with the scheduled job. diff --git a/rqueue-spring-example/src/main/java/rqueue/spring/example/AppConfig.java b/rqueue-spring-example/src/main/java/rqueue/spring/example/AppConfig.java index dd7211b9..399a047e 100644 --- a/rqueue-spring-example/src/main/java/rqueue/spring/example/AppConfig.java +++ b/rqueue-spring-example/src/main/java/rqueue/spring/example/AppConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-example/src/main/java/rqueue/spring/example/AppInitializer.java b/rqueue-spring-example/src/main/java/rqueue/spring/example/AppInitializer.java index 55fb5f7d..28a215fa 100644 --- a/rqueue-spring-example/src/main/java/rqueue/spring/example/AppInitializer.java +++ b/rqueue-spring-example/src/main/java/rqueue/spring/example/AppInitializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ public class AppInitializer extends AbstractAnnotationConfigDispatcherServletIni @Override protected Class[] getRootConfigClasses() { - return new Class[]{AppConfig.class}; + return new Class[] {AppConfig.class}; } @Override @@ -32,6 +32,6 @@ protected Class[] getServletConfigClasses() { @Override protected String[] getServletMappings() { - return new String[]{"/"}; + return new String[] {"/"}; } } diff --git a/rqueue-spring-example/src/main/java/rqueue/spring/example/Controller.java b/rqueue-spring-example/src/main/java/rqueue/spring/example/Controller.java index e57d8c8b..2867aece 100644 --- a/rqueue-spring-example/src/main/java/rqueue/spring/example/Controller.java +++ b/rqueue-spring-example/src/main/java/rqueue/spring/example/Controller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-example/src/main/java/rqueue/spring/example/Job.java b/rqueue-spring-example/src/main/java/rqueue/spring/example/Job.java index 81c5e2a6..34ed73cc 100644 --- a/rqueue-spring-example/src/main/java/rqueue/spring/example/Job.java +++ b/rqueue-spring-example/src/main/java/rqueue/spring/example/Job.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-example/src/main/java/rqueue/spring/example/Main.java b/rqueue-spring-example/src/main/java/rqueue/spring/example/Main.java index fbb5e302..c82712ab 100644 --- a/rqueue-spring-example/src/main/java/rqueue/spring/example/Main.java +++ b/rqueue-spring-example/src/main/java/rqueue/spring/example/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-example/src/main/java/rqueue/spring/example/MessageListener.java b/rqueue-spring-example/src/main/java/rqueue/spring/example/MessageListener.java index 22e910fb..39a7e094 100644 --- a/rqueue-spring-example/src/main/java/rqueue/spring/example/MessageListener.java +++ b/rqueue-spring-example/src/main/java/rqueue/spring/example/MessageListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring-example/src/main/java/rqueue/spring/example/MvcConfig.java b/rqueue-spring-example/src/main/java/rqueue/spring/example/MvcConfig.java index 796021e3..3c9f2e8e 100644 --- a/rqueue-spring-example/src/main/java/rqueue/spring/example/MvcConfig.java +++ b/rqueue-spring-example/src/main/java/rqueue/spring/example/MvcConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/EnableRqueue.java b/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/EnableRqueue.java index d048812e..dd3926c3 100644 --- a/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/EnableRqueue.java +++ b/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/EnableRqueue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -36,6 +36,4 @@ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import({RqueueListenerConfig.class}) -public @interface EnableRqueue { - -} +public @interface EnableRqueue {} diff --git a/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/MetricsEnabled.java b/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/MetricsEnabled.java index 5e8787dc..22ef24a6 100644 --- a/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/MetricsEnabled.java +++ b/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/MetricsEnabled.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/RqueueListenerConfig.java b/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/RqueueListenerConfig.java index 1c592b47..b4c36c7a 100644 --- a/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/RqueueListenerConfig.java +++ b/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/RqueueListenerConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/RqueueMetricsProperties.java b/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/RqueueMetricsProperties.java index cbf9e196..2399c00a 100644 --- a/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/RqueueMetricsProperties.java +++ b/rqueue-spring/src/main/java/com/github/sonus21/rqueue/spring/RqueueMetricsProperties.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -20,6 +20,4 @@ import org.springframework.context.annotation.Configuration; @Configuration -public class RqueueMetricsProperties extends MetricsProperties { - -} +public class RqueueMetricsProperties extends MetricsProperties {} diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/app/SpringApp.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/app/SpringApp.java index c4d847b2..b2a47405 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/app/SpringApp.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/app/SpringApp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/services/ConsumedMessageRepositoryImpl.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/services/ConsumedMessageRepositoryImpl.java index 63d0d8bf..1ad11e8c 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/services/ConsumedMessageRepositoryImpl.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/services/ConsumedMessageRepositoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/services/FailureDetailRepositoryImpl.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/services/FailureDetailRepositoryImpl.java index 31aa00cb..7adc730b 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/services/FailureDetailRepositoryImpl.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/services/FailureDetailRepositoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2025 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package com.github.sonus21.rqueue.spring.services; -import com.github.sonus21.rqueue.test.entity.ConsumedMessage; import com.github.sonus21.rqueue.test.entity.FailureDetail; import com.github.sonus21.rqueue.test.repository.FailureDetailRepository; import jakarta.persistence.EntityManager; @@ -95,20 +94,16 @@ public long count() { } @Override - public void deleteById(String s) { - } + public void deleteById(String s) {} @Override - public void delete(FailureDetail entity) { - } + public void delete(FailureDetail entity) {} @Override - public void deleteAllById(Iterable strings) { - } + public void deleteAllById(Iterable strings) {} @Override - public void deleteAll(Iterable entities) { - } + public void deleteAll(Iterable entities) {} @Override public void deleteAll() { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/SpringIntegrationTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/SpringIntegrationTest.java index 47299ac8..2edba23a 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/SpringIntegrationTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/SpringIntegrationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -30,6 +30,4 @@ @Tag("integration") @Tag("spring") @ExtendWith(TestTracerExtension.class) -public @interface SpringIntegrationTest { - -} +public @interface SpringIntegrationTest {} diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/SpringUnitTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/SpringUnitTest.java index dfce8fd9..92d9d45b 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/SpringUnitTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/SpringUnitTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,6 +31,4 @@ @Tag("unit") @Tag("springUnit") @ExtendWith({MockitoExtension.class, TestTracerExtension.class}) -public @interface SpringUnitTest { - -} +public @interface SpringUnitTest {} diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/DefaultListenerGroup.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/DefaultListenerGroup.java index 1b850572..eee32401 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/DefaultListenerGroup.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/DefaultListenerGroup.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,24 +31,24 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7015", - "mysql.db.name=DefaultListenerGroup", - "sms.queue.active=true", - "sms.queue.group=sms-test", - "notification.queue.active=false", - "email.queue.active=true", - "job.queue.active=true", - "priority.mode=STRICT", - "reservation.queue.active=true", - "reservation.queue.group=", - "feed.generation.queue.active=true", - "feed.generation.queue.group=", - "chat.indexing.queue.active=true", - "chat.indexing.queue.group=", - "sms.queue.concurrency=5", - "reservation.queue.concurrency=2", - "feed.generation.queue.concurrency=1-5", - "chat.indexing.queue.concurrency=3-5", + "spring.data.redis.port=7015", + "mysql.db.name=DefaultListenerGroup", + "sms.queue.active=true", + "sms.queue.group=sms-test", + "notification.queue.active=false", + "email.queue.active=true", + "job.queue.active=true", + "priority.mode=STRICT", + "reservation.queue.active=true", + "reservation.queue.group=", + "feed.generation.queue.active=true", + "feed.generation.queue.group=", + "chat.indexing.queue.active=true", + "chat.indexing.queue.group=", + "sms.queue.concurrency=5", + "reservation.queue.concurrency=2", + "feed.generation.queue.concurrency=1-5", + "chat.indexing.queue.concurrency=3-5", }) @SpringIntegrationTest class DefaultListenerGroup extends AllQueueMode { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueRestControllerTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueRestControllerTest.java index 12a9d8c4..0c7551b6 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueRestControllerTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueRestControllerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -77,10 +77,10 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7001", - "mysql.db.name=RqueueRestController", - "max.workers.count=40", - "rqueue.web.statistic.history.day=180" + "spring.data.redis.port=7001", + "mysql.db.name=RqueueRestController", + "max.workers.count=40", + "rqueue.web.statistic.history.day=180" }) @SpringIntegrationTest @DisabledIfEnvironmentVariable(named = "RQUEUE_REACTIVE_ENABLED", matches = "true") @@ -107,13 +107,11 @@ void verifyChartAndQueueData() throws Exception { void verifyChartLatencyData() throws Exception { ChartDataRequest chartDataRequest = new ChartDataRequest(ChartType.LATENCY, AggregationType.DAILY); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/chart") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(chartDataRequest))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/chart") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(chartDataRequest))) + .andReturn(); String response = result.getResponse().getContentAsString(); ChartDataResponse dataResponse = mapper.readValue(response, ChartDataResponse.class); assertNull(dataResponse.getMessage()); @@ -124,13 +122,11 @@ void verifyChartLatencyData() throws Exception { void verifyChartStatsData() throws Exception { ChartDataRequest chartDataRequest = new ChartDataRequest(ChartType.STATS, AggregationType.DAILY); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/chart") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(chartDataRequest))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/chart") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(chartDataRequest))) + .andReturn(); String response = result.getResponse().getContentAsString(); ChartDataResponse dataResponse = mapper.readValue(response, ChartDataResponse.class); assertNull(dataResponse.getMessage()); @@ -145,13 +141,11 @@ void verifyCompletedJobsData() throws Exception { request.setSrc(jobQueue); request.setName(queueDetail.getCompletedQueueName()); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) + .andReturn(); DataViewResponse dataViewResponse = mapper.readValue(result.getResponse().getContentAsString(), DataViewResponse.class); @@ -160,11 +154,10 @@ void verifyCompletedJobsData() throws Exception { assertEquals(20, dataViewResponse.getRows().size()); assertEquals(4, dataViewResponse.getRows().get(0).getColumns().size()); assertEquals( - Collections.singletonList( - new Action( - ActionType.DELETE, - String.format( - "Completed messages for queue '%s'", queueDetail.getCompletedQueueName()))), + Collections.singletonList(new Action( + ActionType.DELETE, + String.format( + "Completed messages for queue '%s'", queueDetail.getCompletedQueueName()))), dataViewResponse.getActions()); } @@ -176,22 +169,19 @@ void exploreDataList() throws Exception { request.setSrc(emailQueue); request.setName(emailDeadLetterQueue); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) + .andReturn(); DataViewResponse dataViewResponse = mapper.readValue(result.getResponse().getContentAsString(), DataViewResponse.class); assertNull(dataViewResponse.getMessage()); assertEquals(0, dataViewResponse.getCode()); assertEquals( - Collections.singletonList( - new Action( - ActionType.DELETE, String.format("dead letter queue '%s'", emailDeadLetterQueue))), + Collections.singletonList(new Action( + ActionType.DELETE, String.format("dead letter queue '%s'", emailDeadLetterQueue))), dataViewResponse.getActions()); assertEquals(20, dataViewResponse.getRows().size()); assertEquals(4, dataViewResponse.getRows().get(0).getColumns().size()); @@ -208,13 +198,11 @@ void exploreDataZset() throws Exception { request.setSrc(emailQueue); request.setName(rqueueConfig.getScheduledQueueName(emailQueue)); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) + .andReturn(); DataViewResponse dataViewResponse = mapper.readValue(result.getResponse().getContentAsString(), DataViewResponse.class); @@ -237,13 +225,11 @@ void exploreDataProcessingQueue() throws Exception { request.setSrc(emailQueue); request.setName(processingSet); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) + .andReturn(); DataViewResponse dataViewResponse = mapper.readValue(result.getResponse().getContentAsString(), DataViewResponse.class); @@ -261,13 +247,11 @@ void deleteDataSet() throws Exception { DataDeleteRequest request = new DataDeleteRequest(); request.setQueueName(emailQueue); request.setDatasetName(emailDeadLetterQueue); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/delete-queue-part") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/delete-queue-part") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) + .andReturn(); BooleanResponse booleanResponse = mapper.readValue(result.getResponse().getContentAsString(), BooleanResponse.class); assertNull(booleanResponse.getMessage()); @@ -283,13 +267,11 @@ void dataType() throws Exception { enqueue(Email.newInstance(), emailDeadLetterQueue); DataTypeRequest request = new DataTypeRequest(); request.setName(emailDeadLetterQueue); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/data-type") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/data-type") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) + .andReturn(); StringResponse response = mapper.readValue(result.getResponse().getContentAsString(), StringResponse.class); assertNull(response.getMessage()); @@ -302,13 +284,11 @@ void moveMessage() throws Exception { enqueue(emailDeadLetterQueue, i -> Email.newInstance(), 30, true); MessageMoveRequest request = new MessageMoveRequest(emailDeadLetterQueue, DataType.LIST, emailQueue, DataType.LIST); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/move-data") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/move-data") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) + .andReturn(); MessageMoveResponse response = mapper.readValue(result.getResponse().getContentAsString(), MessageMoveResponse.class); assertNull(response.getMessage()); @@ -323,13 +303,11 @@ void viewData() throws Exception { DateViewRequest dateViewRequest = new DateViewRequest(); dateViewRequest.setName(emailDeadLetterQueue); dateViewRequest.setType(DataType.LIST); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/view-data") - .content(mapper.writeValueAsBytes(dateViewRequest)) - .contentType(MediaType.APPLICATION_JSON)) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/view-data") + .content(mapper.writeValueAsBytes(dateViewRequest)) + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); DataViewResponse dataViewResponse = mapper.readValue(result.getResponse().getContentAsString(), DataViewResponse.class); assertEquals(0, dataViewResponse.getCode()); @@ -345,13 +323,11 @@ void deleteQueue() throws Exception { DataTypeRequest request = new DataTypeRequest(); request.setName(jobQueue); System.out.println(new String(mapper.writeValueAsBytes(request))); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/delete-queue") - .content(mapper.writeValueAsBytes(request)) - .contentType(MediaType.APPLICATION_JSON)) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/delete-queue") + .content(mapper.writeValueAsBytes(request)) + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); BaseResponse response = mapper.readValue(result.getResponse().getContentAsString(), BaseResponse.class); assertEquals(0, response.getCode()); @@ -363,26 +339,22 @@ void deleteMessage() throws Exception { Email email = Email.newInstance(); deleteMessageListener.clear(); enqueueIn(emailQueue, email, 10 * Constants.ONE_MILLI); - RqueueMessage message = - rqueueMessageTemplate - .readFromZset(rqueueConfig.getScheduledQueueName(emailQueue), 0, -1) - .get(0); + RqueueMessage message = rqueueMessageTemplate + .readFromZset(rqueueConfig.getScheduledQueueName(emailQueue), 0, -1) + .get(0); MessageDeleteRequest request = new MessageDeleteRequest(); request.setMessageId(message.getId()); request.setQueueName(emailQueue); - MvcResult result = - this.mockMvc - .perform( - post("/rqueue/api/v1/delete-message") - .content(mapper.writeValueAsBytes(request)) - .contentType(MediaType.APPLICATION_JSON)) - .andReturn(); + MvcResult result = this.mockMvc + .perform(post("/rqueue/api/v1/delete-message") + .content(mapper.writeValueAsBytes(request)) + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); BooleanResponse response = mapper.readValue(result.getResponse().getContentAsString(), BooleanResponse.class); assertEquals(0, response.getCode()); - Object metadata = - stringRqueueRedisTemplate.get( - RqueueMessageUtils.getMessageMetaId(emailQueue, message.getId())); + Object metadata = stringRqueueRedisTemplate.get( + RqueueMessageUtils.getMessageMetaId(emailQueue, message.getId())); assertTrue(((MessageMetadata) metadata).isDeleted()); TimeoutUtils.waitFor( () -> { @@ -404,13 +376,11 @@ void jobsData() throws Exception { Constants.SECONDS_IN_A_MINUTE * Constants.ONE_MILLI, "notifications to be sent"); String messageId = messageIds.get(random.nextInt(messageIds.size())); - MvcResult result = - this.mockMvc - .perform( - get("/rqueue/api/v1/jobs") - .param("message-id", messageId) - .contentType(MediaType.APPLICATION_JSON)) - .andReturn(); + MvcResult result = this.mockMvc + .perform(get("/rqueue/api/v1/jobs") + .param("message-id", messageId) + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); DataViewResponse response = mapper.readValue(result.getResponse().getContentAsString(), DataViewResponse.class); assertEquals(0, response.getCode()); @@ -422,13 +392,11 @@ void jobsData() throws Exception { assertEquals(TableColumnType.DISPLAY, column.getType()); } - result = - this.mockMvc - .perform( - get("/rqueue/api/v1/jobs") - .param("message-id", UUID.randomUUID().toString()) - .contentType(MediaType.APPLICATION_JSON)) - .andReturn(); + result = this.mockMvc + .perform(get("/rqueue/api/v1/jobs") + .param("message-id", UUID.randomUUID().toString()) + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); response = mapper.readValue(result.getResponse().getContentAsString(), DataViewResponse.class); assertEquals(0, response.getCode()); @@ -439,13 +407,11 @@ void jobsData() throws Exception { @Test void aggregatorSelector() throws Exception { - MvcResult result = - this.mockMvc - .perform( - get("/rqueue/api/v1/aggregate-data-selector") - .param("type", AggregationType.DAILY.name()) - .contentType(MediaType.APPLICATION_JSON)) - .andReturn(); + MvcResult result = this.mockMvc + .perform(get("/rqueue/api/v1/aggregate-data-selector") + .param("type", AggregationType.DAILY.name()) + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); DataSelectorResponse response = mapper.readValue(result.getResponse().getContentAsString(), DataSelectorResponse.class); @@ -453,13 +419,11 @@ void aggregatorSelector() throws Exception { assertEquals("Select Number of Days", response.getTitle()); assertEquals(19, response.getData().size()); - result = - this.mockMvc - .perform( - get("/rqueue/api/v1/aggregate-data-selector") - .param("type", AggregationType.WEEKLY.name()) - .contentType(MediaType.APPLICATION_JSON)) - .andReturn(); + result = this.mockMvc + .perform(get("/rqueue/api/v1/aggregate-data-selector") + .param("type", AggregationType.WEEKLY.name()) + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); response = mapper.readValue(result.getResponse().getContentAsString(), DataSelectorResponse.class); @@ -467,13 +431,11 @@ void aggregatorSelector() throws Exception { assertEquals("Select Number of Weeks", response.getTitle()); assertEquals(27, response.getData().size(), result.getResponse().getContentAsString()); - result = - this.mockMvc - .perform( - get("/rqueue/api/v1/aggregate-data-selector") - .param("type", AggregationType.MONTHLY.name()) - .contentType(MediaType.APPLICATION_JSON)) - .andReturn(); + result = this.mockMvc + .perform(get("/rqueue/api/v1/aggregate-data-selector") + .param("type", AggregationType.MONTHLY.name()) + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); response = mapper.readValue(result.getResponse().getContentAsString(), DataSelectorResponse.class); diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueViewControllerTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueViewControllerTest.java index ce7bf4b5..ffd40be9 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueViewControllerTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueViewControllerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -42,11 +42,11 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7002", - "mysql.db.name=RqueueViewControllerTest", - "max.workers.count=40", - "notification.queue.active=false", - "rqueue.web.statistic.history.day=180", + "spring.data.redis.port=7002", + "mysql.db.name=RqueueViewControllerTest", + "max.workers.count=40", + "notification.queue.active=false", + "rqueue.web.statistic.history.day=180", }) @SpringIntegrationTest @DisabledIfEnvironmentVariable(named = "RQUEUE_REACTIVE_ENABLED", matches = "true") diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueWebDisabledTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueWebDisabledTest.java index 45ae9fff..120affba 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueWebDisabledTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/RqueueWebDisabledTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -52,9 +52,9 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7003", - "mysql.db.name=RqueueRestController", - "rqueue.web.enable=false" + "spring.data.redis.port=7003", + "mysql.db.name=RqueueRestController", + "rqueue.web.enable=false" }) @SpringIntegrationTest @DisabledIfEnvironmentVariable(named = "RQUEUE_REACTIVE_ENABLED", matches = "true") @@ -63,24 +63,23 @@ class RqueueWebDisabledTest extends SpringWebTestBase { @ParameterizedTest @ValueSource( strings = { - "", - "/queues", - "/running", - "/scheduled", - "/dead", - "/pending", - "/utility", - "/queues/test-queue", - "/api/v1/aggregate-data-selector?type=WEEKLY", - "/api/v1/jobs?message-id=1234567890" + "", + "/queues", + "/running", + "/scheduled", + "/dead", + "/pending", + "/utility", + "/queues/test-queue", + "/api/v1/aggregate-data-selector?type=WEEKLY", + "/api/v1/jobs?message-id=1234567890" }) void pathTester(String path) throws Exception { - assertNull( - this.mockMvc - .perform(get("/rqueue" + path)) - .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) - .andReturn() - .getModelAndView()); + assertNull(this.mockMvc + .perform(get("/rqueue" + path)) + .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) + .andReturn() + .getModelAndView()); } @Test @@ -90,10 +89,9 @@ void getChart() throws Exception { assertEquals( "", this.mockMvc - .perform( - post("/rqueue/api/v1/chart") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(chartDataRequest))) + .perform(post("/rqueue/api/v1/chart") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(chartDataRequest))) .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) .andReturn() .getResponse() @@ -109,10 +107,9 @@ void exploreData() throws Exception { assertEquals( "", this.mockMvc - .perform( - post("/rqueue/api/v1/queue-data") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) + .perform(post("/rqueue/api/v1/queue-data") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) .andReturn() .getResponse() @@ -127,10 +124,9 @@ void deleteDataSet() throws Exception { assertEquals( "", this.mockMvc - .perform( - post("/rqueue/api/v1/delete-queue-part") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) + .perform(post("/rqueue/api/v1/delete-queue-part") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) .andReturn() .getResponse() @@ -144,10 +140,9 @@ void dataType() throws Exception { assertEquals( "", this.mockMvc - .perform( - post("/rqueue/api/v1/data-type") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsBytes(request))) + .perform(post("/rqueue/api/v1/data-type") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsBytes(request))) .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) .andReturn() .getResponse() @@ -161,10 +156,9 @@ void moveMessage() throws Exception { assertEquals( "", this.mockMvc - .perform( - post("/rqueue/api/v1/move-data") - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsString(request))) + .perform(post("/rqueue/api/v1/move-data") + .contentType(MediaType.APPLICATION_JSON) + .content(mapper.writeValueAsString(request))) .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) .andReturn() .getResponse() @@ -179,10 +173,9 @@ void viewData() throws Exception { assertEquals( "", this.mockMvc - .perform( - post("/rqueue/api/v1/view-data") - .content(mapper.writeValueAsBytes(dateViewRequest)) - .contentType(MediaType.APPLICATION_JSON)) + .perform(post("/rqueue/api/v1/view-data") + .content(mapper.writeValueAsBytes(dateViewRequest)) + .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) .andReturn() .getResponse() @@ -196,10 +189,9 @@ void deleteQueue() throws Exception { assertEquals( "", this.mockMvc - .perform( - post("/rqueue/api/v1/delete-queue") - .content(mapper.writeValueAsBytes(request)) - .contentType(MediaType.APPLICATION_JSON)) + .perform(post("/rqueue/api/v1/delete-queue") + .content(mapper.writeValueAsBytes(request)) + .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) .andReturn() .getResponse() @@ -215,10 +207,9 @@ void deleteMessage() throws Exception { assertEquals( "", this.mockMvc - .perform( - post("/rqueue/api/v1/delete-message") - .content(mapper.writeValueAsBytes(request)) - .contentType(MediaType.APPLICATION_JSON)) + .perform(post("/rqueue/api/v1/delete-message") + .content(mapper.writeValueAsBytes(request)) + .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().is(HttpServletResponse.SC_SERVICE_UNAVAILABLE)) .andReturn() .getResponse() diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/SpringAppTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/SpringAppTest.java index 7b5da33f..7c5ee84a 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/SpringAppTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/SpringAppTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2025 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -53,20 +53,20 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7004", - "mysql.db.name=SpringAppTest", - "sms.queue.active=true", - "notification.queue.active=false", - "email.queue.active=true", - "job.queue.active=true", - "use.system.redis=false", - "priority.mode=STRICT", - "reservation.queue.active=true", - "feed.generation.queue.active=true", - "chat.indexing.queue.active=true", - "provide.executor=true", - "email.queue.retry.count=-1", - "rqueue.retry.per.poll=10" + "spring.data.redis.port=7004", + "mysql.db.name=SpringAppTest", + "sms.queue.active=true", + "notification.queue.active=false", + "email.queue.active=true", + "job.queue.active=true", + "use.system.redis=false", + "priority.mode=STRICT", + "reservation.queue.active=true", + "feed.generation.queue.active=true", + "chat.indexing.queue.active=true", + "provide.executor=true", + "email.queue.retry.count=-1", + "rqueue.retry.per.poll=10" }) @SpringIntegrationTest class SpringAppTest extends AllQueueMode { @@ -106,10 +106,8 @@ void verifyDefaultDeadLetterQueueRetry() throws TimedOutException { TimeoutUtils.waitFor(() -> getMessageCount(emailQueue) == 0, "email to be consumed"); List messages = rqueueMessageTemplate.readFromList(emailDeadLetterQueue, 0, -1); assertEquals(1, messages.size()); - Email email1 = - (Email) - RqueueMessageUtils.convertMessageToObject( - messages.get(0), rqueueMessageManager.getMessageConverter()); + Email email1 = (Email) RqueueMessageUtils.convertMessageToObject( + messages.get(0), rqueueMessageManager.getMessageConverter()); assertEquals(email.getId(), email1.getId()); } @@ -128,60 +126,58 @@ void onlyPushMode() { String critical = "critical"; registerQueue(emailQueue); registerQueue(smsQueue, critical, high, low); - Email[] emails = - new Email[]{ - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - Email.newInstance(), - }; - Sms[] sms = - new Sms[]{ - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - Sms.newInstance(), - }; + Email[] emails = new Email[] { + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + Email.newInstance(), + }; + Sms[] sms = new Sms[] { + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + Sms.newInstance(), + }; assertTrue(enqueue(emailQueue, emails[0])); assertTrue(rqueueMessageEnqueuer.enqueue(emailQueue, emails[1].getId(), emails[1])); @@ -194,79 +190,56 @@ void onlyPushMode() { assertTrue(rqueueMessageEnqueuer.enqueueAt(emailQueue, emails[6].getId(), emails[6], date)); assertTrue(enqueueAt(emailQueue, emails[7], Instant.now().plusMillis(Constants.ONE_MILLI))); - assertTrue( - rqueueMessageEnqueuer.enqueueAt( - emailQueue, emails[8].getId(), emails[8], date.toInstant())); + assertTrue(rqueueMessageEnqueuer.enqueueAt( + emailQueue, emails[8].getId(), emails[8], date.toInstant())); - assertTrue( - rqueueMessageEnqueuer.enqueueUniqueAt( - emailQueue, emails[9].getId(), emails[9], date.toInstant().toEpochMilli())); + assertTrue(rqueueMessageEnqueuer.enqueueUniqueAt( + emailQueue, emails[9].getId(), emails[9], date.toInstant().toEpochMilli())); - assertTrue( - enqueueAt( - emailQueue, emails[10], Instant.now().plusMillis(Constants.ONE_MILLI).toEpochMilli())); - assertTrue( - rqueueMessageEnqueuer.enqueueAt( - emailQueue, - emails[11].getId(), - emails[11], - Instant.now().plusMillis(Constants.ONE_MILLI).toEpochMilli())); + assertTrue(enqueueAt( + emailQueue, emails[10], Instant.now().plusMillis(Constants.ONE_MILLI).toEpochMilli())); + assertTrue(rqueueMessageEnqueuer.enqueueAt( + emailQueue, + emails[11].getId(), + emails[11], + Instant.now().plusMillis(Constants.ONE_MILLI).toEpochMilli())); assertTrue(enqueueIn(emailQueue, emails[12], Constants.ONE_MILLI)); - assertTrue( - rqueueMessageEnqueuer.enqueueIn( - emailQueue, emails[13].getId(), emails[13], Constants.ONE_MILLI)); + assertTrue(rqueueMessageEnqueuer.enqueueIn( + emailQueue, emails[13].getId(), emails[13], Constants.ONE_MILLI)); assertTrue(enqueueIn(emailQueue, emails[14], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); - assertTrue( - rqueueMessageEnqueuer.enqueueIn( - emailQueue, - emails[15].getId(), - emails[15], - Constants.ONE_MILLI, - TimeUnit.MILLISECONDS)); + assertTrue(rqueueMessageEnqueuer.enqueueIn( + emailQueue, emails[15].getId(), emails[15], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); assertTrue(enqueueIn(emailQueue, emails[16], Duration.ofMillis(Constants.ONE_MILLI))); - assertTrue( - rqueueMessageEnqueuer.enqueueIn( - emailQueue, emails[17].getId(), emails[17], Duration.ofMillis(Constants.ONE_MILLI))); + assertTrue(rqueueMessageEnqueuer.enqueueIn( + emailQueue, emails[17].getId(), emails[17], Duration.ofMillis(Constants.ONE_MILLI))); - assertTrue( - rqueueMessageEnqueuer.enqueueUniqueIn( - emailQueue, emails[18].getId(), emails[18], Constants.ONE_MILLI)); - assertFalse( - rqueueMessageEnqueuer.enqueueUniqueIn( - emailQueue, emails[18].getId(), emails[18], Constants.ONE_MILLI)); + assertTrue(rqueueMessageEnqueuer.enqueueUniqueIn( + emailQueue, emails[18].getId(), emails[18], Constants.ONE_MILLI)); + assertFalse(rqueueMessageEnqueuer.enqueueUniqueIn( + emailQueue, emails[18].getId(), emails[18], Constants.ONE_MILLI)); assertNotNull( rqueueMessageEnqueuer.enqueueInWithRetry(emailQueue, emails[19], 3, Constants.ONE_MILLI)); - assertTrue( - rqueueMessageEnqueuer.enqueueInWithRetry( - emailQueue, emails[20].getId(), emails[20], 3, Constants.ONE_MILLI)); + assertTrue(rqueueMessageEnqueuer.enqueueInWithRetry( + emailQueue, emails[20].getId(), emails[20], 3, Constants.ONE_MILLI)); assertNotNull( rqueueMessageEnqueuer.enqueuePeriodic(emailQueue, emails[21], Constants.ONE_MILLI)); - assertNotNull( - rqueueMessageEnqueuer.enqueuePeriodic( - emailQueue, emails[22], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); - assertNotNull( - rqueueMessageEnqueuer.enqueuePeriodic( - emailQueue, emails[23], Duration.ofMillis(Constants.ONE_MILLI))); - - assertTrue( - rqueueMessageEnqueuer.enqueuePeriodic( - emailQueue, emails[24].getId(), emails[24], Constants.ONE_MILLI)); - assertTrue( - rqueueMessageEnqueuer.enqueuePeriodic( - emailQueue, - emails[25].getId(), - emails[25], - Constants.ONE_MILLI, - TimeUnit.MILLISECONDS)); - assertTrue( - rqueueMessageEnqueuer.enqueuePeriodic( - emailQueue, emails[26].getId(), emails[26], Duration.ofMillis(Constants.ONE_MILLI))); + assertNotNull(rqueueMessageEnqueuer.enqueuePeriodic( + emailQueue, emails[22], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); + assertNotNull(rqueueMessageEnqueuer.enqueuePeriodic( + emailQueue, emails[23], Duration.ofMillis(Constants.ONE_MILLI))); + + assertTrue(rqueueMessageEnqueuer.enqueuePeriodic( + emailQueue, emails[24].getId(), emails[24], Constants.ONE_MILLI)); + assertTrue(rqueueMessageEnqueuer.enqueuePeriodic( + emailQueue, emails[25].getId(), emails[25], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); + assertTrue(rqueueMessageEnqueuer.enqueuePeriodic( + emailQueue, emails[26].getId(), emails[26], Duration.ofMillis(Constants.ONE_MILLI))); assertTrue(enqueue(smsQueue, sms[0])); assertTrue(enqueueIn(smsQueue, sms[1], Constants.ONE_MILLI)); @@ -278,57 +251,47 @@ void onlyPushMode() { assertTrue( rqueueMessageEnqueuer.enqueueWithPriority(smsQueue, critical, sms[5].getId(), sms[5])); - assertTrue( - rqueueMessageEnqueuer.enqueueUniqueWithPriority( - smsQueue, critical, sms[6].getId(), sms[6])); + assertTrue(rqueueMessageEnqueuer.enqueueUniqueWithPriority( + smsQueue, critical, sms[6].getId(), sms[6])); assertTrue(enqueueAtWithPriority(smsQueue, critical, sms[7], date)); - assertTrue( - rqueueMessageEnqueuer.enqueueAtWithPriority( - smsQueue, critical, sms[8].getId(), sms[8], date)); + assertTrue(rqueueMessageEnqueuer.enqueueAtWithPriority( + smsQueue, critical, sms[8].getId(), sms[8], date)); assertTrue(enqueueAtWithPriority(smsQueue, high, sms[9], date.toInstant())); - assertTrue( - rqueueMessageEnqueuer.enqueueAtWithPriority( - smsQueue, high, sms[10].getId(), sms[10], date.toInstant())); + assertTrue(rqueueMessageEnqueuer.enqueueAtWithPriority( + smsQueue, high, sms[10].getId(), sms[10], date.toInstant())); assertTrue(enqueueAtWithPriority(smsQueue, low, sms[11], date.toInstant().toEpochMilli())); - assertTrue( - rqueueMessageEnqueuer.enqueueAtWithPriority( - smsQueue, low, sms[12].getId(), sms[12], date.toInstant().toEpochMilli())); - assertTrue( - rqueueMessageEnqueuer.enqueueUniqueAtWithPriority( - smsQueue, critical, sms[13].getId(), sms[13], date.toInstant().toEpochMilli())); + assertTrue(rqueueMessageEnqueuer.enqueueAtWithPriority( + smsQueue, low, sms[12].getId(), sms[12], date.toInstant().toEpochMilli())); + assertTrue(rqueueMessageEnqueuer.enqueueUniqueAtWithPriority( + smsQueue, critical, sms[13].getId(), sms[13], date.toInstant().toEpochMilli())); assertTrue(enqueueInWithPriority(smsQueue, critical, sms[14], Constants.ONE_MILLI)); - assertTrue( - rqueueMessageEnqueuer.enqueueInWithPriority( - smsQueue, critical, sms[15].getId(), sms[15], Constants.ONE_MILLI)); + assertTrue(rqueueMessageEnqueuer.enqueueInWithPriority( + smsQueue, critical, sms[15].getId(), sms[15], Constants.ONE_MILLI)); assertTrue( enqueueInWithPriority(smsQueue, high, sms[16], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); - assertTrue( - rqueueMessageEnqueuer.enqueueInWithPriority( - smsQueue, high, sms[17].getId(), sms[17], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); + assertTrue(rqueueMessageEnqueuer.enqueueInWithPriority( + smsQueue, high, sms[17].getId(), sms[17], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); assertTrue( enqueueInWithPriority(smsQueue, low, sms[18], Duration.ofMillis(Constants.ONE_MILLI))); - assertTrue( - rqueueMessageEnqueuer.enqueueInWithPriority( - smsQueue, low, sms[19].getId(), sms[19], Duration.ofMillis(Constants.ONE_MILLI))); + assertTrue(rqueueMessageEnqueuer.enqueueInWithPriority( + smsQueue, low, sms[19].getId(), sms[19], Duration.ofMillis(Constants.ONE_MILLI))); - assertTrue( - rqueueMessageEnqueuer.enqueueUniqueInWithPriority( - smsQueue, low, sms[20].getId(), sms[20], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); + assertTrue(rqueueMessageEnqueuer.enqueueUniqueInWithPriority( + smsQueue, low, sms[20].getId(), sms[20], Constants.ONE_MILLI, TimeUnit.MILLISECONDS)); assertEquals( 48, - getMessageCount( - Arrays.asList( - emailQueue, - smsQueue, - smsQueue + "_" + critical, - smsQueue + "_" + high, - smsQueue + "_" + low))); + getMessageCount(Arrays.asList( + emailQueue, + smsQueue, + smsQueue + "_" + critical, + smsQueue + "_" + high, + smsQueue + "_" + low))); } } diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/SpringMetricTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/SpringMetricTest.java index d3346b6d..71c39170 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/SpringMetricTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/SpringMetricTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictHeterogeneousConcurrencyBasedQueueListener.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictHeterogeneousConcurrencyBasedQueueListener.java index 200232a6..4775cb61 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictHeterogeneousConcurrencyBasedQueueListener.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictHeterogeneousConcurrencyBasedQueueListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,20 +31,20 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7013", - "mysql.db.name=StrictHeterogeneousConcurrencyBasedQueueListener", - "sms.queue.active=true", - "notification.queue.active=false", - "email.queue.active=true", - "job.queue.active=true", - "priority.mode=STRICT", - "reservation.queue.active=true", - "feed.generation.queue.active=true", - "chat.indexing.queue.active=true", - "sms.queue.concurrency=5", - "reservation.queue.concurrency=2", - "feed.generation.queue.concurrency=1-5", - "chat.indexing.queue.concurrency=3-5", + "spring.data.redis.port=7013", + "mysql.db.name=StrictHeterogeneousConcurrencyBasedQueueListener", + "sms.queue.active=true", + "notification.queue.active=false", + "email.queue.active=true", + "job.queue.active=true", + "priority.mode=STRICT", + "reservation.queue.active=true", + "feed.generation.queue.active=true", + "chat.indexing.queue.active=true", + "sms.queue.concurrency=5", + "reservation.queue.concurrency=2", + "feed.generation.queue.concurrency=1-5", + "chat.indexing.queue.concurrency=3-5", }) @SpringIntegrationTest class StrictHeterogeneousConcurrencyBasedQueueListener extends AllQueueMode { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictHeterogeneousQueueListener.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictHeterogeneousQueueListener.java index 134972df..bb15badc 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictHeterogeneousQueueListener.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictHeterogeneousQueueListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,17 +31,17 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7011", - "mysql.db.name=StrictHeterogeneousQueueListener", - "sms.queue.active=true", - "notification.queue.active=false", - "email.queue.active=true", - "job.queue.active=true", - "use.system.redis=false", - "priority.mode=STRICT", - "reservation.queue.active=true", - "feed.generation.queue.active=true", - "chat.indexing.queue.active=true" + "spring.data.redis.port=7011", + "mysql.db.name=StrictHeterogeneousQueueListener", + "sms.queue.active=true", + "notification.queue.active=false", + "email.queue.active=true", + "job.queue.active=true", + "use.system.redis=false", + "priority.mode=STRICT", + "reservation.queue.active=true", + "feed.generation.queue.active=true", + "chat.indexing.queue.active=true" }) @SpringIntegrationTest class StrictHeterogeneousQueueListener extends AllQueueMode { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictMultiLevelQueueListener.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictMultiLevelQueueListener.java index 989efd96..efeb80cb 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictMultiLevelQueueListener.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictMultiLevelQueueListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,15 +31,15 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7007", - "mysql.db.name=StrictMultiLevelQueueListener", - "max.workers.count=10", - "sms.queue.active=true", - "notification.queue.active=false", - "email.queue.active=false", - "job.queue.active=false", - "use.system.redis=false", - "priority.mode=STRICT", + "spring.data.redis.port=7007", + "mysql.db.name=StrictMultiLevelQueueListener", + "max.workers.count=10", + "sms.queue.active=true", + "notification.queue.active=false", + "email.queue.active=false", + "job.queue.active=false", + "use.system.redis=false", + "priority.mode=STRICT", }) @SpringIntegrationTest class StrictMultiLevelQueueListener extends MultiLevelQueueTest { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictPriorityQueueListenerTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictPriorityQueueListenerTest.java index 12273d7d..53bea877 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictPriorityQueueListenerTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/StrictPriorityQueueListenerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,17 +31,17 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7009", - "mysql.db.name=StrictPriorityQueueListenerTest", - "sms.queue.active=true", - "notification.queue.active=false", - "email.queue.active=false", - "job.queue.active=false", - "use.system.redis=false", - "priority.mode=STRICT", - "reservation.queue.active=true", - "feed.generation.queue.active=true", - "chat.indexing.queue.active=true" + "spring.data.redis.port=7009", + "mysql.db.name=StrictPriorityQueueListenerTest", + "sms.queue.active=true", + "notification.queue.active=false", + "email.queue.active=false", + "job.queue.active=false", + "use.system.redis=false", + "priority.mode=STRICT", + "reservation.queue.active=true", + "feed.generation.queue.active=true", + "chat.indexing.queue.active=true" }) @SpringIntegrationTest class StrictPriorityQueueListenerTest extends GroupPriorityTest { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedHeterogeneousConcurrencyBasedQueueListener.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedHeterogeneousConcurrencyBasedQueueListener.java index 7297f764..ff2caf17 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedHeterogeneousConcurrencyBasedQueueListener.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedHeterogeneousConcurrencyBasedQueueListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,20 +31,20 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7014", - "mysql.db.name=WeightedHeterogeneousConcurrencyBasedQueueListener", - "sms.queue.active=true", - "notification.queue.active=false", - "email.queue.active=true", - "job.queue.active=true", - "priority.mode=WEIGHTED", - "reservation.queue.active=true", - "feed.generation.queue.active=true", - "chat.indexing.queue.active=true", - "sms.queue.concurrency=5", - "reservation.queue.concurrency=2", - "feed.generation.queue.concurrency=1-5", - "chat.indexing.queue.concurrency=3-5" + "spring.data.redis.port=7014", + "mysql.db.name=WeightedHeterogeneousConcurrencyBasedQueueListener", + "sms.queue.active=true", + "notification.queue.active=false", + "email.queue.active=true", + "job.queue.active=true", + "priority.mode=WEIGHTED", + "reservation.queue.active=true", + "feed.generation.queue.active=true", + "chat.indexing.queue.active=true", + "sms.queue.concurrency=5", + "reservation.queue.concurrency=2", + "feed.generation.queue.concurrency=1-5", + "chat.indexing.queue.concurrency=3-5" }) @SpringIntegrationTest class WeightedHeterogeneousConcurrencyBasedQueueListener extends AllQueueMode { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedHeterogeneousQueueListener.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedHeterogeneousQueueListener.java index f16df97d..c5ec317c 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedHeterogeneousQueueListener.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedHeterogeneousQueueListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,17 +31,17 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7012", - "mysql.db.name=WeightedHeterogeneousQueueListener", - "sms.queue.active=true", - "notification.queue.active=false", - "email.queue.active=true", - "job.queue.active=true", - "use.system.redis=false", - "priority.mode=WEIGHTED", - "reservation.queue.active=true", - "feed.generation.queue.active=true", - "chat.indexing.queue.active=true" + "spring.data.redis.port=7012", + "mysql.db.name=WeightedHeterogeneousQueueListener", + "sms.queue.active=true", + "notification.queue.active=false", + "email.queue.active=true", + "job.queue.active=true", + "use.system.redis=false", + "priority.mode=WEIGHTED", + "reservation.queue.active=true", + "feed.generation.queue.active=true", + "chat.indexing.queue.active=true" }) @SpringIntegrationTest class WeightedHeterogeneousQueueListener extends AllQueueMode { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedMultiLevelQueueListener.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedMultiLevelQueueListener.java index 18ed2e05..bf6d87d1 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedMultiLevelQueueListener.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedMultiLevelQueueListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,14 +31,14 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7006", - "mysql.db.name=WeightedMultiLevelQueueListener", - "sms.queue.active=true", - "notification.queue.active=false", - "email.queue.active=false", - "job.queue.active=false", - "use.system.redis=false", - "priority.mode=WEIGHTED", + "spring.data.redis.port=7006", + "mysql.db.name=WeightedMultiLevelQueueListener", + "sms.queue.active=true", + "notification.queue.active=false", + "email.queue.active=false", + "job.queue.active=false", + "use.system.redis=false", + "priority.mode=WEIGHTED", }) @SpringIntegrationTest class WeightedMultiLevelQueueListener extends MultiLevelQueueTest { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedPriorityQueueListener.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedPriorityQueueListener.java index cb4449fc..0f0a2131 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedPriorityQueueListener.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/integration/WeightedPriorityQueueListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -31,17 +31,17 @@ @WebAppConfiguration @TestPropertySource( properties = { - "spring.data.redis.port=7010", - "mysql.db.name=WeightedPriorityQueueListener", - "sms.queue.active=false", - "notification.queue.active=false", - "email.queue.active=false", - "job.queue.active=false", - "use.system.redis=false", - "priority.mode=WEIGHTED", - "reservation.queue.active=true", - "feed.generation.queue.active=true", - "chat.indexing.queue.active=true" + "spring.data.redis.port=7010", + "mysql.db.name=WeightedPriorityQueueListener", + "sms.queue.active=false", + "notification.queue.active=false", + "email.queue.active=false", + "job.queue.active=false", + "use.system.redis=false", + "priority.mode=WEIGHTED", + "reservation.queue.active=true", + "feed.generation.queue.active=true", + "chat.indexing.queue.active=true" }) @SpringIntegrationTest class WeightedPriorityQueueListener extends GroupPriorityTest { diff --git a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/unit/RqueueMessageConfigTest.java b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/unit/RqueueMessageConfigTest.java index 01e5cfc9..804e3319 100644 --- a/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/unit/RqueueMessageConfigTest.java +++ b/rqueue-spring/src/test/java/com/github/sonus21/rqueue/spring/tests/unit/RqueueMessageConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -45,16 +45,22 @@ class RqueueMessageConfigTest extends TestBase { private final List messageConverterList = new ArrayList<>(); + @Mock RqueueMessageHandler rqueueMessageHandler; + @Mock private SimpleRqueueListenerContainerFactory simpleRqueueListenerContainerFactory; + @Mock private BeanFactory beanFactory; + @Mock private RqueueMessageTemplate rqueueMessageTemplate; + @Mock private RedisConnectionFactory redisConnectionFactory; + @InjectMocks private RqueueListenerConfig rqueueMessageConfig; @@ -86,7 +92,8 @@ void rqueueMessageHandlerReused() throws IllegalAccessException { "com.github.sonus21.rqueue.converter.DefaultMessageConverterProvider", true); FieldUtils.writeField(messageConfig, "simpleRqueueListenerContainerFactory", factory, true); - assertEquals(rqueueMessageHandler.hashCode(), messageConfig.rqueueMessageHandler().hashCode()); + assertEquals( + rqueueMessageHandler.hashCode(), messageConfig.rqueueMessageHandler().hashCode()); } @Test diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/AtomicValueHolder.java b/rqueue-test-util/src/main/java/com/github/sonus21/AtomicValueHolder.java index 30858c79..b20721e5 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/AtomicValueHolder.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/AtomicValueHolder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/RandomUtils.java b/rqueue-test-util/src/main/java/com/github/sonus21/RandomUtils.java index 883cedaa..46157e48 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/RandomUtils.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/RandomUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/RedisStarterTest.java b/rqueue-test-util/src/main/java/com/github/sonus21/RedisStarterTest.java index 0038614c..acbf8987 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/RedisStarterTest.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/RedisStarterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -29,6 +29,5 @@ public int getRedisPort() { } @BeforeAll - public void init() { - } + public void init() {} } diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/TestBase.java b/rqueue-test-util/src/main/java/com/github/sonus21/TestBase.java index bf90b9e8..b1dd677c 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/TestBase.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/TestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -19,6 +19,4 @@ import lombok.extern.slf4j.Slf4j; @Slf4j -public abstract class TestBase extends RandomUtils { - -} +public abstract class TestBase extends RandomUtils {} diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/BootstrapRedis.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/BootstrapRedis.java index b75d1e28..bf403afe 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/BootstrapRedis.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/BootstrapRedis.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/LocalTest.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/LocalTest.java index 77a84fbf..e9d5db73 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/LocalTest.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/LocalTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -25,6 +25,4 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Tag("local") -public @interface LocalTest { - -} +public @interface LocalTest {} diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisAvailable.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisAvailable.java index b6d011de..4801da6a 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisAvailable.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisAvailable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisAvailableCondition.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisAvailableCondition.java index 320ca515..7b4ea5d4 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisAvailableCondition.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisAvailableCondition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisBootstrapper.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisBootstrapper.java index f92dd86c..30e8f118 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisBootstrapper.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisBootstrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -40,10 +40,10 @@ @Slf4j public class RedisBootstrapper extends RedisBootstrapperBase implements BeforeAllCallback, - AfterAllCallback, - ParameterResolver, - BeforeEachCallback, - AfterEachCallback { + AfterAllCallback, + ParameterResolver, + BeforeEachCallback, + AfterEachCallback { public static final String REDIS_BOOSTRAP_BEAN = "redisBootstrap"; diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisBootstrapperBase.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisBootstrapperBase.java index e31d57a0..d37e7921 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisBootstrapperBase.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisBootstrapperBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -84,27 +84,25 @@ protected void cleanup() throws IOException { protected void monitor(String host, int port) { log.info("Monitor {}:{}", host, port); - executorService.submit( - () -> { - try { - Process process = - Runtime.getRuntime() - .exec("redis-cli " + " -h " + host + " -p " + port + " monitor"); - List lines = new LinkedList<>(); - MonitorProcess monitorProcess = - new MonitorProcess(process, new RedisNode(host, port), lines); - processes.add(monitorProcess); - BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); - while (process.isAlive()) { - String s = br.readLine(); - if (s != null) { - lines.add(s); - } - } - } catch (Exception e) { - monitorLogger.error("Process call failed", e); + executorService.submit(() -> { + try { + Process process = + Runtime.getRuntime().exec("redis-cli " + " -h " + host + " -p " + port + " monitor"); + List lines = new LinkedList<>(); + MonitorProcess monitorProcess = + new MonitorProcess(process, new RedisNode(host, port), lines); + processes.add(monitorProcess); + BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); + while (process.isAlive()) { + String s = br.readLine(); + if (s != null) { + lines.add(s); } - }); + } + } catch (Exception e) { + monitorLogger.error("Process call failed", e); + } + }); } @AllArgsConstructor diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisRunning.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisRunning.java index 8bcd0a66..a57b78bb 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisRunning.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/RedisRunning.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestQueue.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestQueue.java index e4a99899..32b80873 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestQueue.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestQueue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Sonu Kumar + * Copyright (c) 2019-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestRunner.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestRunner.java index 35fd8215..7362eea6 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestRunner.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestRunner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -21,8 +21,7 @@ @Slf4j public final class TestRunner { - private TestRunner() { - } + private TestRunner() {} public static void run(Test test, Test failureCallback) throws Exception { run(test, null, failureCallback, 0); diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestStatLoggerExtension.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestStatLoggerExtension.java index dbe0a3ea..ab53e0d4 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestStatLoggerExtension.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestStatLoggerExtension.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -62,9 +62,8 @@ public void testFailed(ExtensionContext context, Throwable cause) { @Override public void afterAll(ExtensionContext context) throws Exception { - Map summary = - testResultsStatus.stream() - .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); + Map summary = testResultsStatus.stream() + .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); log.info("Test result summary for {} {}", context.getDisplayName(), summary.toString()); } diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestTracerExtension.java b/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestTracerExtension.java index 8561294f..1845616d 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestTracerExtension.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/junit/TestTracerExtension.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/test/ControllerProfiler.java b/rqueue-test-util/src/main/java/com/github/sonus21/test/ControllerProfiler.java index 167748cd..5a967cf6 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/test/ControllerProfiler.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/test/ControllerProfiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. @@ -26,10 +26,9 @@ @Slf4j public class ControllerProfiler { - @Pointcut( - "execution(* com.github.sonus21.rqueue.*.controller..*.*(..))||execution(* com.github.sonus21.rqueue.*.Controller.*(..))") - public void controller() { - } + @Pointcut("execution(* com.github.sonus21.rqueue.*.controller..*.*(..))||execution(*" + + " com.github.sonus21.rqueue.*.Controller.*(..))") + public void controller() {} @Around("controller()") public Object profile(ProceedingJoinPoint pjp) throws Throwable { diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/test/LoggerInterceptor.java b/rqueue-test-util/src/main/java/com/github/sonus21/test/LoggerInterceptor.java index 5031c14d..55c35c51 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/test/LoggerInterceptor.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/test/LoggerInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2023 Sonu Kumar + * Copyright (c) 2020-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/test/TestTaskExecutor.java b/rqueue-test-util/src/main/java/com/github/sonus21/test/TestTaskExecutor.java index 6eb2714d..6984cab8 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/test/TestTaskExecutor.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/test/TestTaskExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. diff --git a/rqueue-test-util/src/main/java/com/github/sonus21/test/TestTaskScheduler.java b/rqueue-test-util/src/main/java/com/github/sonus21/test/TestTaskScheduler.java index 106357b6..fd558dc9 100644 --- a/rqueue-test-util/src/main/java/com/github/sonus21/test/TestTaskScheduler.java +++ b/rqueue-test-util/src/main/java/com/github/sonus21/test/TestTaskScheduler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Sonu Kumar + * Copyright (c) 2021-2026 Sonu Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License.