diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index d6da913..4ca1bbb 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -13,27 +13,44 @@ jobs: runs-on: ubuntu-latest steps: - # Setup java environment - - name: setup-java - uses: actions/setup-java@v1 - with: - java-version: 11 - # Checkout the git repository - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + # Get the current project version from pom.xml + - name: get-project-version + id: get_project_version + uses: avides/actions-project-version-check@v2 with: - ref: ${{ github.head_ref }} - token: ${{ secrets.GPR_TOKEN }} - fetch-depth: '' + token: ${{ secrets.GITHUB_TOKEN }} + file-to-check: pom.xml + only-return-version: true - # Execute some necessary git commands to get more repository informations - - name: post-checkout - run: git fetch --prune --unshallow + # Determine java-version + - name: determine-java-version + id: determine_java_version + run: | + if grep -q "" pom.xml; then + JAVA_VERSION=$(grep -oP '(?<=).*?(?=)' pom.xml | head -n 1 | cut -d. -f1 | xargs) + elif [ -f ".github/java.version" ]; then + JAVA_VERSION=$(cat .github/java.version | xargs) + else + JAVA_VERSION="11" + fi + echo "detected_java_version=$JAVA_VERSION" >> $GITHUB_OUTPUT + + # Setup java environment + - name: setup-java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: ${{ steps.determine_java_version.outputs.detected_java_version }} # Setup/load GitHub Actions caching for external dependencies, in this case especially for Maven - name: caching - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -51,16 +68,16 @@ jobs: - name: integration-tests run: mvn -DskipUTs -Dgpg.skip=true jacoco:restore-instrumented-classes verify - # Execute sonar analysis and publish results to the sonarqube server + # Execute sonar analysis and publish results to the sonarcloud server - name: sonar-analyse env: - SONAR_HOST: ${{ secrets.OS_SONAR_HOST_URL }} - SONAR_TOKEN: ${{ secrets.OS_SONAR_TOKEN }} + PROJECT_VERSION: ${{ steps.get_project_version.outputs.version }} run: | export SONAR_ORGANIZATION=$(echo ${GITHUB_REPOSITORY} | cut -d / -f 1) - mvn sonar:sonar \ - -Dsonar.host.url=${SONAR_HOST} \ - -Dsonar.login=${SONAR_TOKEN} \ + mvn org.sonarsource.scanner.maven:sonar-maven-plugin:5.5.0.6356:sonar \ + -Dsonar.host.url=${{ secrets.OS_SONAR_HOST_URL }} \ + -Dsonar.token=${{ secrets.OS_SONAR_TOKEN }} \ + -Dsonar.projectVersion=${PROJECT_VERSION} \ + -Dsonar.branch.name=master \ -Dsonar.organization=${SONAR_ORGANIZATION} \ - -Dsonar.projectKey=${GITHUB_REPOSITORY//\//_} \ - -Dsonar.java.binaries=./target/classes + -Dsonar.projectKey=${GITHUB_REPOSITORY//\//_} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3879c8d..7e4dca7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -# This configuration is used for the deployment and publish to GitHub Packages +# This configuration is used for the deployment and publish to Maven Central name: release on: @@ -11,81 +11,88 @@ jobs: release: timeout-minutes: 30 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - runs-on: ubuntu-latest steps: - # Setup java environment - - name: setup-java - uses: actions/setup-java@v1 - with: - java-version: 11 - server-id: ossrh - server-username: OSSRH_USERNAME - server-password: OSSRH_PASSWORD - - # Checkout the git repository - - name: setup-github-release - run: sed -i -e 's/<\/servers>/github<\/id>x-access-token<\/username>${GITHUB_TOKEN}<\/password><\/server><\/servers>/g' /home/runner/.m2/settings.xml - - # Setup GPG for Maven Central deployment - - name: setup-gpg - env: - GPG_PRIVATE_KEY: ${{ secrets.OS_GPG_PRIVATE_KEY }} - run: cat <(echo -e "${GPG_PRIVATE_KEY}") | gpg --batch --import - # Checkout the git repository - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v6 with: - ref: ${{ github.head_ref }} - token: ${{ secrets.GPR_TOKEN }} - fetch-depth: '' + fetch-depth: 0 + + # Get the current project version from pom.xml + - name: get-project-version + id: get_project_version + uses: avides/actions-project-version-check@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + file-to-check: pom.xml + only-return-version: true - # Execute some necessary git commands to get more repository informations - - name: post-checkout - run: git fetch --prune --unshallow + # Determine java-version + - name: determine-java-version + id: determine_java_version + run: | + if grep -q "" pom.xml; then + JAVA_VERSION=$(grep -oP '(?<=).*?(?=)' pom.xml | head -n 1 | cut -d. -f1 | xargs) + elif [ -f ".github/java.version" ]; then + JAVA_VERSION=$(cat .github/java.version | xargs) + else + JAVA_VERSION="11" + fi + echo "detected_java_version=$JAVA_VERSION" >> $GITHUB_OUTPUT + + # Setup java environment + - name: setup-java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: ${{ steps.determine_java_version.outputs.detected_java_version }} + server-id: central + server-username: OS_CENTRAL_USERNAME + server-password: OS_CENTRAL_PASSWORD # Setup GitHub Actions caching for external dependencies, in this case especially for Maven - name: caching - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-maven- - # Execute Maven command for the deployment and publish to Maven Central + # Setup GPG for Maven Central deployment + - name: setup-gpg + env: + GPG_PRIVATE_KEY: ${{ secrets.OS_GPG_PRIVATE_KEY }} + run: cat <(echo -e "${GPG_PRIVATE_KEY}") | gpg --batch --import + + # Execute Maven command to build the project and publish to Maven Central - name: deploy env: - OSSRH_USERNAME: ${{ secrets.OS_OSSRH_USERNAME }} - OSSRH_PASSWORD: ${{ secrets.OS_OSSRH_PASSWORD }} + OS_CENTRAL_USERNAME: ${{ secrets.OS_CENTRAL_USERNAME }} + OS_CENTRAL_PASSWORD: ${{ secrets.OS_CENTRAL_PASSWORD }} GPG_PASSPHRASE: ${{ secrets.OS_GPG_PASSPHRASE }} - run: mvn deploy -Dmaven.wagon.http.pool=false -Dgpg.executable=gpg -Dgpg.passphrase=${GPG_PASSPHRASE} + PROJECT_VERSION: ${{ steps.get_project_version.outputs.version }} + run: | + if [[ "$PROJECT_VERSION" == *"SNAPSHOT"* || "$PROJECT_VERSION" == *"RC"* ]]; then + mvn -Dmaven.wagon.http.pool=false -Dgpg.executable=gpg -Dgpg.passphrase=${GPG_PASSPHRASE} clean deploy + else + mvn -Dmaven.wagon.http.pool=false -Dgpg.executable=gpg -Dgpg.passphrase=${GPG_PASSPHRASE} -DskipUTs -DskipITs clean deploy + fi # Execute sonar analysis and publish results to the sonarcloud server - name: sonar-analyse env: - SONAR_HOST: ${{ secrets.OS_SONAR_HOST_URL }} - SONAR_TOKEN: ${{ secrets.OS_SONAR_TOKEN }} + PROJECT_VERSION: ${{ steps.get_project_version.outputs.version }} run: | export SONAR_ORGANIZATION=$(echo ${GITHUB_REPOSITORY} | cut -d / -f 1) - mvn sonar:sonar \ - -Dsonar.host.url=${SONAR_HOST} \ - -Dsonar.login=${SONAR_TOKEN} \ + mvn org.sonarsource.scanner.maven:sonar-maven-plugin:5.5.0.6356:sonar \ + -Dsonar.host.url=${{ secrets.OS_SONAR_HOST_URL }} \ + -Dsonar.token=${{ secrets.OS_SONAR_TOKEN }} \ + -Dsonar.projectVersion=${PROJECT_VERSION} \ + -Dsonar.branch.name=${{ github.ref_name }} \ -Dsonar.organization=${SONAR_ORGANIZATION} \ - -Dsonar.projectKey=${GITHUB_REPOSITORY//\//_} \ - -Dsonar.java.binaries=./target/classes - - # Get the current project version from POM - - name: get-project-version - id: get_project_version - uses: avides/actions-project-version-check@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - file-to-check: pom.xml - only-return-version: true + -Dsonar.projectKey=${GITHUB_REPOSITORY//\//_} # Get last commit message for GitHub Release tag - name: setup-github-release @@ -93,19 +100,18 @@ jobs: env: PROJECT_VERSION: ${{ steps.get_project_version.outputs.version }} run: | - echo ::set-output name=gitcommitmessage::$(git log --no-merges -1 --oneline) + echo "gitcommitmessage=$(git log --no-merges -1 --oneline)" >> $GITHUB_OUTPUT if [[ "$PROJECT_VERSION" == *"SNAPSHOT"* || "$PROJECT_VERSION" == *"RC"* ]]; then - echo ::set-output name=isprerelease::true + echo "isprerelease=true" >> $GITHUB_OUTPUT + else + echo "isprerelease=false" >> $GITHUB_OUTPUT fi # Create and publish GitHub Release tag - name: github-release - uses: actions/create-release@v1 - continue-on-error: true - env: - GITHUB_TOKEN: ${{ secrets.GPR_TOKEN }} + uses: softprops/action-gh-release@v2 with: + token: ${{ secrets.GPR_TOKEN }} tag_name: ${{ steps.get_project_version.outputs.version }} - release_name: ${{ steps.get_project_version.outputs.version }} body: ${{ steps.setup_github_release.outputs.gitcommitmessage }} prerelease: ${{ steps.setup_github_release.outputs.isprerelease }} diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml index e358957..9263ed3 100644 --- a/.github/workflows/review.yml +++ b/.github/workflows/review.yml @@ -9,44 +9,32 @@ on: jobs: review: timeout-minutes: 30 - + runs-on: ubuntu-latest - steps: - # Cancels previous run for this branch that have a different commit id (SHA) - - name: cancel-previous-run - uses: styfle/cancel-workflow-action@0.8.0 - with: - access_token: ${{ github.token }} - - # Setup java environment - - name: setup-java - uses: actions/setup-java@v1 - with: - java-version: 11 + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + steps: # Checkout the git repository - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v6 with: - ref: ${{ github.head_ref }} token: ${{ secrets.GPR_TOKEN }} - fetch-depth: '' - - # Execute some necessary git commands to get more repository informations - - name: post-checkout - run: git fetch --prune --unshallow + ref: ${{ github.head_ref }} + fetch-depth: 0 # Update GitHub Action configuration if necessary - name: action-configuration-autoupdate - uses: avides/actions-action-configuration-autoupdate@v1 + uses: avides/actions-action-configuration-autoupdate@v2 with: token: ${{ secrets.GPR_TOKEN }} actions-configuration-files: os-java-library/nightly.yml,os-java-library/release.yml,os-java-library/review.yml source-repository: ${{ secrets.ACTIONS_CONFIG_AUTOUPDATE_REPO }} # Push updated GitHub Actions configuration if necessary - - uses: stefanzweifel/git-auto-commit-action@v4 + - uses: stefanzweifel/git-auto-commit-action@v7 with: file_pattern: .github/workflows/*.yml commit_user_name: ${{ secrets.ACTIONS_CONFIG_AUTOUPDATE_USER }} @@ -56,34 +44,65 @@ jobs: # Verify project version is updated - name: project-version-check - uses: avides/actions-project-version-check@v1 + uses: avides/actions-project-version-check@v2 with: token: ${{ secrets.GITHUB_TOKEN }} file-to-check: pom.xml additional-files-to-check: README.md - # Check if documentation reminder comment is already given - - name: find-documentation-reminder-comment - uses: peter-evans/find-comment@v1 - id: find_documentation_reminder_comment + # Determine java-version + - name: determine-java-version + id: determine_java_version + run: | + if grep -q "" pom.xml; then + JAVA_VERSION=$(grep -oP '(?<=).*?(?=)' pom.xml | head -n 1 | cut -d. -f1 | xargs) + elif [ -f ".github/java.version" ]; then + JAVA_VERSION=$(cat .github/java.version | xargs) + else + JAVA_VERSION="11" + fi + echo "detected_java_version=$JAVA_VERSION" >> $GITHUB_OUTPUT + + # Setup java environment + - name: setup-java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: ${{ steps.determine_java_version.outputs.detected_java_version }} + + # Check if reminder comment is already given + - name: find-reminder-comment + uses: peter-evans/find-comment@v4 + id: find_reminder_comment with: issue-number: ${{ github.event.number }} - body-includes: "Confluence/GitHub documentation added or updated?" + body-includes: "Documentation added or updated?" - # Add documentation reminder comment if not given - - name: documentation-reminder-comment - uses: jungwinter/comment@v1 + # Add reminder comment if not given + - name: reminder-comment + uses: peter-evans/create-or-update-comment@v5 id: create - if: ${{ steps.find_documentation_reminder_comment.outputs.comment-id == 0 }} + if: ${{ steps.find_reminder_comment.outputs.comment-id == 0 }} with: - type: create - body: 'Confluence/GitHub documentation added or updated?' - issue_number: ${{ github.event.number }} + body: | + - Documentation added or updated? + - Diff-Links as response added? + - [ ] Not necessary + - [ ] Added + + - Breaking-Change present? + - Necessary deployment adjustments added as a comment (Ticket)? + - [ ] Not necessary + - [ ] Added + - Necessary rollback adjustments added as a comment (Ticket)? + - [ ] Not necessary + - [ ] Added + issue-number: ${{ github.event.number }} token: ${{ secrets.GITHUB_TOKEN }} # Setup/load GitHub Actions caching for external dependencies, in this case especially for Maven - name: caching - uses: actions/cache@v2 + uses: actions/cache@v5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -101,24 +120,19 @@ jobs: - name: integration-tests run: mvn -DskipUTs -Dgpg.skip=true jacoco:restore-instrumented-classes verify - # Execute sonar analysis for current branch + # Execute sonar analysis and publish results to the sonarcloud server - name: sonar-analyse - env: - SONAR_HOST: ${{ secrets.OS_SONAR_HOST_URL }} - SONAR_TOKEN: ${{ secrets.OS_SONAR_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | export SONAR_ORGANIZATION=$(echo ${GITHUB_REPOSITORY} | cut -d / -f 1) - mvn sonar:sonar \ - -Dsonar.host.url=${SONAR_HOST} \ - -Dsonar.login=${SONAR_TOKEN} \ - -Dsonar.organization=${SONAR_ORGANIZATION} \ - -Dsonar.projectKey=${GITHUB_REPOSITORY//\//_} \ - -Dsonar.pullrequest.key=${{ github.event.number }} \ + mvn org.sonarsource.scanner.maven:sonar-maven-plugin:5.5.0.6356:sonar \ + -Dsonar.host.url=${{ secrets.OS_SONAR_HOST_URL }} \ + -Dsonar.token=${{ secrets.OS_SONAR_TOKEN }} \ + -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} \ -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} \ - -Dsonar.pullrequest.github.repository=${GITHUB_REPOSITORY} \ + -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} \ -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} \ - -Dsonar.java.binaries=./target/classes + -Dsonar.organization=${SONAR_ORGANIZATION} \ + -Dsonar.projectKey=${GITHUB_REPOSITORY//\//_} # Execute Maven enforcer plugin - name: pom-analyse diff --git a/README.md b/README.md index 6d89d8d..46f37ce 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ com.avides.spring spring-rabbit - 2.7.0 + 3.0.0 ``` diff --git a/pom.xml b/pom.xml index d37f7bf..db05dc1 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.avides.spring spring-rabbit - 2.7.0 + 3.0.0 spring-rabbit Makes configuring RabbitMQ for Spring Boot applications more comfortable @@ -24,6 +24,10 @@ Julian Eggers eggers.julian@gmail.com + + Finn Egbers + finn.egbers@gmail.com + @@ -34,7 +38,7 @@ - ossrh + central https://oss.sonatype.org/service/local/staging/deploy/maven2/ @@ -55,9 +59,8 @@ 3.0.0-M3 3.0.0-M1 1.11.2 - 0.3.0 - 1.4.0 - 1.6.12 + 0.6.0 + 0.11.0 ${spring.version} 5.3.15 @@ -82,7 +85,7 @@ 4.3 1.4.0 3.0.0 - 1.3.0 + 1.4.0 ${logback-classic.version} 1.2.10 4.1.1 @@ -464,34 +467,14 @@ - de.jutzig - github-release-plugin - ${github-release-plugin.version} - - - github-upload - deploy - - release - - - ${project.version} - ${project.version} - ${project.build.directory}/${project.artifactId}-${project.version}.jar - - - - - - org.sonatype.plugins - nexus-staging-maven-plugin - ${nexus-staging-maven-plugin.version} + org.sonatype.central + central-publishing-maven-plugin + ${central-publishing-maven-plugin.version} true - ossrh - https://oss.sonatype.org/ - true - ${skip-deploy-to-central} + true + published + ${skip-deploy-to-central} diff --git a/src/main/java/com/avides/spring/rabbit/configuration/creator/DlxQueueCreator.java b/src/main/java/com/avides/spring/rabbit/configuration/creator/DlxQueueCreator.java index 676d37a..6124129 100644 --- a/src/main/java/com/avides/spring/rabbit/configuration/creator/DlxQueueCreator.java +++ b/src/main/java/com/avides/spring/rabbit/configuration/creator/DlxQueueCreator.java @@ -1,5 +1,8 @@ package com.avides.spring.rabbit.configuration.creator; +import static com.avides.spring.rabbit.configuration.creator.QueueCreator.DEFAULT_X_QUEUE_TYPE; +import static com.avides.spring.rabbit.configuration.creator.QueueCreator.X_QUEUE_TYPE; + import java.util.HashMap; import java.util.Map; @@ -22,7 +25,7 @@ public Queue createInstance() { Map dlxArguments = new HashMap<>(); dlxArguments.put("x-max-length", Long.valueOf(queueProperties.getLimit())); - dlxArguments.put("x-queue-mode", "lazy"); + dlxArguments.put(X_QUEUE_TYPE, resolveQueueType()); Queue dlxQueue = new Queue(queueProperties.getName() + ".dlx", queueProperties.isDurable(), queueProperties.isExclusive(), false, dlxArguments); dlxQueue.setAdminsThatShouldDeclare(rabbitAdmin); @@ -30,4 +33,13 @@ public Queue createInstance() return dlxQueue; } + private String resolveQueueType() + { + if (queueProperties.getArguments() != null && queueProperties.getArguments().get(X_QUEUE_TYPE) != null) + { + return (String) queueProperties.getArguments().get(X_QUEUE_TYPE); + } + return DEFAULT_X_QUEUE_TYPE; + } + } diff --git a/src/main/java/com/avides/spring/rabbit/configuration/creator/QueueCreator.java b/src/main/java/com/avides/spring/rabbit/configuration/creator/QueueCreator.java index 526a401..057714c 100644 --- a/src/main/java/com/avides/spring/rabbit/configuration/creator/QueueCreator.java +++ b/src/main/java/com/avides/spring/rabbit/configuration/creator/QueueCreator.java @@ -1,6 +1,7 @@ package com.avides.spring.rabbit.configuration.creator; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -18,6 +19,10 @@ @RequiredArgsConstructor public class QueueCreator implements Creator { + public static final String X_QUEUE_TYPE = "x-queue-type"; + + public static final String DEFAULT_X_QUEUE_TYPE = "quorum"; + private final QueueProperties queueProperties; private final RabbitAdmin rabbitAdmin; @@ -40,7 +45,8 @@ public Queue createInstance() private Map createArguments() { - Map arguments = queueProperties.getArguments(); + Map arguments = new HashMap<>(queueProperties.getArguments()); + arguments.putIfAbsent(X_QUEUE_TYPE, DEFAULT_X_QUEUE_TYPE); arguments.put("x-dead-letter-exchange", ""); arguments.put("x-dead-letter-routing-key", queueProperties.getName() + ".dlx"); arguments.put("x-max-length", Long.valueOf(queueProperties.getLimit())); diff --git a/src/test/java/com/avides/spring/rabbit/configuration/SpringRabbitAutoConfigurationForMultipleConnectionFactoriesIT.java b/src/test/java/com/avides/spring/rabbit/configuration/SpringRabbitAutoConfigurationForMultipleConnectionFactoriesIT.java index 13f1eba..a565b5d 100644 --- a/src/test/java/com/avides/spring/rabbit/configuration/SpringRabbitAutoConfigurationForMultipleConnectionFactoriesIT.java +++ b/src/test/java/com/avides/spring/rabbit/configuration/SpringRabbitAutoConfigurationForMultipleConnectionFactoriesIT.java @@ -1,5 +1,6 @@ package com.avides.spring.rabbit.configuration; +import static com.avides.spring.rabbit.configuration.creator.QueueCreator.X_QUEUE_TYPE; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -119,7 +120,8 @@ private void checkQueues() assertEquals("com.avides.spring.rabbit.queue.zero", queueZero.getName()); assertEquals(1, queueZero.getDeclaringAdmins().size()); assertEquals(firstRabbitAdmin, queueZero.getDeclaringAdmins().iterator().next()); - assertEquals(3, queueZero.getArguments().size()); + assertEquals(4, queueZero.getArguments().size()); + assertEquals("quorum", queueZero.getArguments().get(X_QUEUE_TYPE)); assertTrue(String.valueOf(queueZero.getArguments().get("x-dead-letter-exchange")).isEmpty()); assertEquals("com.avides.spring.rabbit.queue.zero.dlx", queueZero.getArguments().get("x-dead-letter-routing-key")); assertEquals(Long.valueOf(50), queueZero.getArguments().get("x-max-length")); @@ -129,8 +131,8 @@ private void checkQueues() assertEquals(1, queueZeroDlx.getDeclaringAdmins().size()); assertEquals(firstRabbitAdmin, queueZeroDlx.getDeclaringAdmins().iterator().next()); assertEquals(2, queueZeroDlx.getArguments().size()); + assertEquals("quorum", queueZeroDlx.getArguments().get(X_QUEUE_TYPE)); assertEquals(Long.valueOf(50), queueZeroDlx.getArguments().get("x-max-length")); - assertEquals("lazy", queueZeroDlx.getArguments().get("x-queue-mode")); // queueOne assertEquals("com.avides.spring.rabbit.queue.one", queueOne.getName()); @@ -138,10 +140,10 @@ private void checkQueues() // assertEquals(rabbitAdmin, queueOne.getDeclaringAdmins().iterator().next()); Currently the queue is declared by a different rabbitAdmin and the // application not saves it assertEquals(5, queueOne.getArguments().size()); + assertEquals("classic", queueOne.getArguments().get(X_QUEUE_TYPE)); assertTrue(String.valueOf(queueOne.getArguments().get("x-dead-letter-exchange")).isEmpty()); assertEquals("com.avides.spring.rabbit.queue.one.dlx", queueOne.getArguments().get("x-dead-letter-routing-key")); assertEquals(Long.valueOf(1), queueOne.getArguments().get("x-max-length")); - assertEquals("lazy", queueOne.getArguments().get("x-queue-mode")); assertEquals("test", queueOne.getArguments().get("someAdditionalQueueArgumentsKey")); // queueOneDlx @@ -150,8 +152,8 @@ private void checkQueues() // assertEquals(rabbitAdmin, queueOneDlx.getDeclaringAdmins().iterator().next()); Currently the queue is declared by a different rabbitAdmin and the // application not saves it assertEquals(2, queueOneDlx.getArguments().size()); + assertEquals("classic", queueOneDlx.getArguments().get(X_QUEUE_TYPE)); assertEquals(Long.valueOf(1), queueOneDlx.getArguments().get("x-max-length")); - assertEquals("lazy", queueOneDlx.getArguments().get("x-queue-mode")); } @EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) diff --git a/src/test/java/com/avides/spring/rabbit/configuration/SpringRabbitAutoConfigurationForQueueManagementWithOneConnectionFactoryIT.java b/src/test/java/com/avides/spring/rabbit/configuration/SpringRabbitAutoConfigurationForQueueManagementWithOneConnectionFactoryIT.java index 5e1049a..d6a6c55 100644 --- a/src/test/java/com/avides/spring/rabbit/configuration/SpringRabbitAutoConfigurationForQueueManagementWithOneConnectionFactoryIT.java +++ b/src/test/java/com/avides/spring/rabbit/configuration/SpringRabbitAutoConfigurationForQueueManagementWithOneConnectionFactoryIT.java @@ -1,5 +1,6 @@ package com.avides.spring.rabbit.configuration; +import static com.avides.spring.rabbit.configuration.creator.QueueCreator.X_QUEUE_TYPE; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -112,7 +113,8 @@ private void checkQueues() assertEquals("com.avides.spring.rabbit.queue.zero", queueZero.getName()); assertEquals(1, queueZero.getDeclaringAdmins().size()); assertEquals(rabbitAdmin, queueZero.getDeclaringAdmins().iterator().next()); - assertEquals(3, queueZero.getArguments().size()); + assertEquals(4, queueZero.getArguments().size()); + assertEquals("quorum", queueZero.getArguments().get(X_QUEUE_TYPE)); assertTrue(String.valueOf(queueZero.getArguments().get("x-dead-letter-exchange")).isEmpty()); assertEquals("com.avides.spring.rabbit.queue.zero.dlx", queueZero.getArguments().get("x-dead-letter-routing-key")); assertEquals(Long.valueOf(50), queueZero.getArguments().get("x-max-length")); @@ -123,9 +125,9 @@ private void checkQueues() assertEquals(1, queueZeroDlx.getDeclaringAdmins().size()); assertEquals(rabbitAdmin, queueZeroDlx.getDeclaringAdmins().iterator().next()); assertEquals(2, queueZeroDlx.getArguments().size()); + assertEquals("quorum", queueZeroDlx.getArguments().get(X_QUEUE_TYPE)); assertEquals(Long.valueOf(50), queueZeroDlx.getArguments().get("x-max-length")); - assertEquals("lazy", queueZeroDlx.getArguments().get("x-queue-mode")); - assertFalse(queueZero.isExclusive()); + assertFalse(queueZeroDlx.isExclusive()); // queueOne assertEquals("com.avides.spring.rabbit.queue.one", queueOne.getName()); @@ -133,10 +135,10 @@ private void checkQueues() // assertEquals(rabbitAdmin, queueOne.getDeclaringAdmins().iterator().next()); Currently the queue is declared by a different rabbitAdmin and the // application not saves it assertEquals(5, queueOne.getArguments().size()); + assertEquals("classic", queueOne.getArguments().get(X_QUEUE_TYPE)); assertTrue(String.valueOf(queueOne.getArguments().get("x-dead-letter-exchange")).isEmpty()); assertEquals("com.avides.spring.rabbit.queue.one.dlx", queueOne.getArguments().get("x-dead-letter-routing-key")); assertEquals(Long.valueOf(1), queueOne.getArguments().get("x-max-length")); - assertEquals("lazy", queueOne.getArguments().get("x-queue-mode")); assertEquals("test", queueOne.getArguments().get("someAdditionalQueueArgumentsKey")); assertTrue(queueOne.isExclusive()); @@ -146,8 +148,8 @@ private void checkQueues() // assertEquals(rabbitAdmin, queueOneDlx.getDeclaringAdmins().iterator().next()); Currently the queue is declared by a different rabbitAdmin and the // application not saves it assertEquals(2, queueOneDlx.getArguments().size()); + assertEquals("classic", queueOneDlx.getArguments().get(X_QUEUE_TYPE)); assertEquals(Long.valueOf(1), queueOneDlx.getArguments().get("x-max-length")); - assertEquals("lazy", queueOneDlx.getArguments().get("x-queue-mode")); - assertTrue(queueOne.isExclusive()); + assertTrue(queueOneDlx.isExclusive()); } } diff --git a/src/test/java/com/avides/spring/rabbit/configuration/creator/DlxQueueCreatorTest.java b/src/test/java/com/avides/spring/rabbit/configuration/creator/DlxQueueCreatorTest.java index 11794cb..b362561 100644 --- a/src/test/java/com/avides/spring/rabbit/configuration/creator/DlxQueueCreatorTest.java +++ b/src/test/java/com/avides/spring/rabbit/configuration/creator/DlxQueueCreatorTest.java @@ -1,5 +1,6 @@ package com.avides.spring.rabbit.configuration.creator; +import static com.avides.spring.rabbit.configuration.creator.QueueCreator.X_QUEUE_TYPE; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.getCurrentArguments; import static org.junit.Assert.assertEquals; @@ -37,7 +38,7 @@ public void testCreateInstanceWithDurable() assertEquals("testQueueName.dlx", queue.getName()); assertEquals(2, queue.getArguments().size()); assertEquals("100", queue.getArguments().get("x-max-length").toString()); - assertEquals("lazy", queue.getArguments().get("x-queue-mode").toString()); + assertEquals("quorum", queue.getArguments().get(X_QUEUE_TYPE).toString()); assertTrue(queue.isDurable()); assertFalse(queue.isAutoDelete()); assertFalse(queue.isExclusive()); @@ -55,7 +56,7 @@ public void testCreateInstanceWithDurable() assertEquals("testQueueName.dlx", dlxQueue.getName()); assertEquals(2, dlxQueue.getArguments().size()); assertEquals("100", dlxQueue.getArguments().get("x-max-length").toString()); - assertEquals("lazy", dlxQueue.getArguments().get("x-queue-mode").toString()); + assertEquals("quorum", dlxQueue.getArguments().get(X_QUEUE_TYPE).toString()); assertTrue(dlxQueue.isDurable()); assertFalse(dlxQueue.isAutoDelete()); assertFalse(dlxQueue.isExclusive()); @@ -71,7 +72,7 @@ public void testCreateInstanceWithNotDurable() assertEquals("testQueueName.dlx", queue.getName()); assertEquals(2, queue.getArguments().size()); assertEquals("100", queue.getArguments().get("x-max-length").toString()); - assertEquals("lazy", queue.getArguments().get("x-queue-mode").toString()); + assertEquals("quorum", queue.getArguments().get(X_QUEUE_TYPE).toString()); assertFalse(queue.isDurable()); assertFalse(queue.isAutoDelete()); assertFalse(queue.isExclusive()); @@ -89,7 +90,7 @@ public void testCreateInstanceWithNotDurable() assertEquals("testQueueName.dlx", dlxQueue.getName()); assertEquals(2, dlxQueue.getArguments().size()); assertEquals("100", dlxQueue.getArguments().get("x-max-length").toString()); - assertEquals("lazy", dlxQueue.getArguments().get("x-queue-mode").toString()); + assertEquals("quorum", dlxQueue.getArguments().get(X_QUEUE_TYPE).toString()); assertFalse(dlxQueue.isDurable()); assertFalse(dlxQueue.isAutoDelete()); assertFalse(dlxQueue.isExclusive()); @@ -105,7 +106,7 @@ public void testCreateInstanceWithExclusive() assertEquals("testQueueName.dlx", queue.getName()); assertEquals(2, queue.getArguments().size()); assertEquals("100", queue.getArguments().get("x-max-length").toString()); - assertEquals("lazy", queue.getArguments().get("x-queue-mode").toString()); + assertEquals("quorum", queue.getArguments().get(X_QUEUE_TYPE).toString()); assertTrue(queue.isDurable()); assertFalse(queue.isAutoDelete()); assertTrue(queue.isExclusive()); @@ -123,7 +124,7 @@ public void testCreateInstanceWithExclusive() assertEquals("testQueueName.dlx", dlxQueue.getName()); assertEquals(2, dlxQueue.getArguments().size()); assertEquals("100", dlxQueue.getArguments().get("x-max-length").toString()); - assertEquals("lazy", dlxQueue.getArguments().get("x-queue-mode").toString()); + assertEquals("quorum", dlxQueue.getArguments().get(X_QUEUE_TYPE).toString()); assertTrue(dlxQueue.isDurable()); assertFalse(dlxQueue.isAutoDelete()); assertTrue(dlxQueue.isExclusive()); @@ -139,7 +140,7 @@ public void testCreateInstanceWithNotExclusive() assertEquals("testQueueName.dlx", queue.getName()); assertEquals(2, queue.getArguments().size()); assertEquals("100", queue.getArguments().get("x-max-length").toString()); - assertEquals("lazy", queue.getArguments().get("x-queue-mode").toString()); + assertEquals("quorum", queue.getArguments().get(X_QUEUE_TYPE).toString()); assertTrue(queue.isDurable()); assertFalse(queue.isAutoDelete()); assertFalse(queue.isExclusive()); @@ -157,7 +158,41 @@ public void testCreateInstanceWithNotExclusive() assertEquals("testQueueName.dlx", dlxQueue.getName()); assertEquals(2, dlxQueue.getArguments().size()); assertEquals("100", dlxQueue.getArguments().get("x-max-length").toString()); - assertEquals("lazy", dlxQueue.getArguments().get("x-queue-mode").toString()); + assertEquals("quorum", dlxQueue.getArguments().get(X_QUEUE_TYPE).toString()); + assertTrue(dlxQueue.isDurable()); + assertFalse(dlxQueue.isAutoDelete()); + assertFalse(dlxQueue.isExclusive()); + } + + @Test + public void testCreateInstanceWithOverriddenQueueType() + { + rabbitAdmin.declareQueue(anyObject(Queue.class)); + expectLastCall().andAnswer(() -> + { + Queue queue = (Queue) getCurrentArguments()[0]; + assertEquals("testQueueName.dlx", queue.getName()); + assertEquals(2, queue.getArguments().size()); + assertEquals("100", queue.getArguments().get("x-max-length").toString()); + assertEquals("classic", queue.getArguments().get(X_QUEUE_TYPE).toString()); + assertTrue(queue.isDurable()); + assertFalse(queue.isAutoDelete()); + assertFalse(queue.isExclusive()); + return "testQueueName.dlx"; + }); + + replayAll(); + QueueProperties queueProperties = getCompleteQueueProperties(); + queueProperties.getArguments().put(X_QUEUE_TYPE, "classic"); + creator = new DlxQueueCreator(rabbitAdmin, queueProperties); + + Queue dlxQueue = creator.createInstance(); + verifyAll(); + + assertEquals("testQueueName.dlx", dlxQueue.getName()); + assertEquals(2, dlxQueue.getArguments().size()); + assertEquals("100", dlxQueue.getArguments().get("x-max-length").toString()); + assertEquals("classic", dlxQueue.getArguments().get(X_QUEUE_TYPE).toString()); assertTrue(dlxQueue.isDurable()); assertFalse(dlxQueue.isAutoDelete()); assertFalse(dlxQueue.isExclusive()); diff --git a/src/test/java/com/avides/spring/rabbit/configuration/creator/QueueCreatorTest.java b/src/test/java/com/avides/spring/rabbit/configuration/creator/QueueCreatorTest.java index 0a4f874..16cdf3a 100644 --- a/src/test/java/com/avides/spring/rabbit/configuration/creator/QueueCreatorTest.java +++ b/src/test/java/com/avides/spring/rabbit/configuration/creator/QueueCreatorTest.java @@ -1,5 +1,6 @@ package com.avides.spring.rabbit.configuration.creator; +import static com.avides.spring.rabbit.configuration.creator.QueueCreator.X_QUEUE_TYPE; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.getCurrentArguments; import static org.junit.Assert.assertEquals; @@ -49,7 +50,8 @@ public void testCreateInstance() assertFalse(queue.isAutoDelete()); Map arguments = queue.getArguments(); - assertEquals(4, arguments.size()); + assertEquals(5, arguments.size()); + assertEquals("quorum", arguments.get(X_QUEUE_TYPE)); assertEquals("", arguments.get("x-dead-letter-exchange")); assertEquals("testQueueName.dlx", arguments.get("x-dead-letter-routing-key")); assertEquals("100", arguments.get("x-max-length").toString()); @@ -87,6 +89,59 @@ public void testCreateInstance() verifyAll(); } + @Test + public void testCreateInstanceWithOverriddenQueueType() + { + rabbitAdmin.declareQueue(anyObject(Queue.class)); + expectLastCall().andAnswer(() -> + { + Queue queue = (Queue) getCurrentArguments()[0]; + assertEquals("testQueueName", queue.getName()); + assertTrue(queue.isDurable()); + assertFalse(queue.isExclusive()); + assertFalse(queue.isAutoDelete()); + + Map arguments = queue.getArguments(); + assertEquals(5, arguments.size()); + assertEquals("classic", arguments.get(X_QUEUE_TYPE)); + assertEquals("", arguments.get("x-dead-letter-exchange")); + assertEquals("testQueueName.dlx", arguments.get("x-dead-letter-routing-key")); + assertEquals("100", arguments.get("x-max-length").toString()); + assertEquals("additionalConfig", arguments.get("additionalArgument")); + + return "testQueueName"; + }); + + rabbitAdmin.declareExchange(exchange); + + exchange.getName(); + expectLastCall().andReturn("springExchange"); + + rabbitAdmin.declareBinding(anyObject(Binding.class)); + expectLastCall().andAnswer(() -> + { + Binding binding = (Binding) getCurrentArguments()[0]; + assertTrue(binding.getArguments().isEmpty()); + assertEquals("product", binding.getRoutingKey()); + assertEquals("springExchange", binding.getExchange()); + return null; + }); + + replayAll(); + Map arguments = new HashMap<>(); + arguments.put(X_QUEUE_TYPE, "classic"); + arguments.put("x-dead-letter-exchange", "toOverride"); + arguments.put("x-dead-letter-routing-key", "toOverride"); + arguments.put("x-max-length", Long.valueOf(10000)); + arguments.put("additionalArgument", "additionalConfig"); + + QueueProperties completeQueueProperties = getCompleteQueueProperties(); + completeQueueProperties.setArguments(arguments); + creator = new QueueCreator(completeQueueProperties, rabbitAdmin, exchange); + creator.createInstance(); + verifyAll(); + } + @Test public void testCreateInstanceWithMultipleRoutingKeys() { @@ -100,7 +155,8 @@ public void testCreateInstanceWithMultipleRoutingKeys() assertFalse(queue.isAutoDelete()); Map arguments = queue.getArguments(); - assertEquals(4, arguments.size()); + assertEquals(5, arguments.size()); + assertEquals("quorum", arguments.get(X_QUEUE_TYPE)); assertEquals("", arguments.get("x-dead-letter-exchange")); assertEquals("testQueueName.dlx", arguments.get("x-dead-letter-routing-key")); assertEquals("100", arguments.get("x-max-length").toString()); @@ -204,7 +260,8 @@ public void testCreateInstanceWithExclusive() assertFalse(queue.isAutoDelete()); Map arguments = queue.getArguments(); - assertEquals(4, arguments.size()); + assertEquals(5, arguments.size()); + assertEquals("quorum", arguments.get(X_QUEUE_TYPE)); assertEquals("", arguments.get("x-dead-letter-exchange")); assertEquals("testQueueName.dlx", arguments.get("x-dead-letter-routing-key")); assertEquals("100", arguments.get("x-max-length").toString()); @@ -257,7 +314,8 @@ public void testCreateInstanceWithNotExclusive() assertFalse(queue.isAutoDelete()); Map arguments = queue.getArguments(); - assertEquals(4, arguments.size()); + assertEquals(5, arguments.size()); + assertEquals("quorum", arguments.get(X_QUEUE_TYPE)); assertEquals("", arguments.get("x-dead-letter-exchange")); assertEquals("testQueueName.dlx", arguments.get("x-dead-letter-routing-key")); assertEquals("100", arguments.get("x-max-length").toString()); diff --git a/src/test/resources/application-multipleConnectionFactories.properties b/src/test/resources/application-multipleConnectionFactories.properties index 167828d..706e723 100644 --- a/src/test/resources/application-multipleConnectionFactories.properties +++ b/src/test/resources/application-multipleConnectionFactories.properties @@ -25,13 +25,13 @@ spring.rabbitmq.queues[0].rabbit-admin.connection-factory.bean-name=firstConnect spring.rabbitmq.queues[1].name=com.avides.spring.rabbit.queue.one spring.rabbitmq.queues[1].routing-keys[0]=queue.one.one spring.rabbitmq.queues[1].routing-keys[1]=queue.one.two -spring.rabbitmq.queues[1].routing-keys[1]=queue.one.three +spring.rabbitmq.queues[1].routing-keys[2]=queue.one.three spring.rabbitmq.queues[1].limit=1 spring.rabbitmq.queues[1].durable=false +spring.rabbitmq.queues[1].arguments[x-queue-type]=classic spring.rabbitmq.queues[1].arguments[x-dead-letter-exchange]=test spring.rabbitmq.queues[1].arguments[x-dead-letter-routing-key]=test.dlx spring.rabbitmq.queues[1].arguments[x-max-length]=99999 -spring.rabbitmq.queues[1].arguments[x-queue-mode]=lazy spring.rabbitmq.queues[1].arguments[someAdditionalQueueArgumentsKey]=test spring.rabbitmq.queues[1].exchange.name=com.avides.one spring.rabbitmq.queues[1].exchange.type=DIRECT diff --git a/src/test/resources/application-queueManagementWithOneConnectionFactory.properties b/src/test/resources/application-queueManagementWithOneConnectionFactory.properties index 30424ca..23376ac 100644 --- a/src/test/resources/application-queueManagementWithOneConnectionFactory.properties +++ b/src/test/resources/application-queueManagementWithOneConnectionFactory.properties @@ -14,11 +14,10 @@ spring.rabbitmq.queues[1].routing-keys[2]=queue.one.three spring.rabbitmq.queues[1].limit=1 spring.rabbitmq.queues[1].durable=false spring.rabbitmq.queues[1].exclusive=true -spring.rabbitmq.queues[1].queue-mode=LAZY +spring.rabbitmq.queues[1].arguments[x-queue-type]=classic spring.rabbitmq.queues[1].arguments[x-dead-letter-exchange]=test spring.rabbitmq.queues[1].arguments[x-dead-letter-routing-key]=test.dlx spring.rabbitmq.queues[1].arguments[x-max-length]=99999 -spring.rabbitmq.queues[1].arguments[x-queue-mode]=lazy spring.rabbitmq.queues[1].arguments[someAdditionalQueueArgumentsKey]=test spring.rabbitmq.queues[1].exchange.name=com.avides.one spring.rabbitmq.queues[1].exchange.type=DIRECT