diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
deleted file mode 100644
index 764c49d64..000000000
--- a/.github/ISSUE_TEMPLATE/question.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-name: Question
-about: Ask a question
-title: "[QUESTION]: "
-labels: question
-assignees: ''
-
----
-
-Please do not create issues for questions. Use the [discussion forum](https://github.com/Netflix/conductor/discussions) instead!
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 03a851e4e..f974f195c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -37,12 +37,12 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: |
- ./gradlew build -x :conductor-contribs:test --scan
+ ./gradlew build --scan
- name: Build and Publish snapshot
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
run: |
echo "Running build for commit ${{ github.sha }}"
- ./gradlew build -x :conductor-contribs:test snapshot --scan
+ ./gradlew build snapshot --scan
env:
NETFLIX_OSS_SIGNING_KEY: ${{ secrets.ORG_SIGNING_KEY }}
NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }}
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 66e70b57d..e8d5a5ca0 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -30,7 +30,7 @@ jobs:
${{ runner.os }}-gradle-
- name: Publish candidate
if: startsWith(github.ref, 'refs/tags/v') && contains(github.ref, '-rc.')
- run: ./gradlew -x :conductor-contribs:test -Prelease.useLastTag=true candidate --scan
+ run: ./gradlew -Prelease.useLastTag=true candidate --scan
env:
NETFLIX_OSS_SONATYPE_USERNAME: ${{ secrets.ORG_SONATYPE_USERNAME }}
NETFLIX_OSS_SONATYPE_PASSWORD: ${{ secrets.ORG_SONATYPE_PASSWORD }}
@@ -40,7 +40,7 @@ jobs:
NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }}
- name: Publish release
if: startsWith(github.ref, 'refs/tags/v') && (!contains(github.ref, '-rc.'))
- run: ./gradlew -x :conductor-contribs:test -Prelease.useLastTag=true final --scan
+ run: ./gradlew -Prelease.useLastTag=true final --scan
env:
NETFLIX_OSS_SONATYPE_USERNAME: ${{ secrets.ORG_SONATYPE_USERNAME }}
NETFLIX_OSS_SONATYPE_PASSWORD: ${{ secrets.ORG_SONATYPE_PASSWORD }}
@@ -48,3 +48,14 @@ jobs:
NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }}
NETFLIX_OSS_REPO_USERNAME: ${{ secrets.ORG_NETFLIXOSS_USERNAME }}
NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }}
+ - name: Publish tag to community repo
+ if: startsWith(github.ref, 'refs/tags/v')
+ run: |
+ export TAG=$(git describe --tags --abbrev=0)
+ echo "Current release version is $TAG"
+ echo "Triggering community build"
+ curl \
+ -H "Accept: application/vnd.github.v3+json" \
+ -H "Authorization: Bearer ${{ secrets.COMMUNITY_REPO_TRIGGER }}" \
+ -X POST https://api.github.com/repos/Netflix/conductor-community/dispatches \
+ -d '{"event_type": "publish_build","client_payload": {"tag":"'"$TAG"'"}}'
diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml
index f5b0d073e..db3a8b1e2 100644
--- a/.github/workflows/update-gradle-wrapper.yml
+++ b/.github/workflows/update-gradle-wrapper.yml
@@ -10,9 +10,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- - name: Set up JDK 1.8
+ - name: Set up Zulu JDK 11
uses: actions/setup-java@v3
with:
- java-version: 1.8
+ distribution: 'zulu'
+ java-version: '11'
- name: Update Gradle Wrapper
uses: gradle-update/update-gradle-wrapper-action@v1
diff --git a/README.md b/README.md
index 2f47e9082..fc9bf387b 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,13 @@ The latest version is [![Github release](https://img.shields.io/github/v/release
[2.31.8](https://github.com/Netflix/conductor/releases/tag/v2.31.8) is the **final** release of `2.31` branch. As of Feb 2022, `1.x` & `2.x` versions are no longer supported.
+## Community Contributions
+The modules contributed by the community are housed at [conductor-community](https://github.com/Netflix/conductor-community). Compatible versions of the community modules are released simultaneously with releases of the main modules.
+
+[Discussion Forum](https://github.com/Netflix/conductor/discussions) Please use the forum for questions and discussing ideas and join the community.
+
+[Access here other Conductor related projects made by the community!](/RELATED.md) - Backup tool, Cron like workflow starter, Docker containers...
+
## Getting Started - Building & Running Conductor
### Docker
The easiest way to get started is with Docker containers. Please follow the instructions [here](https://github.com/Netflix/conductor/tree/main/docker). The server and UI can also be built from source separately.
@@ -53,28 +60,27 @@ To run the UI on the bundled development server, run `yarn run start`. Navigate
## Published Artifacts
Binaries are available from [Netflix OSS Maven](https://artifacts.netflix.net/netflixoss/com/netflix/conductor/) repository, or the [Maven Central Repository](https://search.maven.org/search?q=g:com.netflix.conductor).
-| Artifact | Description |
-| ----------- | --------------- |
-| conductor-common | Common models used by various conductor modules |
-| conductor-core | Core Conductor module |
-| conductor-redis-persistence | Persistence and queue using Redis/Dynomite |
-| conductor-cassandra-persistence | Persistence using Cassandra |
-| conductor-mysql-persistence | Persistence and queue using MySQL |
-| conductor-postgres-persistence | Persistence and queue using Postgres |
-| conductor-es6-persistence | Indexing using Elasticsearch 6.X |
-| conductor-rest | Spring MVC resources for the core services |
-| conductor-ui | node.js based UI for Conductor |
-| conductor-contribs | Optional contrib package that holds extended workflow tasks and support for SQS, AMQP, etc|
-| conductor-client | Java client for Conductor that includes helpers for running worker tasks |
-| conductor-client-spring | Client starter kit for Spring |
-| conductor-server | Spring Boot Web Application |
-| conductor-azureblob-storage | External payload storage implementation using AzureBlob |
-| conductor-redis-lock | Workflow execution lock implementation using Redis |
-| conductor-zookeeper-lock | Workflow execution lock implementation using Zookeeper |
-| conductor-grpc | Protobuf models used by the server and client |
-| conductor-grpc-client | gRPC server Application |
-| conductor-grpc-server | gRPC client to interact with the gRPC server |
-| conductor-test-harness | Integration and regression tests |
+| Artifact | Description |
+|---------------------------------|-------------------------------------------------------------------------------------------------|
+| conductor-common | Common models used by various conductor modules |
+| conductor-core | Core Conductor module |
+| conductor-redis-persistence | Persistence and queue using Redis/Dynomite |
+| conductor-cassandra-persistence | Persistence using Cassandra |
+| conductor-es6-persistence | Indexing using Elasticsearch 6.X |
+| conductor-rest | Spring MVC resources for the core services |
+| conductor-ui | node.js based UI for Conductor |
+| conductor-client | Java client for Conductor that includes helpers for running worker tasks |
+| conductor-client-spring | Client starter kit for Spring |
+| conductor-server | Spring Boot Web Application |
+| conductor-redis-lock | Workflow execution lock implementation using Redis |
+| conductor-awss3-storage | External payload storage implementation using AWS S3 |
+| conductor-awssqs-event-queue | Event queue implementation using AWS SQS |
+| conductor-http-task | Workflow system task implementation to send make requests |
+| conductor-json-jq-task | Workflow system task implementation to evaluate JSON using [jq](https://stedolan.github.io/jq/) |
+| conductor-grpc | Protobuf models used by the server and client |
+| conductor-grpc-client | gRPC server Application |
+| conductor-grpc-server | gRPC client to interact with the gRPC server |
+| conductor-test-harness | Integration and regression tests |
## Database Requirements
@@ -86,11 +92,6 @@ Binaries are available from [Netflix OSS Maven](https://artifacts.netflix.net/ne
* JDK 11+
* UI requires Node 14 to build. Earlier Node versions may work but is untested.
-## Community
-[Discussion Forum](https://github.com/Netflix/conductor/discussions) Please use the forum for questions and discussing ideas and join the community.
-
-[Access here other Conductor related projects made by the community!](/RELATED.md) - Backup tool, Cron like workflow starter, Docker containers...
-
## Get Support
Conductor is maintained by Media Workflow Infrastructure team at Netflix. Use github issue tracking for filing issues and [Discussion Forum](https://github.com/Netflix/conductor/discussions) for any other questions, ideas or support requests.
diff --git a/RELATED.md b/RELATED.md
index 19ad4ef6b..6e433a056 100644
--- a/RELATED.md
+++ b/RELATED.md
@@ -1,5 +1,15 @@
# Community projects related to Conductor
+## Client SDKs
+
+Further, all of the (non-Java) SDKs have a new GitHub home: the Conductor SDK repository is your new source for Conductor SDKs:
+
+* [Golang](https://github.com/conductor-sdk/conductor-go)
+* [Python](https://github.com/conductor-sdk/conductor-python)
+* [C#](https://github.com/conductor-sdk/conductor-csharp)
+* [Clojure](https://github.com/conductor-sdk/conductor-clojure)
+
+All contributions on the above client sdks can be made on [Conductor SDK](https://github.com/conductor-sdk) repository.
## Microservices operations
@@ -61,4 +71,4 @@ Docker image published to [Docker Hub](https://hub.docker.com/repository/docker/
* We should have a central dedicate service that can do scheduling for us and provide a trigger to a microservices at expected time.
* It offers an additional module `io.github.jas34.scheduledwf.config.ScheduledWfServerModule` built on the existing core
of conductor and does not require deployment of any additional service.
-For more details refer: [Schedule Conductor Workflows](https://jas34.github.io/scheduledwf) and [Capability In Conductor To Schedule Workflows](https://github.com/Netflix/conductor/discussions/2256)
\ No newline at end of file
+For more details refer: [Schedule Conductor Workflows](https://jas34.github.io/scheduledwf) and [Capability In Conductor To Schedule Workflows](https://github.com/Netflix/conductor/discussions/2256)
diff --git a/annotations-processor/build.gradle b/annotations-processor/build.gradle
index c9ed9093c..9d1a9bfbf 100644
--- a/annotations-processor/build.gradle
+++ b/annotations-processor/build.gradle
@@ -8,7 +8,7 @@ dependencies {
api 'com.google.guava:guava:31.1-jre'
api 'com.squareup:javapoet:1.13.+'
api 'com.github.jknack:handlebars:4.3.+'
- api 'com.google.protobuf:protobuf-java:3.20.0'
+ api 'com.google.protobuf:protobuf-java:3.20.1'
api 'javax.annotation:javax.annotation-api:1.3.2'
api gradleApi()
diff --git a/annotations-processor/dependencies.lock b/annotations-processor/dependencies.lock
index 70596b712..d9e9d81c2 100644
--- a/annotations-processor/dependencies.lock
+++ b/annotations-processor/dependencies.lock
@@ -12,7 +12,7 @@
"locked": "31.1-jre"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.20.0"
+ "locked": "3.20.1"
},
"com.netflix.conductor:conductor-annotations": {
"project": true
@@ -87,7 +87,7 @@
"locked": "31.1-jre"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.20.0"
+ "locked": "3.20.1"
},
"com.netflix.conductor:conductor-annotations": {
"project": true
@@ -137,7 +137,7 @@
"locked": "31.1-jre"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.20.0"
+ "locked": "3.20.1"
},
"com.netflix.conductor:conductor-annotations": {
"project": true
@@ -181,7 +181,7 @@
"locked": "31.1-jre"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.20.0"
+ "locked": "3.20.1"
},
"com.netflix.conductor:conductor-annotations": {
"project": true
diff --git a/awss3-storage/README.md b/awss3-storage/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/mysql-persistence/build.gradle b/awss3-storage/build.gradle
similarity index 51%
rename from mysql-persistence/build.gradle
rename to awss3-storage/build.gradle
index 11cd9eb07..adda2bb42 100644
--- a/mysql-persistence/build.gradle
+++ b/awss3-storage/build.gradle
@@ -1,5 +1,5 @@
/*
- * Copyright 2021 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -16,25 +16,6 @@ dependencies {
implementation project(':conductor-core')
compileOnly 'org.springframework.boot:spring-boot-starter'
- // SBMTODO: remove guava dep
- implementation "com.google.guava:guava:${revGuava}"
-
- implementation "com.fasterxml.jackson.core:jackson-databind"
- implementation "com.fasterxml.jackson.core:jackson-core"
-
+ implementation "com.amazonaws:aws-java-sdk-s3:${revAwsSdk}"
implementation "org.apache.commons:commons-lang3"
-
- implementation "mysql:mysql-connector-java"
- implementation "org.springframework.boot:spring-boot-starter-jdbc"
- implementation "org.flywaydb:flyway-core"
-
- testImplementation "org.testcontainers:mysql:${revTestContainer}"
-
- testImplementation project(':conductor-core').sourceSets.test.output
- testImplementation project(':conductor-common').sourceSets.test.output
-}
-
-test {
- //the MySQL unit tests must run within the same JVM to share the same embedded DB
- maxParallelForks = 1
}
diff --git a/awss3-storage/dependencies.lock b/awss3-storage/dependencies.lock
new file mode 100644
index 000000000..5eb67b482
--- /dev/null
+++ b/awss3-storage/dependencies.lock
@@ -0,0 +1,1432 @@
+{
+ "annotationProcessor": {
+ "org.springframework.boot:spring-boot-configuration-processor": {
+ "locked": "2.3.12.RELEASE"
+ }
+ },
+ "compileClasspath": {
+ "com.amazonaws:aws-java-sdk-core": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-kms",
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-kms": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-s3": {
+ "locked": "1.11.86"
+ },
+ "com.amazonaws:jmespath-java": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-kms",
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.amazonaws:jmespath-java",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10"
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.1"
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.1"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.1"
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ }
+ },
+ "runtimeClasspath": {
+ "com.amazonaws:aws-java-sdk-core": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-kms",
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-kms": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-s3": {
+ "locked": "1.11.86"
+ },
+ "com.amazonaws:jmespath-java": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-kms",
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.amazonaws:jmespath-java",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "com.google.protobuf:protobuf-java": {
+ "locked": "3.13.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.netflix.conductor:conductor-annotations": {
+ "project": true,
+ "transitive": [
+ "com.netflix.conductor:conductor-common"
+ ]
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true,
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "com.netflix.spectator:spectator-api": {
+ "locked": "0.122.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.spotify:completable-futures": {
+ "locked": "0.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-io:commons-io": {
+ "locked": "2.7",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "io.reactivex:rxjava": {
+ "locked": "1.3.8",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.bval:bval-jsr": {
+ "locked": "2.0.5",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ }
+ },
+ "testCompileClasspath": {
+ "com.amazonaws:aws-java-sdk-core": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-kms",
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-kms": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-s3": {
+ "locked": "1.11.86"
+ },
+ "com.amazonaws:jmespath-java": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-kms",
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.amazonaws:jmespath-java",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "junit:junit": {
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10"
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.1"
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-params"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-test": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ }
+ },
+ "testRuntimeClasspath": {
+ "com.amazonaws:aws-java-sdk-core": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-kms",
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-kms": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-s3": {
+ "locked": "1.11.86"
+ },
+ "com.amazonaws:jmespath-java": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-kms",
+ "com.amazonaws:aws-java-sdk-s3"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.amazonaws:jmespath-java",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "com.google.protobuf:protobuf-java": {
+ "locked": "3.13.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "com.netflix.conductor:conductor-annotations": {
+ "project": true,
+ "transitive": [
+ "com.netflix.conductor:conductor-common"
+ ]
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true,
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "com.netflix.spectator:spectator-api": {
+ "locked": "0.122.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.spotify:completable-futures": {
+ "locked": "0.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-io:commons-io": {
+ "locked": "2.7",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "io.reactivex:rxjava": {
+ "locked": "1.3.8",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "junit:junit": {
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.bval:bval-jsr": {
+ "locked": "2.0.5",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.mockito:mockito-junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-test": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Configuration.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java
similarity index 77%
rename from contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Configuration.java
rename to awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java
index a52ec750c..a188c8504 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Configuration.java
+++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.storage.config;
+package com.netflix.conductor.s3.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -18,7 +18,8 @@
import org.springframework.context.annotation.Configuration;
import com.netflix.conductor.common.utils.ExternalPayloadStorage;
-import com.netflix.conductor.contribs.storage.S3PayloadStorage;
+import com.netflix.conductor.core.utils.IDGenerator;
+import com.netflix.conductor.s3.storage.S3PayloadStorage;
@Configuration
@EnableConfigurationProperties(S3Properties.class)
@@ -26,7 +27,8 @@
public class S3Configuration {
@Bean
- public ExternalPayloadStorage s3ExternalPayloadStorage(S3Properties properties) {
- return new S3PayloadStorage(properties);
+ public ExternalPayloadStorage s3ExternalPayloadStorage(
+ IDGenerator idGenerator, S3Properties properties) {
+ return new S3PayloadStorage(idGenerator, properties);
}
}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java
similarity index 95%
rename from contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java
rename to awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java
index fc7f5ebf4..94a515f72 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java
+++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.storage.config;
+package com.netflix.conductor.s3.config;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/storage/S3PayloadStorage.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java
similarity index 88%
rename from contribs/src/main/java/com/netflix/conductor/contribs/storage/S3PayloadStorage.java
rename to awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java
index e79bb6ebc..86e57e685 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/storage/S3PayloadStorage.java
+++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.storage;
+package com.netflix.conductor.s3.storage;
import java.io.InputStream;
import java.net.URISyntaxException;
@@ -22,19 +22,15 @@
import com.netflix.conductor.common.run.ExternalStorageLocation;
import com.netflix.conductor.common.utils.ExternalPayloadStorage;
-import com.netflix.conductor.contribs.storage.config.S3Properties;
import com.netflix.conductor.core.exception.ApplicationException;
import com.netflix.conductor.core.utils.IDGenerator;
+import com.netflix.conductor.s3.config.S3Properties;
import com.amazonaws.HttpMethod;
import com.amazonaws.SdkClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
-import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
-import com.amazonaws.services.s3.model.GetObjectRequest;
-import com.amazonaws.services.s3.model.ObjectMetadata;
-import com.amazonaws.services.s3.model.PutObjectRequest;
-import com.amazonaws.services.s3.model.S3Object;
+import com.amazonaws.services.s3.model.*;
/**
* An implementation of {@link ExternalPayloadStorage} using AWS S3 for storing large JSON payload
@@ -50,11 +46,13 @@ public class S3PayloadStorage implements ExternalPayloadStorage {
private static final Logger LOGGER = LoggerFactory.getLogger(S3PayloadStorage.class);
private static final String CONTENT_TYPE = "application/json";
+ private final IDGenerator idGenerator;
private final AmazonS3 s3Client;
private final String bucketName;
private final long expirationSec;
- public S3PayloadStorage(S3Properties properties) {
+ public S3PayloadStorage(IDGenerator idGenerator, S3Properties properties) {
+ this.idGenerator = idGenerator;
bucketName = properties.getBucketName();
expirationSec = properties.getSignedUrlExpirationDuration().getSeconds();
String region = properties.getRegion();
@@ -101,7 +99,10 @@ public ExternalStorageLocation getLocation(
.toASCIIString());
return externalStorageLocation;
} catch (SdkClientException e) {
- String msg = "Error communicating with S3";
+ String msg =
+ String.format(
+ "Error communicating with S3 - operation:%s, payloadType: %s, path: %s",
+ operation, payloadType, path);
LOGGER.error(msg, e);
throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
} catch (URISyntaxException e) {
@@ -130,7 +131,9 @@ public void upload(String path, InputStream payload, long payloadSize) {
new PutObjectRequest(bucketName, path, payload, objectMetadata);
s3Client.putObject(request);
} catch (SdkClientException e) {
- String msg = "Error communicating with S3";
+ String msg =
+ String.format(
+ "Error uploading to S3 - path:%s, payloadSize: %d", path, payloadSize);
LOGGER.error(msg, e);
throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
}
@@ -149,7 +152,7 @@ public InputStream download(String path) {
S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucketName, path));
return s3Object.getObjectContent();
} catch (SdkClientException e) {
- String msg = "Error communicating with S3";
+ String msg = String.format("Error downloading from S3 - path:%s", path);
LOGGER.error(msg, e);
throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
}
@@ -171,7 +174,7 @@ private String getObjectKey(PayloadType payloadType) {
stringBuilder.append("task/output/");
break;
}
- stringBuilder.append(IDGenerator.generate()).append(".json");
+ stringBuilder.append(idGenerator.generate()).append(".json");
return stringBuilder.toString();
}
}
diff --git a/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 000000000..d8c1f34e5
--- /dev/null
+++ b/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,13 @@
+{
+ "hints": [
+ {
+ "name": "conductor.external-payload-storage.type",
+ "values": [
+ {
+ "value": "s3",
+ "description": "Use AWS S3 as the external payload storage."
+ }
+ ]
+ }
+ ]
+}
diff --git a/awssqs-event-queue/README.md b/awssqs-event-queue/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/awssqs-event-queue/build.gradle b/awssqs-event-queue/build.gradle
new file mode 100644
index 000000000..a795acf2c
--- /dev/null
+++ b/awssqs-event-queue/build.gradle
@@ -0,0 +1,16 @@
+dependencies {
+ implementation project(':conductor-common')
+ implementation project(':conductor-core')
+ compileOnly 'org.springframework.boot:spring-boot-starter'
+
+ implementation "org.apache.commons:commons-lang3"
+ // SBMTODO: remove guava dep
+ implementation "com.google.guava:guava:${revGuava}"
+
+ implementation "com.amazonaws:aws-java-sdk-sqs:${revAwsSdk}"
+
+ implementation "io.reactivex:rxjava:${revRxJava}"
+
+ testImplementation 'org.springframework.boot:spring-boot-starter'
+ testImplementation project(':conductor-common').sourceSets.test.output
+}
\ No newline at end of file
diff --git a/awssqs-event-queue/dependencies.lock b/awssqs-event-queue/dependencies.lock
new file mode 100644
index 000000000..bd0c01d09
--- /dev/null
+++ b/awssqs-event-queue/dependencies.lock
@@ -0,0 +1,1542 @@
+{
+ "annotationProcessor": {
+ "org.springframework.boot:spring-boot-configuration-processor": {
+ "locked": "2.3.12.RELEASE"
+ }
+ },
+ "compileClasspath": {
+ "com.amazonaws:aws-java-sdk-core": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-sqs"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-sqs": {
+ "locked": "1.11.86"
+ },
+ "com.amazonaws:jmespath-java": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-sqs"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.amazonaws:jmespath-java",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.3.4",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:failureaccess": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:guava": {
+ "locked": "30.0-jre"
+ },
+ "com.google.guava:listenablefuture": {
+ "locked": "9999.0-empty-to-avoid-conflict-with-guava",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.j2objc:j2objc-annotations": {
+ "locked": "1.3",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "io.reactivex:rxjava": {
+ "locked": "1.2.2"
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10"
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.1"
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.1"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.1"
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.5.0",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ }
+ },
+ "runtimeClasspath": {
+ "com.amazonaws:aws-java-sdk-core": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-sqs"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-sqs": {
+ "locked": "1.11.86"
+ },
+ "com.amazonaws:jmespath-java": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-sqs"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.amazonaws:jmespath-java",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine",
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:failureaccess": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:guava": {
+ "locked": "30.0-jre"
+ },
+ "com.google.guava:listenablefuture": {
+ "locked": "9999.0-empty-to-avoid-conflict-with-guava",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.j2objc:j2objc-annotations": {
+ "locked": "1.3",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.protobuf:protobuf-java": {
+ "locked": "3.13.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.netflix.conductor:conductor-annotations": {
+ "project": true,
+ "transitive": [
+ "com.netflix.conductor:conductor-common"
+ ]
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true,
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "com.netflix.spectator:spectator-api": {
+ "locked": "0.122.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.spotify:completable-futures": {
+ "locked": "0.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-io:commons-io": {
+ "locked": "2.7",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "io.reactivex:rxjava": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.bval:bval-jsr": {
+ "locked": "2.0.5",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine",
+ "com.google.guava:guava"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ }
+ },
+ "testCompileClasspath": {
+ "com.amazonaws:aws-java-sdk-core": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-sqs"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-sqs": {
+ "locked": "1.11.86"
+ },
+ "com.amazonaws:jmespath-java": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-sqs"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.amazonaws:jmespath-java",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.3.4",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:failureaccess": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:guava": {
+ "locked": "30.0-jre"
+ },
+ "com.google.guava:listenablefuture": {
+ "locked": "9999.0-empty-to-avoid-conflict-with-guava",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.j2objc:j2objc-annotations": {
+ "locked": "1.3",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "io.reactivex:rxjava": {
+ "locked": "1.2.2"
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "junit:junit": {
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10"
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.1"
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.5.0",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-params"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-test": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ }
+ },
+ "testRuntimeClasspath": {
+ "com.amazonaws:aws-java-sdk-core": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-sqs"
+ ]
+ },
+ "com.amazonaws:aws-java-sdk-sqs": {
+ "locked": "1.11.86"
+ },
+ "com.amazonaws:jmespath-java": {
+ "locked": "1.11.86",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-sqs"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.amazonaws:jmespath-java",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine",
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:failureaccess": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:guava": {
+ "locked": "30.0-jre"
+ },
+ "com.google.guava:listenablefuture": {
+ "locked": "9999.0-empty-to-avoid-conflict-with-guava",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.j2objc:j2objc-annotations": {
+ "locked": "1.3",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.protobuf:protobuf-java": {
+ "locked": "3.13.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "com.netflix.conductor:conductor-annotations": {
+ "project": true,
+ "transitive": [
+ "com.netflix.conductor:conductor-common"
+ ]
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true,
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "com.netflix.spectator:spectator-api": {
+ "locked": "0.122.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.spotify:completable-futures": {
+ "locked": "0.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-io:commons-io": {
+ "locked": "2.7",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "io.reactivex:rxjava": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "junit:junit": {
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.bval:bval-jsr": {
+ "locked": "2.0.5",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10",
+ "transitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine",
+ "com.google.guava:guava"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.mockito:mockito-junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-test": {
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueConfiguration.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java
similarity index 96%
rename from contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueConfiguration.java
rename to awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java
index 001250211..2ee425e7c 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueConfiguration.java
+++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.queue.sqs.config;
+package com.netflix.conductor.sqs.config;
import java.util.HashMap;
import java.util.Map;
@@ -22,11 +22,11 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import com.netflix.conductor.contribs.queue.sqs.SQSObservableQueue.Builder;
import com.netflix.conductor.core.config.ConductorProperties;
import com.netflix.conductor.core.events.EventQueueProvider;
import com.netflix.conductor.core.events.queue.ObservableQueue;
import com.netflix.conductor.model.TaskModel.Status;
+import com.netflix.conductor.sqs.eventqueue.SQSObservableQueue.Builder;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.sqs.AmazonSQSClient;
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProperties.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProperties.java
similarity index 97%
rename from contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProperties.java
rename to awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProperties.java
index ef2292099..7ce5a3e5d 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProperties.java
+++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProperties.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.queue.sqs.config;
+package com.netflix.conductor.sqs.config;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProvider.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProvider.java
similarity index 92%
rename from contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProvider.java
rename to awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProvider.java
index b7f500180..5ad88dc69 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProvider.java
+++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.queue.sqs.config;
+package com.netflix.conductor.sqs.config;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -19,9 +19,9 @@
import org.slf4j.LoggerFactory;
import org.springframework.lang.NonNull;
-import com.netflix.conductor.contribs.queue.sqs.SQSObservableQueue.Builder;
import com.netflix.conductor.core.events.EventQueueProvider;
import com.netflix.conductor.core.events.queue.ObservableQueue;
+import com.netflix.conductor.sqs.eventqueue.SQSObservableQueue;
import com.amazonaws.services.sqs.AmazonSQSClient;
import rx.Scheduler;
@@ -56,7 +56,7 @@ public ObservableQueue getQueue(String queueURI) {
return queues.computeIfAbsent(
queueURI,
q ->
- new Builder()
+ new SQSObservableQueue.Builder()
.withBatchSize(this.batchSize)
.withClient(client)
.withPollTimeInMS(this.pollTimeInMS)
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueue.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueue.java
similarity index 98%
rename from contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueue.java
rename to awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueue.java
index e4603791d..a65cff1d9 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueue.java
+++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueue.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.queue.sqs;
+package com.netflix.conductor.sqs.eventqueue;
import java.util.ArrayList;
import java.util.Collections;
@@ -52,7 +52,6 @@
import com.amazonaws.services.sqs.model.SendMessageBatchRequestEntry;
import com.amazonaws.services.sqs.model.SendMessageBatchResult;
import com.amazonaws.services.sqs.model.SetQueueAttributesResult;
-import com.google.common.annotations.VisibleForTesting;
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Scheduler;
@@ -238,7 +237,6 @@ public SQSObservableQueue build() {
}
// Private methods
- @VisibleForTesting
String getOrCreateQueue() {
List queueUrls = listQueues(queueName);
if (queueUrls == null || queueUrls.isEmpty()) {
@@ -310,7 +308,6 @@ private void publishMessages(List messages) {
LOGGER.debug("send result: {} for SQS queue: {}", result.getFailed().toString(), queueName);
}
- @VisibleForTesting
List receiveMessages() {
try {
ReceiveMessageRequest receiveMessageRequest =
@@ -339,7 +336,6 @@ List receiveMessages() {
return new ArrayList<>();
}
- @VisibleForTesting
OnSubscribe getOnSubscribe() {
return subscriber -> {
Observable interval = Observable.interval(pollTimeInMS, TimeUnit.MILLISECONDS);
diff --git a/awssqs-event-queue/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/awssqs-event-queue/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 000000000..2cc76ff65
--- /dev/null
+++ b/awssqs-event-queue/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,27 @@
+{
+ "properties": [
+ {
+ "name": "conductor.event-queues.sqs.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable the use of AWS SQS implementation to provide queues for consuming events.",
+ "sourceType": "com.netflix.conductor.sqs.config.SQSEventQueueConfiguration"
+ },
+ {
+ "name": "conductor.default-event-queue.type",
+ "type": "java.lang.String",
+ "description": "The default event queue type to listen on for the WAIT task.",
+ "sourceType": "com.netflix.conductor.sqs.config.SQSEventQueueConfiguration"
+ }
+ ],
+ "hints": [
+ {
+ "name": "conductor.default-event-queue.type",
+ "values": [
+ {
+ "value": "sqs",
+ "description": "Use AWS SQS as the event queue to listen on for the WAIT task."
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/DefaultEventQueueProcessorTest.java b/awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/DefaultEventQueueProcessorTest.java
similarity index 99%
rename from contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/DefaultEventQueueProcessorTest.java
rename to awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/DefaultEventQueueProcessorTest.java
index 8c0d2f728..ab7be3118 100644
--- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/DefaultEventQueueProcessorTest.java
+++ b/awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/DefaultEventQueueProcessorTest.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.queue.sqs;
+package com.netflix.conductor.sqs.eventqueue;
import java.util.HashMap;
import java.util.LinkedList;
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueueTest.java b/awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueueTest.java
similarity index 97%
rename from contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueueTest.java
rename to awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueueTest.java
index 789a90f87..be0e92fdc 100644
--- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueueTest.java
+++ b/awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueueTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.queue.sqs;
+package com.netflix.conductor.sqs.eventqueue;
import java.util.Collections;
import java.util.LinkedList;
diff --git a/azureblob-storage/README.md b/azureblob-storage/README.md
deleted file mode 100644
index 33a39349c..000000000
--- a/azureblob-storage/README.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# Azure Blob External Storage Module
-
-This module use azure blob to store and retrieve workflows/tasks input/output payload that
-went over the thresholds defined in properties named `conductor.[workflow|task].[input|output].payload.threshold.kb`.
-
-**Warning** Azure Java SDK use libs already present inside `conductor` like `jackson` and `netty`.
-You may encounter deprecated issues, or conflicts and need to adapt the code if the module is not maintained along with `conductor`.
-It has only been tested with **v12.2.0**.
-
-## Configuration
-
-### Usage
-
-Cf. Documentation [External Payload Storage](https://netflix.github.io/conductor/externalpayloadstorage/#azure-blob-storage)
-
-### Example
-
-```properties
-conductor.additional.modules=com.netflix.conductor.azureblob.AzureBlobModule
-es.set.netty.runtime.available.processors=false
-
-workflow.external.payload.storage=AZURE_BLOB
-workflow.external.payload.storage.azure_blob.connection_string=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;EndpointSuffix=localhost
-workflow.external.payload.storage.azure_blob.signedurlexpirationseconds=360
-```
-
-## Testing
-
-You can use [Azurite](https://github.com/Azure/Azurite) to simulate an Azure Storage.
-
-### Troubleshoots
-
-* When using **es5 persistance** you will receive an `java.lang.IllegalStateException` because the Netty lib will call `setAvailableProcessors` two times. To resolve this issue you need to set the following system property
-
-```
-es.set.netty.runtime.available.processors=false
-```
-
-If you want to change the default HTTP client of azure sdk, you can use `okhttp` instead of `netty`.
-For that you need to add the following [dependency](https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/storage/azure-storage-blob#default-http-client).
-
-```
-com.azure:azure-core-http-okhttp:${compatible version}
-```
diff --git a/azureblob-storage/build.gradle b/azureblob-storage/build.gradle
deleted file mode 100644
index 3b85566a1..000000000
--- a/azureblob-storage/build.gradle
+++ /dev/null
@@ -1,8 +0,0 @@
-dependencies {
- implementation project(':conductor-common')
- implementation project(':conductor-core')
- compileOnly 'org.springframework.boot:spring-boot-starter'
-
- implementation "com.azure:azure-storage-blob:${revAzureStorageBlobSdk}"
- implementation "org.apache.commons:commons-lang3"
-}
diff --git a/azureblob-storage/dependencies.lock b/azureblob-storage/dependencies.lock
deleted file mode 100644
index d223b2a53..000000000
--- a/azureblob-storage/dependencies.lock
+++ /dev/null
@@ -1,396 +0,0 @@
-{
- "annotationProcessor": {
- "org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.6.6"
- }
- },
- "compileClasspath": {
- "com.azure:azure-storage-blob": {
- "locked": "12.7.0"
- },
- "com.netflix.conductor:conductor-common": {
- "project": true
- },
- "com.netflix.conductor:conductor-core": {
- "project": true
- },
- "org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
- },
- "org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-web": {
- "locked": "2.17.1"
- },
- "org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
- }
- },
- "runtimeClasspath": {
- "com.azure:azure-storage-blob": {
- "locked": "12.7.0"
- },
- "com.fasterxml.jackson.core:jackson-annotations": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
- },
- "com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
- },
- "com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2.2"
- },
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
- },
- "com.google.guava:guava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "30.0-jre"
- },
- "com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "3.13.0"
- },
- "com.jayway.jsonpath:json-path": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.6.0"
- },
- "com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "project": true
- },
- "com.netflix.conductor:conductor-common": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "project": true
- },
- "com.netflix.conductor:conductor-core": {
- "project": true
- },
- "com.netflix.spectator:spectator-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "0.122.0"
- },
- "com.spotify:completable-futures": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "0.3.3"
- },
- "commons-io:commons-io": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.7"
- },
- "io.reactivex:rxjava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.3.8"
- },
- "jakarta.activation:jakarta.activation-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.2.2"
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.3.3"
- },
- "org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.0.5"
- },
- "org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "3.12.0"
- },
- "org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- }
- },
- "testCompileClasspath": {
- "com.azure:azure-storage-blob": {
- "locked": "12.7.0"
- },
- "com.netflix.conductor:conductor-common": {
- "project": true
- },
- "com.netflix.conductor:conductor-core": {
- "project": true
- },
- "junit:junit": {
- "locked": "4.13.2"
- },
- "org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
- },
- "org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-web": {
- "locked": "2.17.1"
- },
- "org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
- },
- "org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
- }
- },
- "testRuntimeClasspath": {
- "com.azure:azure-storage-blob": {
- "locked": "12.7.0"
- },
- "com.fasterxml.jackson.core:jackson-annotations": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
- },
- "com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
- },
- "com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2.2"
- },
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
- },
- "com.google.guava:guava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "30.0-jre"
- },
- "com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "3.13.0"
- },
- "com.jayway.jsonpath:json-path": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.6.0"
- },
- "com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "project": true
- },
- "com.netflix.conductor:conductor-common": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "project": true
- },
- "com.netflix.conductor:conductor-core": {
- "project": true
- },
- "com.netflix.spectator:spectator-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "0.122.0"
- },
- "com.spotify:completable-futures": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "0.3.3"
- },
- "commons-io:commons-io": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.7"
- },
- "io.reactivex:rxjava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.3.8"
- },
- "jakarta.activation:jakarta.activation-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.2.2"
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.3.3"
- },
- "junit:junit": {
- "locked": "4.13.2"
- },
- "org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.0.5"
- },
- "org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "3.12.0"
- },
- "org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
- },
- "org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
- }
- }
-}
\ No newline at end of file
diff --git a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobConfiguration.java b/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobConfiguration.java
deleted file mode 100644
index b36d29972..000000000
--- a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobConfiguration.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.azureblob.config;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.netflix.conductor.azureblob.storage.AzureBlobPayloadStorage;
-import com.netflix.conductor.common.utils.ExternalPayloadStorage;
-
-@Configuration(proxyBeanMethods = false)
-@EnableConfigurationProperties(AzureBlobProperties.class)
-@ConditionalOnProperty(name = "conductor.external-payload-storage.type", havingValue = "azureblob")
-public class AzureBlobConfiguration {
-
- @Bean
- public ExternalPayloadStorage azureBlobExternalPayloadStorage(AzureBlobProperties properties) {
- return new AzureBlobPayloadStorage(properties);
- }
-}
diff --git a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java b/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java
deleted file mode 100644
index 9a1f4fbf9..000000000
--- a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.azureblob.config;
-
-import java.time.Duration;
-import java.time.temporal.ChronoUnit;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.convert.DurationUnit;
-
-@ConfigurationProperties("conductor.external-payload-storage.azureblob")
-public class AzureBlobProperties {
-
- /** The connection string to be used to connect to Azure Blob storage */
- private String connectionString = null;
-
- /** The name of the container where the payloads will be stored */
- private String containerName = "conductor-payloads";
-
- /** The endpoint to be used to connect to Azure Blob storage */
- private String endpoint = null;
-
- /** The sas token to be used for authenticating requests */
- private String sasToken = null;
-
- /** The time for which the shared access signature is valid */
- @DurationUnit(ChronoUnit.SECONDS)
- private Duration signedUrlExpirationDuration = Duration.ofSeconds(5);
-
- /** The path at which the workflow inputs will be stored */
- private String workflowInputPath = "workflow/input/";
-
- /** The path at which the workflow outputs will be stored */
- private String workflowOutputPath = "workflow/output/";
-
- /** The path at which the task inputs will be stored */
- private String taskInputPath = "task/input/";
-
- /** The path at which the task outputs will be stored */
- private String taskOutputPath = "task/output/";
-
- public String getConnectionString() {
- return connectionString;
- }
-
- public void setConnectionString(String connectionString) {
- this.connectionString = connectionString;
- }
-
- public String getContainerName() {
- return containerName;
- }
-
- public void setContainerName(String containerName) {
- this.containerName = containerName;
- }
-
- public String getEndpoint() {
- return endpoint;
- }
-
- public void setEndpoint(String endpoint) {
- this.endpoint = endpoint;
- }
-
- public String getSasToken() {
- return sasToken;
- }
-
- public void setSasToken(String sasToken) {
- this.sasToken = sasToken;
- }
-
- public Duration getSignedUrlExpirationDuration() {
- return signedUrlExpirationDuration;
- }
-
- public void setSignedUrlExpirationDuration(Duration signedUrlExpirationDuration) {
- this.signedUrlExpirationDuration = signedUrlExpirationDuration;
- }
-
- public String getWorkflowInputPath() {
- return workflowInputPath;
- }
-
- public void setWorkflowInputPath(String workflowInputPath) {
- this.workflowInputPath = workflowInputPath;
- }
-
- public String getWorkflowOutputPath() {
- return workflowOutputPath;
- }
-
- public void setWorkflowOutputPath(String workflowOutputPath) {
- this.workflowOutputPath = workflowOutputPath;
- }
-
- public String getTaskInputPath() {
- return taskInputPath;
- }
-
- public void setTaskInputPath(String taskInputPath) {
- this.taskInputPath = taskInputPath;
- }
-
- public String getTaskOutputPath() {
- return taskOutputPath;
- }
-
- public void setTaskOutputPath(String taskOutputPath) {
- this.taskOutputPath = taskOutputPath;
- }
-}
diff --git a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java b/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java
deleted file mode 100644
index ea9e1aeb4..000000000
--- a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.azureblob.storage;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.UncheckedIOException;
-import java.time.OffsetDateTime;
-import java.time.ZoneOffset;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.netflix.conductor.azureblob.config.AzureBlobProperties;
-import com.netflix.conductor.common.run.ExternalStorageLocation;
-import com.netflix.conductor.common.utils.ExternalPayloadStorage;
-import com.netflix.conductor.core.exception.ApplicationException;
-import com.netflix.conductor.core.utils.IDGenerator;
-
-import com.azure.core.exception.UnexpectedLengthException;
-import com.azure.core.util.Context;
-import com.azure.storage.blob.BlobContainerClient;
-import com.azure.storage.blob.BlobContainerClientBuilder;
-import com.azure.storage.blob.models.BlobHttpHeaders;
-import com.azure.storage.blob.models.BlobStorageException;
-import com.azure.storage.blob.sas.BlobSasPermission;
-import com.azure.storage.blob.sas.BlobServiceSasSignatureValues;
-import com.azure.storage.blob.specialized.BlockBlobClient;
-import com.azure.storage.common.Utility;
-import com.azure.storage.common.implementation.credentials.SasTokenCredential;
-
-/**
- * An implementation of {@link ExternalPayloadStorage} using Azure Blob for storing large JSON
- * payload data.
- *
- * @see Azure Java SDK
- */
-public class AzureBlobPayloadStorage implements ExternalPayloadStorage {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(AzureBlobPayloadStorage.class);
- private static final String CONTENT_TYPE = "application/json";
-
- private final String workflowInputPath;
- private final String workflowOutputPath;
- private final String taskInputPath;
- private final String taskOutputPath;
-
- private final BlobContainerClient blobContainerClient;
- private final long expirationSec;
- private final SasTokenCredential sasTokenCredential;
-
- public AzureBlobPayloadStorage(AzureBlobProperties properties) {
- workflowInputPath = properties.getWorkflowInputPath();
- workflowOutputPath = properties.getWorkflowOutputPath();
- taskInputPath = properties.getTaskInputPath();
- taskOutputPath = properties.getTaskOutputPath();
- expirationSec = properties.getSignedUrlExpirationDuration().getSeconds();
- String connectionString = properties.getConnectionString();
- String containerName = properties.getContainerName();
- String endpoint = properties.getEndpoint();
- String sasToken = properties.getSasToken();
-
- BlobContainerClientBuilder blobContainerClientBuilder = new BlobContainerClientBuilder();
- if (connectionString != null) {
- blobContainerClientBuilder.connectionString(connectionString);
- sasTokenCredential = null;
- } else if (endpoint != null) {
- blobContainerClientBuilder.endpoint(endpoint);
- if (sasToken != null) {
- sasTokenCredential = SasTokenCredential.fromSasTokenString(sasToken);
- blobContainerClientBuilder.sasToken(sasTokenCredential.getSasToken());
- } else {
- sasTokenCredential = null;
- }
- } else {
- String msg = "Missing property for connectionString OR endpoint";
- LOGGER.error(msg);
- throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg);
- }
- blobContainerClient = blobContainerClientBuilder.containerName(containerName).buildClient();
- }
-
- /**
- * @param operation the type of {@link Operation} to be performed
- * @param payloadType the {@link PayloadType} that is being accessed
- * @return a {@link ExternalStorageLocation} object which contains the pre-signed URL and the
- * azure blob name for the json payload
- */
- @Override
- public ExternalStorageLocation getLocation(
- Operation operation, PayloadType payloadType, String path) {
- try {
- ExternalStorageLocation externalStorageLocation = new ExternalStorageLocation();
-
- String objectKey;
- if (StringUtils.isNotBlank(path)) {
- objectKey = path;
- } else {
- objectKey = getObjectKey(payloadType);
- }
- externalStorageLocation.setPath(objectKey);
-
- BlockBlobClient blockBlobClient =
- blobContainerClient.getBlobClient(objectKey).getBlockBlobClient();
- String blobUrl = Utility.urlDecode(blockBlobClient.getBlobUrl());
-
- if (sasTokenCredential != null) {
- blobUrl = blobUrl + "?" + sasTokenCredential.getSasToken();
- } else {
- BlobSasPermission blobSASPermission = new BlobSasPermission();
- if (operation.equals(Operation.READ)) {
- blobSASPermission.setReadPermission(true);
- } else if (operation.equals(Operation.WRITE)) {
- blobSASPermission.setWritePermission(true);
- blobSASPermission.setCreatePermission(true);
- }
- BlobServiceSasSignatureValues blobServiceSasSignatureValues =
- new BlobServiceSasSignatureValues(
- OffsetDateTime.now(ZoneOffset.UTC).plusSeconds(expirationSec),
- blobSASPermission);
- blobUrl =
- blobUrl + "?" + blockBlobClient.generateSas(blobServiceSasSignatureValues);
- }
-
- externalStorageLocation.setUri(blobUrl);
- return externalStorageLocation;
- } catch (BlobStorageException e) {
- String msg = "Error communicating with Azure";
- LOGGER.error(msg, e);
- throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
- }
- }
-
- /**
- * Uploads the payload to the given azure blob name. It is expected that the caller retrieves
- * the blob name using {@link #getLocation(Operation, PayloadType, String)} before making this
- * call.
- *
- * @param path the name of the blob to be uploaded
- * @param payload an {@link InputStream} containing the json payload which is to be uploaded
- * @param payloadSize the size of the json payload in bytes
- */
- @Override
- public void upload(String path, InputStream payload, long payloadSize) {
- try {
- BlockBlobClient blockBlobClient =
- blobContainerClient.getBlobClient(path).getBlockBlobClient();
- BlobHttpHeaders blobHttpHeaders = new BlobHttpHeaders().setContentType(CONTENT_TYPE);
- blockBlobClient.uploadWithResponse(
- payload,
- payloadSize,
- blobHttpHeaders,
- null,
- null,
- null,
- null,
- null,
- Context.NONE);
- } catch (BlobStorageException | UncheckedIOException | UnexpectedLengthException e) {
- String msg = "Error communicating with Azure";
- LOGGER.error(msg, e);
- throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
- }
- }
-
- /**
- * Downloads the payload stored in an azure blob.
- *
- * @param path the path of the blob
- * @return an input stream containing the contents of the object Caller is expected to close the
- * input stream.
- */
- @Override
- public InputStream download(String path) {
- try {
- BlockBlobClient blockBlobClient =
- blobContainerClient.getBlobClient(path).getBlockBlobClient();
- ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- // Avoid another call to the api to get the blob size
- // ByteArrayOutputStream outputStream = new
- // ByteArrayOutputStream(blockBlobClient.getProperties().value().blobSize());
- blockBlobClient.download(outputStream);
- return new ByteArrayInputStream(outputStream.toByteArray());
- } catch (BlobStorageException | UncheckedIOException | NullPointerException e) {
- String msg = "Error communicating with Azure";
- LOGGER.error(msg, e);
- throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
- }
- }
-
- /**
- * Build path on external storage. Copied from S3PayloadStorage.
- *
- * @param payloadType the {@link PayloadType} which will determine the base path of the object
- * @return External Storage path
- */
- private String getObjectKey(PayloadType payloadType) {
- StringBuilder stringBuilder = new StringBuilder();
- switch (payloadType) {
- case WORKFLOW_INPUT:
- stringBuilder.append(workflowInputPath);
- break;
- case WORKFLOW_OUTPUT:
- stringBuilder.append(workflowOutputPath);
- break;
- case TASK_INPUT:
- stringBuilder.append(taskInputPath);
- break;
- case TASK_OUTPUT:
- stringBuilder.append(taskOutputPath);
- break;
- }
- stringBuilder.append(IDGenerator.generate()).append(".json");
- return stringBuilder.toString();
- }
-}
diff --git a/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java b/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java
deleted file mode 100644
index 5ce1bb49c..000000000
--- a/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.azureblob.storage;
-
-import java.time.Duration;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-import com.netflix.conductor.azureblob.config.AzureBlobProperties;
-import com.netflix.conductor.common.run.ExternalStorageLocation;
-import com.netflix.conductor.common.utils.ExternalPayloadStorage;
-import com.netflix.conductor.core.exception.ApplicationException;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class AzureBlobPayloadStorageTest {
-
- private AzureBlobProperties properties;
-
- @Before
- public void setUp() {
- properties = mock(AzureBlobProperties.class);
- when(properties.getConnectionString()).thenReturn(null);
- when(properties.getContainerName()).thenReturn("conductor-payloads");
- when(properties.getEndpoint()).thenReturn(null);
- when(properties.getSasToken()).thenReturn(null);
- when(properties.getSignedUrlExpirationDuration()).thenReturn(Duration.ofSeconds(5));
- when(properties.getWorkflowInputPath()).thenReturn("workflow/input/");
- when(properties.getWorkflowOutputPath()).thenReturn("workflow/output/");
- when(properties.getTaskInputPath()).thenReturn("task/input");
- when(properties.getTaskOutputPath()).thenReturn("task/output/");
- }
-
- /** Dummy credentials Azure SDK doesn't work with Azurite since it cleans parameters */
- private final String azuriteConnectionString =
- "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;EndpointSuffix=localhost";
-
- @Rule public ExpectedException expectedException = ExpectedException.none();
-
- @Test
- public void testNoStorageAccount() {
- expectedException.expect(ApplicationException.class);
- new AzureBlobPayloadStorage(properties);
- }
-
- @Test
- public void testUseConnectionString() {
- when(properties.getConnectionString()).thenReturn(azuriteConnectionString);
- new AzureBlobPayloadStorage(properties);
- }
-
- @Test
- public void testUseEndpoint() {
- String azuriteEndpoint = "http://127.0.0.1:10000/";
- when(properties.getEndpoint()).thenReturn(azuriteEndpoint);
- new AzureBlobPayloadStorage(properties);
- }
-
- @Test
- public void testGetLocationFixedPath() {
- when(properties.getConnectionString()).thenReturn(azuriteConnectionString);
- AzureBlobPayloadStorage azureBlobPayloadStorage = new AzureBlobPayloadStorage(properties);
- String path = "somewhere";
- ExternalStorageLocation externalStorageLocation =
- azureBlobPayloadStorage.getLocation(
- ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT,
- path);
- assertNotNull(externalStorageLocation);
- assertEquals(path, externalStorageLocation.getPath());
- assertNotNull(externalStorageLocation.getUri());
- }
-
- private void testGetLocation(
- AzureBlobPayloadStorage azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation operation,
- ExternalPayloadStorage.PayloadType payloadType,
- String expectedPath) {
- ExternalStorageLocation externalStorageLocation =
- azureBlobPayloadStorage.getLocation(operation, payloadType, null);
- assertNotNull(externalStorageLocation);
- assertNotNull(externalStorageLocation.getPath());
- assertTrue(externalStorageLocation.getPath().startsWith(expectedPath));
- assertNotNull(externalStorageLocation.getUri());
- assertTrue(externalStorageLocation.getUri().contains(expectedPath));
- }
-
- @Test
- public void testGetAllLocations() {
- when(properties.getConnectionString()).thenReturn(azuriteConnectionString);
- AzureBlobPayloadStorage azureBlobPayloadStorage = new AzureBlobPayloadStorage(properties);
-
- testGetLocation(
- azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT,
- properties.getWorkflowInputPath());
- testGetLocation(
- azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.WORKFLOW_OUTPUT,
- properties.getWorkflowOutputPath());
- testGetLocation(
- azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.TASK_INPUT,
- properties.getTaskInputPath());
- testGetLocation(
- azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.TASK_OUTPUT,
- properties.getTaskOutputPath());
-
- testGetLocation(
- azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation.WRITE,
- ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT,
- properties.getWorkflowInputPath());
- testGetLocation(
- azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation.WRITE,
- ExternalPayloadStorage.PayloadType.WORKFLOW_OUTPUT,
- properties.getWorkflowOutputPath());
- testGetLocation(
- azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation.WRITE,
- ExternalPayloadStorage.PayloadType.TASK_INPUT,
- properties.getTaskInputPath());
- testGetLocation(
- azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation.WRITE,
- ExternalPayloadStorage.PayloadType.TASK_OUTPUT,
- properties.getTaskOutputPath());
- }
-}
diff --git a/build.gradle b/build.gradle
index accc0186f..358563031 100644
--- a/build.gradle
+++ b/build.gradle
@@ -138,6 +138,7 @@ allprojects {
testLogging {
events = ["SKIPPED", "FAILED"]
exceptionFormat = "full"
+ displayGranularity = 1
showStandardStreams = false
}
}
@@ -154,9 +155,9 @@ allprojects {
jacocoTestReport {
reports {
- html.enabled = true
- xml.enabled = true
- csv.enabled = false
+ html.required = true
+ xml.required = true
+ csv.required = false
}
}
diff --git a/cassandra-persistence/dependencies.lock b/cassandra-persistence/dependencies.lock
index 12a8fb9b8..9cd49a6e1 100644
--- a/cassandra-persistence/dependencies.lock
+++ b/cassandra-persistence/dependencies.lock
@@ -1,27 +1,147 @@
{
"annotationProcessor": {
"org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
}
},
"compileClasspath": {
"com.datastax.cassandra:cassandra-driver-core": {
"locked": "3.10.2"
},
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "com.github.jnr:jffi": {
+ "locked": "1.2.16",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "com.github.jnr:jnr-constants": {
+ "locked": "0.9.9",
+ "transitive": [
+ "com.github.jnr:jnr-posix"
+ ]
+ },
+ "com.github.jnr:jnr-ffi": {
+ "locked": "2.1.7",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
+ "com.github.jnr:jnr-posix"
+ ]
+ },
+ "com.github.jnr:jnr-posix": {
+ "locked": "3.0.44",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "com.github.jnr:jnr-x86asm": {
+ "locked": "1.0.2",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "com.google.guava:guava": {
+ "locked": "19.0",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
"com.netflix.conductor:conductor-common": {
"project": true
},
"com.netflix.conductor:conductor-core": {
"project": true
},
+ "io.dropwizard.metrics:metrics-core": {
+ "locked": "4.1.22",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "io.netty:netty-buffer": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-codec",
+ "io.netty:netty-handler",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-codec": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-handler"
+ ]
+ },
+ "io.netty:netty-common": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-buffer",
+ "io.netty:netty-codec",
+ "io.netty:netty-handler",
+ "io.netty:netty-resolver",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-handler": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "io.netty:netty-resolver": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-handler",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-transport": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-codec",
+ "io.netty:netty-handler"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
"locked": "2.17.1"
@@ -32,8 +152,124 @@
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.ow2.asm:asm": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi",
+ "org.ow2.asm:asm-tree"
+ ]
+ },
+ "org.ow2.asm:asm-analysis": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.ow2.asm:asm-commons": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.ow2.asm:asm-tree": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi",
+ "org.ow2.asm:asm-analysis",
+ "org.ow2.asm:asm-commons",
+ "org.ow2.asm:asm-util"
+ ]
+ },
+ "org.ow2.asm:asm-util": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
+ "io.dropwizard.metrics:metrics-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
},
"runtimeClasspath": {
@@ -41,389 +277,2038 @@
"locked": "3.10.2"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
+ ]
},
"com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2.2"
+ ]
},
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.github.jnr:jffi": {
+ "locked": "1.2.16",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "com.github.jnr:jnr-constants": {
+ "locked": "0.9.9",
+ "transitive": [
+ "com.github.jnr:jnr-posix"
+ ]
+ },
+ "com.github.jnr:jnr-ffi": {
+ "locked": "2.1.7",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
+ "com.github.jnr:jnr-posix"
+ ]
+ },
+ "com.github.jnr:jnr-posix": {
+ "locked": "3.0.44",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "com.github.jnr:jnr-x86asm": {
+ "locked": "1.0.2",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
},
"com.google.guava:guava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "30.0-jre"
+ "locked": "19.0",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "3.13.0"
+ ]
},
"com.jayway.jsonpath:json-path": {
- "firstLevelTransitive": [
+ "locked": "2.4.0",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.6.0"
+ ]
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-common": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-core": {
"project": true
},
"com.netflix.spectator:spectator-api": {
- "firstLevelTransitive": [
+ "locked": "0.122.0",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "0.122.0"
+ ]
},
"com.spotify:completable-futures": {
- "firstLevelTransitive": [
+ "locked": "0.3.3",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "0.3.3"
+ ]
},
"commons-io:commons-io": {
- "firstLevelTransitive": [
+ "locked": "2.7",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.7"
+ ]
+ },
+ "io.dropwizard.metrics:metrics-core": {
+ "locked": "4.1.22",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "io.netty:netty-buffer": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-codec",
+ "io.netty:netty-handler",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-codec": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-handler"
+ ]
+ },
+ "io.netty:netty-common": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-buffer",
+ "io.netty:netty-codec",
+ "io.netty:netty-handler",
+ "io.netty:netty-resolver",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-handler": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "io.netty:netty-resolver": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-handler",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-transport": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-codec",
+ "io.netty:netty-handler"
+ ]
},
"io.reactivex:rxjava": {
- "firstLevelTransitive": [
+ "locked": "1.3.8",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "1.3.8"
+ ]
},
"jakarta.activation:jakarta.activation-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.2.2"
+ "locked": "1.2.2",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
},
"jakarta.xml.bind:jakarta.xml.bind-api": {
- "firstLevelTransitive": [
+ "locked": "2.3.3",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.3.3"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
},
"org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
+ "locked": "2.0.5",
+ "transitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.0.5"
+ ]
},
"org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
+ "locked": "3.10",
+ "transitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "3.12.0"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "com.github.jnr:jnr-ffi",
+ "net.minidev:accessors-smart",
+ "org.ow2.asm:asm-tree"
+ ]
+ },
+ "org.ow2.asm:asm-analysis": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.ow2.asm:asm-commons": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.ow2.asm:asm-tree": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi",
+ "org.ow2.asm:asm-analysis",
+ "org.ow2.asm:asm-commons",
+ "org.ow2.asm:asm-util"
+ ]
+ },
+ "org.ow2.asm:asm-util": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.spectator:spectator-api",
+ "io.dropwizard.metrics:metrics-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl"
+ ]
}
},
"testCompileClasspath": {
"com.datastax.cassandra:cassandra-driver-core": {
- "locked": "3.10.2"
+ "locked": "3.10.2",
+ "transitive": [
+ "org.testcontainers:cassandra"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.github.docker-java:docker-java-api"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "com.github.docker-java:docker-java-api": {
+ "locked": "3.2.8",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "com.github.docker-java:docker-java-transport": {
+ "locked": "3.2.8",
+ "transitive": [
+ "com.github.docker-java:docker-java-transport-zerodep"
+ ]
+ },
+ "com.github.docker-java:docker-java-transport-zerodep": {
+ "locked": "3.2.8",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "com.github.jnr:jffi": {
+ "locked": "1.2.16",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "com.github.jnr:jnr-constants": {
+ "locked": "0.9.9",
+ "transitive": [
+ "com.github.jnr:jnr-posix"
+ ]
+ },
+ "com.github.jnr:jnr-ffi": {
+ "locked": "2.1.7",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
+ "com.github.jnr:jnr-posix"
+ ]
+ },
+ "com.github.jnr:jnr-posix": {
+ "locked": "3.0.44",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "com.github.jnr:jnr-x86asm": {
+ "locked": "1.0.2",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "com.google.guava:guava": {
+ "locked": "19.0",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
},
"com.google.protobuf:protobuf-java": {
"locked": "3.13.0"
},
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
"com.netflix.conductor:conductor-common": {
"project": true
},
"com.netflix.conductor:conductor-core": {
"project": true
},
+ "com.thoughtworks.qdox:qdox": {
+ "locked": "1.12.1",
+ "transitive": [
+ "org.codehaus.groovy:groovy-docgenerator"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-cli:commons-cli": {
+ "locked": "1.4",
+ "transitive": [
+ "org.codehaus.groovy:groovy-cli-commons"
+ ]
+ },
+ "info.picocli:picocli": {
+ "locked": "4.3.2",
+ "transitive": [
+ "org.codehaus.groovy:groovy-cli-picocli"
+ ]
+ },
+ "io.dropwizard.metrics:metrics-core": {
+ "locked": "4.1.22",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "io.netty:netty-buffer": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-codec",
+ "io.netty:netty-handler",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-codec": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-handler"
+ ]
+ },
+ "io.netty:netty-common": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-buffer",
+ "io.netty:netty-codec",
+ "io.netty:netty-handler",
+ "io.netty:netty-resolver",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-handler": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "io.netty:netty-resolver": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-handler",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-transport": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-codec",
+ "io.netty:netty-handler"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "jline:jline": {
+ "locked": "2.14.6",
+ "transitive": [
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test",
+ "org.junit.vintage:junit-vintage-engine",
+ "org.spockframework:spock-core",
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.8.0",
+ "transitive": [
+ "com.github.docker-java:docker-java-transport-zerodep",
+ "org.rnorth.visible-assertions:visible-assertions"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.ant:ant": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.apache.ant:ant-launcher": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.apache.ant:ant"
+ ]
+ },
+ "org.apache.commons:commons-compress": {
+ "locked": "1.20",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
},
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.codehaus.groovy:groovy": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-ant",
+ "org.codehaus.groovy:groovy-cli-commons",
+ "org.codehaus.groovy:groovy-cli-picocli",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-datetime",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-groovysh",
+ "org.codehaus.groovy:groovy-jmx",
+ "org.codehaus.groovy:groovy-json",
+ "org.codehaus.groovy:groovy-jsr223",
+ "org.codehaus.groovy:groovy-macro",
+ "org.codehaus.groovy:groovy-nio",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.codehaus.groovy:groovy-sql",
+ "org.codehaus.groovy:groovy-swing",
+ "org.codehaus.groovy:groovy-templates",
+ "org.codehaus.groovy:groovy-test",
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.codehaus.groovy:groovy-testng",
+ "org.codehaus.groovy:groovy-xml",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
"org.codehaus.groovy:groovy-all": {
"locked": "2.5.13"
},
+ "org.codehaus.groovy:groovy-ant": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-cli-commons": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-cli-picocli": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
+ "org.codehaus.groovy:groovy-console": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
+ "org.codehaus.groovy:groovy-datetime": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-docgenerator": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-groovydoc": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.codehaus.groovy:groovy-groovysh": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-jmx": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-json": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-jsr223": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-macro": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-nio": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-servlet": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-sql": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-swing": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console"
+ ]
+ },
+ "org.codehaus.groovy:groovy-templates": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-test": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-test-junit5": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-testng": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-xml": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.codehaus.groovy:groovy-templates",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.hamcrest:hamcrest-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest-core": {
+ "locked": "2.2",
+ "transitive": [
+ "junit:junit"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-params"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.platform:junit-platform-launcher",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-launcher": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.platform:junit-platform-launcher",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "com.github.jnr:jnr-ffi",
+ "net.minidev:accessors-smart",
+ "org.ow2.asm:asm-tree"
+ ]
+ },
+ "org.ow2.asm:asm-analysis": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.ow2.asm:asm-commons": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.ow2.asm:asm-tree": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi",
+ "org.ow2.asm:asm-analysis",
+ "org.ow2.asm:asm-commons",
+ "org.ow2.asm:asm-util"
+ ]
+ },
+ "org.ow2.asm:asm-util": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.rnorth.duct-tape:duct-tape": {
+ "locked": "1.0.8",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "org.rnorth.visible-assertions:visible-assertions": {
+ "locked": "2.1.2",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
+ "com.github.docker-java:docker-java-api",
+ "com.github.docker-java:docker-java-transport-zerodep",
+ "com.jayway.jsonpath:json-path",
+ "io.dropwizard.metrics:metrics-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j",
+ "org.testcontainers:testcontainers"
+ ]
+ },
"org.spockframework:spock-core": {
- "locked": "1.3-groovy-2.5"
+ "locked": "1.3-groovy-2.5",
+ "transitive": [
+ "org.spockframework:spock-spring",
+ "org.testcontainers:spock"
+ ]
},
"org.spockframework:spock-spring": {
"locked": "1.3-groovy-2.5"
},
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"org.testcontainers:cassandra": {
"locked": "1.15.3"
},
+ "org.testcontainers:database-commons": {
+ "locked": "1.15.3",
+ "transitive": [
+ "org.testcontainers:cassandra"
+ ]
+ },
"org.testcontainers:spock": {
"locked": "1.15.3"
+ },
+ "org.testcontainers:testcontainers": {
+ "locked": "1.15.3",
+ "transitive": [
+ "org.testcontainers:database-commons",
+ "org.testcontainers:spock"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
},
"testRuntimeClasspath": {
+ "com.beust:jcommander": {
+ "locked": "1.72",
+ "transitive": [
+ "org.testng:testng"
+ ]
+ },
"com.datastax.cassandra:cassandra-driver-core": {
- "locked": "3.10.2"
+ "locked": "3.10.2",
+ "transitive": [
+ "org.testcontainers:cassandra"
+ ]
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.github.docker-java:docker-java-api",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
+ ]
},
"com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2.2"
+ ]
},
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8",
+ "transitive": [
+ "com.netflix.conductor:conductor-core"
+ ]
+ },
+ "com.github.docker-java:docker-java-api": {
+ "locked": "3.2.8",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "com.github.docker-java:docker-java-transport": {
+ "locked": "3.2.8",
+ "transitive": [
+ "com.github.docker-java:docker-java-transport-zerodep"
+ ]
+ },
+ "com.github.docker-java:docker-java-transport-zerodep": {
+ "locked": "3.2.8",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "com.github.jnr:jffi": {
+ "locked": "1.2.16",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "com.github.jnr:jnr-constants": {
+ "locked": "0.9.9",
+ "transitive": [
+ "com.github.jnr:jnr-posix"
+ ]
+ },
+ "com.github.jnr:jnr-ffi": {
+ "locked": "2.1.7",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
+ "com.github.jnr:jnr-posix"
+ ]
+ },
+ "com.github.jnr:jnr-posix": {
+ "locked": "3.0.44",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "com.github.jnr:jnr-x86asm": {
+ "locked": "1.0.2",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
},
"com.google.guava:guava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "30.0-jre"
+ "locked": "19.0",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "3.13.0"
+ ]
},
"com.jayway.jsonpath:json-path": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.6.0"
+ "locked": "2.4.0",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-common": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-core": {
"project": true
},
"com.netflix.spectator:spectator-api": {
- "firstLevelTransitive": [
+ "locked": "0.122.0",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "0.122.0"
+ ]
},
"com.spotify:completable-futures": {
- "firstLevelTransitive": [
+ "locked": "0.3.3",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "0.3.3"
+ ]
+ },
+ "com.thoughtworks.qdox:qdox": {
+ "locked": "1.12.1",
+ "transitive": [
+ "org.codehaus.groovy:groovy-docgenerator"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-cli:commons-cli": {
+ "locked": "1.4",
+ "transitive": [
+ "org.codehaus.groovy:groovy-cli-commons"
+ ]
},
"commons-io:commons-io": {
- "firstLevelTransitive": [
+ "locked": "2.7",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.7"
+ ]
+ },
+ "info.picocli:picocli": {
+ "locked": "4.3.2",
+ "transitive": [
+ "org.codehaus.groovy:groovy-cli-picocli"
+ ]
+ },
+ "io.dropwizard.metrics:metrics-core": {
+ "locked": "4.1.22",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "io.netty:netty-buffer": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-codec",
+ "io.netty:netty-handler",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-codec": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-handler"
+ ]
+ },
+ "io.netty:netty-common": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-buffer",
+ "io.netty:netty-codec",
+ "io.netty:netty-handler",
+ "io.netty:netty-resolver",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-handler": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core"
+ ]
+ },
+ "io.netty:netty-resolver": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-handler",
+ "io.netty:netty-transport"
+ ]
+ },
+ "io.netty:netty-transport": {
+ "locked": "4.1.65.Final",
+ "transitive": [
+ "io.netty:netty-codec",
+ "io.netty:netty-handler"
+ ]
},
"io.reactivex:rxjava": {
- "firstLevelTransitive": [
+ "locked": "1.3.8",
+ "transitive": [
"com.netflix.conductor:conductor-core"
- ],
- "locked": "1.3.8"
+ ]
},
"jakarta.activation:jakarta.activation-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.2.2"
+ "locked": "1.2.2",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"jakarta.xml.bind:jakarta.xml.bind-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.3.3"
+ "locked": "2.3.3",
+ "transitive": [
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "jline:jline": {
+ "locked": "2.14.6",
+ "transitive": [
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
},
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test",
+ "org.junit.vintage:junit-vintage-engine",
+ "org.spockframework:spock-core",
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.8.0",
+ "transitive": [
+ "com.github.docker-java:docker-java-transport-zerodep",
+ "org.rnorth.visible-assertions:visible-assertions"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.ant:ant": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.apache.ant:ant-junit",
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.apache.ant:ant-antlr": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.apache.ant:ant-junit": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.apache.ant:ant-launcher": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.apache.ant:ant",
+ "org.codehaus.groovy:groovy-ant"
+ ]
},
"org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
+ "locked": "2.0.5",
+ "transitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.0.5"
+ ]
+ },
+ "org.apache.commons:commons-compress": {
+ "locked": "1.20",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
},
"org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
+ "locked": "3.10",
+ "transitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "3.12.0"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-core",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "org.codehaus.groovy:groovy": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-ant",
+ "org.codehaus.groovy:groovy-cli-commons",
+ "org.codehaus.groovy:groovy-cli-picocli",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-datetime",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-groovysh",
+ "org.codehaus.groovy:groovy-jmx",
+ "org.codehaus.groovy:groovy-json",
+ "org.codehaus.groovy:groovy-jsr223",
+ "org.codehaus.groovy:groovy-macro",
+ "org.codehaus.groovy:groovy-nio",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.codehaus.groovy:groovy-sql",
+ "org.codehaus.groovy:groovy-swing",
+ "org.codehaus.groovy:groovy-templates",
+ "org.codehaus.groovy:groovy-test",
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.codehaus.groovy:groovy-testng",
+ "org.codehaus.groovy:groovy-xml",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
},
"org.codehaus.groovy:groovy-all": {
"locked": "2.5.13"
},
+ "org.codehaus.groovy:groovy-ant": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-cli-commons": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-cli-picocli": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
+ "org.codehaus.groovy:groovy-console": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
+ "org.codehaus.groovy:groovy-datetime": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-docgenerator": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-groovydoc"
+ ]
+ },
+ "org.codehaus.groovy:groovy-groovydoc": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.codehaus.groovy:groovy-groovysh": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-jmx": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-json": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-jsr223": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-macro": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-nio": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-servlet": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-sql": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-swing": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console"
+ ]
+ },
+ "org.codehaus.groovy:groovy-templates": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-test": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-test-junit5": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-testng": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-xml": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.codehaus.groovy:groovy-templates",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.hamcrest:hamcrest-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest-core": {
+ "locked": "2.2",
+ "transitive": [
+ "junit:junit"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.mockito:mockito-junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.platform:junit-platform-launcher",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-launcher": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.platform:junit-platform-launcher",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "com.github.jnr:jnr-ffi",
+ "net.minidev:accessors-smart",
+ "org.ow2.asm:asm-tree"
+ ]
+ },
+ "org.ow2.asm:asm-analysis": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.ow2.asm:asm-commons": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.ow2.asm:asm-tree": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi",
+ "org.ow2.asm:asm-analysis",
+ "org.ow2.asm:asm-commons",
+ "org.ow2.asm:asm-util"
+ ]
+ },
+ "org.ow2.asm:asm-util": {
+ "locked": "5.0.3",
+ "transitive": [
+ "com.github.jnr:jnr-ffi"
+ ]
+ },
+ "org.rnorth.duct-tape:duct-tape": {
+ "locked": "1.0.8",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "org.rnorth.visible-assertions:visible-assertions": {
+ "locked": "2.1.2",
+ "transitive": [
+ "org.testcontainers:testcontainers"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.datastax.cassandra:cassandra-driver-core",
+ "com.github.docker-java:docker-java-api",
+ "com.github.docker-java:docker-java-transport-zerodep",
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.spectator:spectator-api",
+ "io.dropwizard.metrics:metrics-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j",
+ "org.testcontainers:testcontainers"
+ ]
+ },
"org.spockframework:spock-core": {
- "locked": "1.3-groovy-2.5"
+ "locked": "1.3-groovy-2.5",
+ "transitive": [
+ "org.spockframework:spock-spring",
+ "org.testcontainers:spock"
+ ]
},
"org.spockframework:spock-spring": {
"locked": "1.3-groovy-2.5"
},
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"org.testcontainers:cassandra": {
"locked": "1.15.3"
},
+ "org.testcontainers:database-commons": {
+ "locked": "1.15.3",
+ "transitive": [
+ "org.testcontainers:cassandra"
+ ]
+ },
"org.testcontainers:spock": {
"locked": "1.15.3"
+ },
+ "org.testcontainers:testcontainers": {
+ "locked": "1.15.3",
+ "transitive": [
+ "org.testcontainers:database-commons",
+ "org.testcontainers:spock"
+ ]
+ },
+ "org.testng:testng": {
+ "locked": "6.13.1",
+ "transitive": [
+ "org.codehaus.groovy:groovy-testng"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
}
}
\ No newline at end of file
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java
index 4341186d7..f8184f4b5 100644
--- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java
@@ -12,12 +12,7 @@
*/
package com.netflix.conductor.cassandra.dao;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
+import java.util.*;
import java.util.stream.Collectors;
import org.slf4j.Logger;
@@ -28,7 +23,6 @@
import com.netflix.conductor.cassandra.util.Statements;
import com.netflix.conductor.common.metadata.events.EventExecution;
import com.netflix.conductor.common.metadata.tasks.TaskDef;
-import com.netflix.conductor.common.utils.RetryUtil;
import com.netflix.conductor.core.exception.ApplicationException;
import com.netflix.conductor.core.exception.ApplicationException.Code;
import com.netflix.conductor.dao.ConcurrentExecutionLimitDAO;
@@ -37,25 +31,12 @@
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
-import com.datastax.driver.core.BatchStatement;
-import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.datastax.driver.core.Session;
+import com.datastax.driver.core.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
-import static com.netflix.conductor.cassandra.util.Constants.DEFAULT_SHARD_ID;
-import static com.netflix.conductor.cassandra.util.Constants.DEFAULT_TOTAL_PARTITIONS;
-import static com.netflix.conductor.cassandra.util.Constants.ENTITY_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.ENTITY_TYPE_TASK;
-import static com.netflix.conductor.cassandra.util.Constants.ENTITY_TYPE_WORKFLOW;
-import static com.netflix.conductor.cassandra.util.Constants.PAYLOAD_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.TASK_ID_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.TOTAL_PARTITIONS_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.TOTAL_TASKS_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.WORKFLOW_ID_KEY;
+import static com.netflix.conductor.cassandra.util.Constants.*;
@Trace
public class CassandraExecutionDAO extends CassandraBaseDAO
@@ -746,19 +727,11 @@ public void addTaskToLimit(TaskModel task) {
try {
recordCassandraDaoRequests(
"addTaskToLimit", task.getTaskType(), task.getWorkflowType());
- new RetryUtil<>()
- .retryOnException(
- () ->
- session.execute(
- updateTaskDefLimitStatement.bind(
- UUID.fromString(task.getWorkflowInstanceId()),
- task.getTaskDefName(),
- UUID.fromString(task.getTaskId()))),
- null,
- null,
- 3,
- "Adding to task_def_limit",
- "addTaskToLimit");
+ session.execute(
+ updateTaskDefLimitStatement.bind(
+ UUID.fromString(task.getWorkflowInstanceId()),
+ task.getTaskDefName(),
+ UUID.fromString(task.getTaskId())));
} catch (Exception e) {
Monitors.error(CLASS_NAME, "addTaskToLimit");
String errorMsg =
@@ -775,18 +748,9 @@ public void removeTaskFromLimit(TaskModel task) {
try {
recordCassandraDaoRequests(
"removeTaskFromLimit", task.getTaskType(), task.getWorkflowType());
- new RetryUtil<>()
- .retryOnException(
- () ->
- session.execute(
- deleteTaskDefLimitStatement.bind(
- task.getTaskDefName(),
- UUID.fromString(task.getTaskId()))),
- null,
- null,
- 3,
- "Deleting from task_def_limit",
- "removeTaskFromLimit");
+ session.execute(
+ deleteTaskDefLimitStatement.bind(
+ task.getTaskDefName(), UUID.fromString(task.getTaskId())));
} catch (Exception e) {
Monitors.error(CLASS_NAME, "removeTaskFromLimit");
String errorMsg =
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java
index 10bbe2dd5..0187034b5 100644
--- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java
@@ -24,10 +24,12 @@
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+import org.apache.commons.lang3.tuple.ImmutablePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.conductor.annotations.Trace;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.cassandra.config.CassandraProperties;
import com.netflix.conductor.cassandra.util.Statements;
import com.netflix.conductor.common.metadata.tasks.TaskDef;
@@ -42,7 +44,6 @@
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.annotations.VisibleForTesting;
import static com.netflix.conductor.cassandra.util.Constants.TASK_DEFINITION_KEY;
import static com.netflix.conductor.cassandra.util.Constants.TASK_DEFS_KEY;
@@ -292,8 +293,8 @@ public List getAllWorkflowDefs() {
row -> {
String defNameVersion =
row.getString(WORKFLOW_DEF_NAME_VERSION_KEY);
- String[] tokens = defNameVersion.split(INDEX_DELIMITER);
- return getWorkflowDef(tokens[0], Integer.parseInt(tokens[1]))
+ var nameVersion = getWorkflowNameAndVersion(defNameVersion);
+ return getWorkflowDef(nameVersion.getLeft(), nameVersion.getRight())
.orElse(null);
})
.filter(Objects::nonNull)
@@ -404,4 +405,27 @@ private String insertOrUpdateTaskDef(TaskDef taskDef) {
String getWorkflowDefIndexValue(String name, int version) {
return name + INDEX_DELIMITER + version;
}
+
+ @VisibleForTesting
+ ImmutablePair getWorkflowNameAndVersion(String nameVersionStr) {
+ int lastIndexOfDelimiter = nameVersionStr.lastIndexOf(INDEX_DELIMITER);
+
+ if (lastIndexOfDelimiter == -1) {
+ throw new IllegalStateException(
+ nameVersionStr
+ + " is not in the 'workflowName"
+ + INDEX_DELIMITER
+ + "version' pattern.");
+ }
+
+ String workflowName = nameVersionStr.substring(0, lastIndexOfDelimiter);
+ String versionStr = nameVersionStr.substring(lastIndexOfDelimiter + 1);
+
+ try {
+ return new ImmutablePair<>(workflowName, Integer.parseInt(versionStr));
+ } catch (NumberFormatException e) {
+ throw new IllegalStateException(
+ versionStr + " in " + nameVersionStr + " is not a valid number.");
+ }
+ }
}
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java
index a6ea12253..38eff7d84 100644
--- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java
@@ -289,7 +289,9 @@ public String getDeleteTaskDefStatement() {
// ExecutionDAO
// Insert Statements
- /** @return cql query statement to insert a new workflow into the "workflows" table */
+ /**
+ * @return cql query statement to insert a new workflow into the "workflows" table
+ */
public String getInsertWorkflowStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_WORKFLOWS)
.value(WORKFLOW_ID_KEY, bindMarker())
@@ -302,7 +304,9 @@ public String getInsertWorkflowStatement() {
.getQueryString();
}
- /** @return cql query statement to insert a new task into the "workflows" table */
+ /**
+ * @return cql query statement to insert a new task into the "workflows" table
+ */
public String getInsertTaskStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_WORKFLOWS)
.value(WORKFLOW_ID_KEY, bindMarker())
@@ -340,7 +344,9 @@ public String getSelectTotalStatement() {
.getQueryString();
}
- /** @return cql query statement to retrieve a task from the "workflows" table */
+ /**
+ * @return cql query statement to retrieve a task from the "workflows" table
+ */
public String getSelectTaskStatement() {
return QueryBuilder.select(PAYLOAD_KEY)
.from(keyspace, TABLE_WORKFLOWS)
@@ -414,7 +420,9 @@ public String getSelectAllEventExecutionsForMessageFromEventExecutionsStatement(
// Update Statements
- /** @return cql query statement to update a workflow in the "workflows" table */
+ /**
+ * @return cql query statement to update a workflow in the "workflows" table
+ */
public String getUpdateWorkflowStatement() {
return QueryBuilder.update(keyspace, TABLE_WORKFLOWS)
.with(set(PAYLOAD_KEY, bindMarker()))
@@ -461,7 +469,9 @@ public String getUpdateTaskLookupStatement() {
.getQueryString();
}
- /** @return cql query statement to add a new task_id to the "task_def_limit" table */
+ /**
+ * @return cql query statement to add a new task_id to the "task_def_limit" table
+ */
public String getUpdateTaskDefLimitStatement() {
return QueryBuilder.update(keyspace, TABLE_TASK_DEF_LIMIT)
.with(set(WORKFLOW_ID_KEY, bindMarker()))
@@ -470,7 +480,9 @@ public String getUpdateTaskDefLimitStatement() {
.getQueryString();
}
- /** @return cql query statement to update an event execution in the "event_executions" table */
+ /**
+ * @return cql query statement to update an event execution in the "event_executions" table
+ */
public String getUpdateEventExecutionStatement() {
return QueryBuilder.update(keyspace, TABLE_EVENT_EXECUTIONS)
.using(QueryBuilder.ttl(bindMarker()))
@@ -483,7 +495,9 @@ public String getUpdateEventExecutionStatement() {
// Delete statements
- /** @return cql query statement to delete a workflow from the "workflows" table */
+ /**
+ * @return cql query statement to delete a workflow from the "workflows" table
+ */
public String getDeleteWorkflowStatement() {
return QueryBuilder.delete()
.from(keyspace, TABLE_WORKFLOWS)
@@ -503,7 +517,9 @@ public String getDeleteTaskLookupStatement() {
.getQueryString();
}
- /** @return cql query statement to delete a task from the "workflows" table */
+ /**
+ * @return cql query statement to delete a task from the "workflows" table
+ */
public String getDeleteTaskStatement() {
return QueryBuilder.delete()
.from(keyspace, TABLE_WORKFLOWS)
@@ -514,7 +530,9 @@ public String getDeleteTaskStatement() {
.getQueryString();
}
- /** @return cql query statement to delete a task_id from the "task_def_limit" table */
+ /**
+ * @return cql query statement to delete a task_id from the "task_def_limit" table
+ */
public String getDeleteTaskDefLimitStatement() {
return QueryBuilder.delete()
.from(keyspace, TABLE_TASK_DEF_LIMIT)
@@ -523,7 +541,9 @@ public String getDeleteTaskDefLimitStatement() {
.getQueryString();
}
- /** @return cql query statement to delete an event execution from the "event_execution" table */
+ /**
+ * @return cql query statement to delete an event execution from the "event_execution" table
+ */
public String getDeleteEventExecutionsStatement() {
return QueryBuilder.delete()
.from(keyspace, TABLE_EVENT_EXECUTIONS)
@@ -536,7 +556,9 @@ public String getDeleteEventExecutionsStatement() {
// EventHandlerDAO
// Insert Statements
- /** @return cql query statement to insert an event handler into the "event_handlers" table */
+ /**
+ * @return cql query statement to insert an event handler into the "event_handlers" table
+ */
public String getInsertEventHandlerStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_EVENT_HANDLERS)
.value(HANDLERS_KEY, HANDLERS_KEY)
diff --git a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraExecutionDAOSpec.groovy b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraExecutionDAOSpec.groovy
index 2a3b81c39..8500d9552 100644
--- a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraExecutionDAOSpec.groovy
+++ b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraExecutionDAOSpec.groovy
@@ -24,6 +24,7 @@ import com.netflix.conductor.model.WorkflowModel
import spock.lang.Subject
import static com.netflix.conductor.common.metadata.events.EventExecution.Status.COMPLETED
+import static com.netflix.conductor.common.metadata.events.EventExecution.Status.IN_PROGRESS
import static com.netflix.conductor.core.exception.ApplicationException.Code.INVALID_INPUT
class CassandraExecutionDAOSpec extends CassandraSpec {
@@ -65,7 +66,7 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
def "workflow CRUD"() {
given:
- String workflowId = IDGenerator.generate()
+ String workflowId = new IDGenerator().generate()
WorkflowDef workflowDef = new WorkflowDef()
workflowDef.name = "def1"
workflowDef.setVersion(1)
@@ -118,15 +119,15 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
def "create tasks and verify methods that read tasks and workflow"() {
given: 'we create a workflow'
- String workflowId = IDGenerator.generate()
+ String workflowId = new IDGenerator().generate()
WorkflowDef workflowDef = new WorkflowDef(name: 'def1', version: 1)
WorkflowModel workflow = new WorkflowModel(workflowDefinition: workflowDef, workflowId: workflowId, input: new HashMap(), status: WorkflowModel.Status.RUNNING, createTime: System.currentTimeMillis())
executionDAO.createWorkflow(workflow)
and: 'create tasks for this workflow'
- TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
- TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
- TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
+ TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+ TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+ TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
def taskList = [task1, task2, task3]
@@ -190,15 +191,15 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
def "verify tasks are updated"() {
given: 'we create a workflow'
- String workflowId = IDGenerator.generate()
+ String workflowId = new IDGenerator().generate()
WorkflowDef workflowDef = new WorkflowDef(name: 'def1', version: 1)
WorkflowModel workflow = new WorkflowModel(workflowDefinition: workflowDef, workflowId: workflowId, input: new HashMap(), status: WorkflowModel.Status.RUNNING, createTime: System.currentTimeMillis())
executionDAO.createWorkflow(workflow)
and: 'create tasks for this workflow'
- TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
- TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
- TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
+ TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+ TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+ TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
and: 'add the tasks to the datastore'
executionDAO.createTasks([task1, task2, task3])
@@ -228,15 +229,15 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
def "verify tasks are removed"() {
given: 'we create a workflow'
- String workflowId = IDGenerator.generate()
+ String workflowId = new IDGenerator().generate()
WorkflowDef workflowDef = new WorkflowDef(name: 'def1', version: 1)
WorkflowModel workflow = new WorkflowModel(workflowDefinition: workflowDef, workflowId: workflowId, input: new HashMap(), status: WorkflowModel.Status.RUNNING, createTime: System.currentTimeMillis())
executionDAO.createWorkflow(workflow)
and: 'create tasks for this workflow'
- TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
- TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
- TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate())
+ TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+ TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+ TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
and: 'add the tasks to the datastore'
executionDAO.createTasks([task1, task2, task3])
@@ -278,7 +279,7 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
def "CRUD on task def limit"() {
given:
String taskDefName = "test_task_def"
- String taskId = IDGenerator.generate()
+ String taskId = new IDGenerator().generate()
TaskDef taskDef = new TaskDef(concurrentExecLimit: 1)
WorkflowTask workflowTask = new WorkflowTask(taskDefinition: taskDef)
@@ -287,7 +288,7 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
TaskModel task = new TaskModel()
task.taskDefName = taskDefName
task.taskId = taskId
- task.workflowInstanceId = IDGenerator.generate()
+ task.workflowInstanceId = new IDGenerator().generate()
task.setWorkflowTask(workflowTask)
task.setTaskType("test_task")
task.setWorkflowType("test_workflow")
@@ -295,8 +296,8 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
TaskModel newTask = new TaskModel()
newTask.setTaskDefName(taskDefName)
- newTask.setTaskId(IDGenerator.generate())
- newTask.setWorkflowInstanceId(IDGenerator.generate())
+ newTask.setTaskId(new IDGenerator().generate())
+ newTask.setWorkflowInstanceId(new IDGenerator().generate())
newTask.setWorkflowTask(workflowTask)
newTask.setTaskType("test_task")
newTask.setWorkflowType("test_workflow")
@@ -349,8 +350,8 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
ex && ex.code == INVALID_INPUT
and: 'verify that a non-existing generated id returns null'
- executionDAO.getTask(IDGenerator.generate()) == null
- executionDAO.getWorkflow(IDGenerator.generate(), true) == null
+ executionDAO.getTask(new IDGenerator().generate()) == null
+ executionDAO.getWorkflow(new IDGenerator().generate(), true) == null
}
def "CRUD on event execution"() throws Exception {
@@ -387,6 +388,7 @@ class CassandraExecutionDAOSpec extends CassandraSpec {
then: // fetch executions
eventExecutionList != null && eventExecutionList.size() == 2
+ eventExecutionList[0].status == IN_PROGRESS
eventExecutionList[1].status == COMPLETED
when: // sleep for 5 seconds (TTL)
diff --git a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraMetadataDAOSpec.groovy b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraMetadataDAOSpec.groovy
index 5c06efe55..afca61fa7 100644
--- a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraMetadataDAOSpec.groovy
+++ b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraMetadataDAOSpec.groovy
@@ -69,7 +69,7 @@ class CassandraMetadataDAOSpec extends CassandraSpec {
defOptional.get() == workflowDef
when: // modify the definition
- workflowDef.setOwnerEmail("junit@test.com")
+ workflowDef.setOwnerEmail("test@junit.com")
metadataDAO.updateWorkflowDef(workflowDef)
defOptional = metadataDAO.getWorkflowDef(name, higherVersion)
@@ -138,4 +138,39 @@ class CassandraMetadataDAOSpec extends CassandraSpec {
// fetch deleted task def
metadataDAO.getTaskDef(task2Name) == null
}
+
+ def "parse index string"() {
+ expect:
+ def pair = metadataDAO.getWorkflowNameAndVersion(nameVersionStr)
+ pair.left == workflowName
+ pair.right == version
+
+ where:
+ nameVersionStr << ['name/1', 'namespace/name/3', '/namespace/name_with_lodash/2', 'name//4', 'name-with$%/895']
+ workflowName << ['name', 'namespace/name', '/namespace/name_with_lodash', 'name/', 'name-with$%']
+ version << [1, 3, 2, 4, 895]
+ }
+
+ def "parse index string - incorrect values"() {
+ when:
+ metadataDAO.getWorkflowNameAndVersion("name_with_no_version")
+
+ then:
+ def ex = thrown(IllegalStateException.class)
+ println(ex.message)
+
+ when:
+ metadataDAO.getWorkflowNameAndVersion("name_with_no_version/")
+
+ then:
+ ex = thrown(IllegalStateException.class)
+ println(ex.message)
+
+ when:
+ metadataDAO.getWorkflowNameAndVersion("name/non_number_version")
+
+ then:
+ ex = thrown(IllegalStateException.class)
+ println(ex.message)
+ }
}
diff --git a/client-spring/dependencies.lock b/client-spring/dependencies.lock
index d272aed8c..7a115e442 100644
--- a/client-spring/dependencies.lock
+++ b/client-spring/dependencies.lock
@@ -1,10 +1,73 @@
{
"annotationProcessor": {
"org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
}
},
"compileClasspath": {
+ "aopalliance:aopalliance": {
+ "locked": "1.0",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.github.andrewoma.dexx:dexx-collections": {
+ "locked": "0.2",
+ "transitive": [
+ "com.github.vlsi.compactmap:compactmap"
+ ]
+ },
+ "com.github.vlsi.compactmap:compactmap": {
+ "locked": "2.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.guava:guava": {
+ "locked": "19.0",
+ "transitive": [
+ "com.google.inject:guice",
+ "com.netflix.servo:servo-core"
+ ]
+ },
+ "com.google.inject:guice": {
+ "locked": "4.1.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.archaius:archaius-core": {
+ "locked": "0.7.6",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.netflix.conductor:conductor-client": {
"project": true
},
@@ -14,11 +77,115 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
+ "com.netflix.netflix-commons:netflix-eventbus": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.servo:servo-core": {
+ "locked": "0.12.21",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.sun.jersey.contribs:jersey-apache-client4": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.sun.jersey:jersey-client": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "com.sun.jersey:jersey-core": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-client"
+ ]
+ },
+ "com.thoughtworks.xstream:xstream": {
+ "locked": "1.4.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-configuration:commons-configuration": {
+ "locked": "1.10",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "commons-lang:commons-lang": {
+ "locked": "2.6",
+ "transitive": [
+ "commons-configuration:commons-configuration"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "commons-configuration:commons-configuration",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "javax.inject:javax.inject": {
+ "locked": "1",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "javax.ws.rs:jsr311-api": {
+ "locked": "1.1.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-core"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
"locked": "2.17.1"
@@ -29,162 +196,675 @@
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.netflix.servo:servo-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "xmlpull:xmlpull": {
+ "locked": "1.1.3.1",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
+ },
+ "xpp3:xpp3_min": {
+ "locked": "1.1.4c",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
}
},
"runtimeClasspath": {
+ "antlr:antlr": {
+ "locked": "2.7.7",
+ "transitive": [
+ "org.antlr:antlr-runtime",
+ "org.antlr:stringtemplate"
+ ]
+ },
+ "aopalliance:aopalliance": {
+ "locked": "1.0",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
"com.amazonaws:aws-java-sdk-core": {
- "firstLevelTransitive": [
+ "locked": "1.11.86",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "1.11.86"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
},
"com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "2.13.2"
+ ]
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
},
"com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "2.13.2"
- },
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
+ ]
+ },
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
+ },
+ "com.github.andrewoma.dexx:dexx-collections": {
+ "locked": "0.2",
+ "transitive": [
+ "com.github.vlsi.compactmap:compactmap"
+ ]
+ },
+ "com.github.vlsi.compactmap:compactmap": {
+ "locked": "2.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "com.google.code.gson:gson": {
+ "locked": "2.8.7",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
},
"com.google.guava:guava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-client"
- ],
- "locked": "30.0-jre"
+ "locked": "19.0",
+ "transitive": [
+ "com.google.inject:guice",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.netflix-commons:netflix-infix",
+ "com.netflix.servo:servo-core"
+ ]
+ },
+ "com.google.inject:guice": {
+ "locked": "4.1.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.13.0"
+ ]
+ },
+ "com.netflix.archaius:archaius-core": {
+ "locked": "0.7.6",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-client": {
"project": true
},
"com.netflix.conductor:conductor-common": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "project": true
+ ]
},
"com.netflix.eureka:eureka-client": {
- "firstLevelTransitive": [
+ "locked": "1.10.10",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "1.10.10"
+ ]
+ },
+ "com.netflix.netflix-commons:netflix-eventbus": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.netflix-commons:netflix-infix": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
+ "com.netflix.servo:servo-core": {
+ "locked": "0.12.21",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
},
"com.netflix.spectator:spectator-api": {
- "firstLevelTransitive": [
+ "locked": "0.122.0",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "0.122.0"
+ ]
+ },
+ "com.sun.jersey.contribs:jersey-apache-client4": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.sun.jersey:jersey-client": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-client"
- ],
- "locked": "1.19.4"
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "com.sun.jersey:jersey-core": {
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-client"
+ ]
+ },
+ "com.thoughtworks.xstream:xstream": {
+ "locked": "1.4.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-configuration:commons-configuration": {
+ "locked": "1.10",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"commons-io:commons-io": {
- "firstLevelTransitive": [
+ "locked": "2.7",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "2.7"
+ ]
+ },
+ "commons-jxpath:commons-jxpath": {
+ "locked": "1.3",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "commons-lang:commons-lang": {
+ "locked": "2.6",
+ "transitive": [
+ "commons-configuration:commons-configuration"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "commons-configuration:commons-configuration",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations"
+ ]
+ },
+ "javax.inject:javax.inject": {
+ "locked": "1",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "javax.servlet:servlet-api": {
+ "locked": "2.5",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "javax.ws.rs:jsr311-api": {
+ "locked": "1.1.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-core"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "org.antlr:antlr-runtime": {
+ "locked": "3.4",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "org.antlr:stringtemplate": {
+ "locked": "3.2.1",
+ "transitive": [
+ "org.antlr:antlr-runtime"
+ ]
},
"org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
+ "locked": "2.0.5",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.5"
+ ]
},
"org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
+ "locked": "3.10",
+ "transitive": [
"com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.12.0"
+ ]
+ },
+ "org.apache.commons:commons-math": {
+ "locked": "2.2",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.codehaus.jettison:jettison": {
+ "locked": "1.4.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
},
"org.slf4j:slf4j-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-client"
- ],
- "locked": "1.7.36"
+ "locked": "1.7.30",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.netflix-commons:netflix-eventbus",
+ "com.netflix.netflix-commons:netflix-infix",
+ "com.netflix.servo:servo-core",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "xmlpull:xmlpull": {
+ "locked": "1.1.3.1",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
+ },
+ "xpp3:xpp3_min": {
+ "locked": "1.1.4c",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
}
},
"testCompileClasspath": {
+ "aopalliance:aopalliance": {
+ "locked": "1.0",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.github.andrewoma.dexx:dexx-collections": {
+ "locked": "0.2",
+ "transitive": [
+ "com.github.vlsi.compactmap:compactmap"
+ ]
+ },
+ "com.github.vlsi.compactmap:compactmap": {
+ "locked": "2.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.guava:guava": {
+ "locked": "19.0",
+ "transitive": [
+ "com.google.inject:guice",
+ "com.netflix.servo:servo-core"
+ ]
+ },
+ "com.google.inject:guice": {
+ "locked": "4.1.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "com.netflix.archaius:archaius-core": {
+ "locked": "0.7.6",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.netflix.conductor:conductor-client": {
"project": true
},
@@ -194,192 +874,1134 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
+ "com.netflix.netflix-commons:netflix-eventbus": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.servo:servo-core": {
+ "locked": "0.12.21",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.sun.jersey.contribs:jersey-apache-client4": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.sun.jersey:jersey-client": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "com.sun.jersey:jersey-core": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-client"
+ ]
+ },
+ "com.thoughtworks.xstream:xstream": {
+ "locked": "1.4.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-configuration:commons-configuration": {
+ "locked": "1.10",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "commons-lang:commons-lang": {
+ "locked": "2.6",
+ "transitive": [
+ "commons-configuration:commons-configuration"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "commons-configuration:commons-configuration",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "javax.inject:javax.inject": {
+ "locked": "1",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "javax.ws.rs:jsr311-api": {
+ "locked": "1.1.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-core"
+ ]
+ },
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-params"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.servo:servo-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "xmlpull:xmlpull": {
+ "locked": "1.1.3.1",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
+ },
+ "xpp3:xpp3_min": {
+ "locked": "1.1.4c",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
}
},
"testRuntimeClasspath": {
+ "antlr:antlr": {
+ "locked": "2.7.7",
+ "transitive": [
+ "org.antlr:antlr-runtime",
+ "org.antlr:stringtemplate"
+ ]
+ },
+ "aopalliance:aopalliance": {
+ "locked": "1.0",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
"com.amazonaws:aws-java-sdk-core": {
- "firstLevelTransitive": [
+ "locked": "1.11.86",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "1.11.86"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
},
"com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "2.13.2"
+ ]
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
},
"com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "2.13.2"
- },
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
+ ]
+ },
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
+ },
+ "com.github.andrewoma.dexx:dexx-collections": {
+ "locked": "0.2",
+ "transitive": [
+ "com.github.vlsi.compactmap:compactmap"
+ ]
+ },
+ "com.github.vlsi.compactmap:compactmap": {
+ "locked": "2.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "com.google.code.gson:gson": {
+ "locked": "2.8.7",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
},
"com.google.guava:guava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-client"
- ],
- "locked": "30.0-jre"
+ "locked": "19.0",
+ "transitive": [
+ "com.google.inject:guice",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.netflix-commons:netflix-infix",
+ "com.netflix.servo:servo-core"
+ ]
+ },
+ "com.google.inject:guice": {
+ "locked": "4.1.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.13.0"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "com.netflix.archaius:archaius-core": {
+ "locked": "0.7.6",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-client": {
"project": true
},
"com.netflix.conductor:conductor-common": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "project": true
+ ]
},
"com.netflix.eureka:eureka-client": {
- "firstLevelTransitive": [
+ "locked": "1.10.10",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "1.10.10"
+ ]
+ },
+ "com.netflix.netflix-commons:netflix-eventbus": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.netflix-commons:netflix-infix": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
+ "com.netflix.servo:servo-core": {
+ "locked": "0.12.21",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
},
"com.netflix.spectator:spectator-api": {
- "firstLevelTransitive": [
+ "locked": "0.122.0",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "0.122.0"
+ ]
+ },
+ "com.sun.jersey.contribs:jersey-apache-client4": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.sun.jersey:jersey-client": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-client"
- ],
- "locked": "1.19.4"
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "com.sun.jersey:jersey-core": {
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-client"
+ ]
+ },
+ "com.thoughtworks.xstream:xstream": {
+ "locked": "1.4.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-configuration:commons-configuration": {
+ "locked": "1.10",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"commons-io:commons-io": {
- "firstLevelTransitive": [
+ "locked": "2.7",
+ "transitive": [
"com.netflix.conductor:conductor-client"
- ],
- "locked": "2.7"
+ ]
+ },
+ "commons-jxpath:commons-jxpath": {
+ "locked": "1.3",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "commons-lang:commons-lang": {
+ "locked": "2.6",
+ "transitive": [
+ "commons-configuration:commons-configuration"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "commons-configuration:commons-configuration",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "javax.inject:javax.inject": {
+ "locked": "1",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "javax.servlet:servlet-api": {
+ "locked": "2.5",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "javax.ws.rs:jsr311-api": {
+ "locked": "1.1.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-core"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
},
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.antlr:antlr-runtime": {
+ "locked": "3.4",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "org.antlr:stringtemplate": {
+ "locked": "3.2.1",
+ "transitive": [
+ "org.antlr:antlr-runtime"
+ ]
},
"org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
+ "locked": "2.0.5",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.5"
+ ]
},
"org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
+ "locked": "3.10",
+ "transitive": [
"com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.12.0"
+ ]
+ },
+ "org.apache.commons:commons-math": {
+ "locked": "2.2",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.codehaus.jettison:jettison": {
+ "locked": "1.4.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.mockito:mockito-junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
},
"org.slf4j:slf4j-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-client"
- ],
- "locked": "1.7.36"
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.netflix-commons:netflix-eventbus",
+ "com.netflix.netflix-commons:netflix-infix",
+ "com.netflix.servo:servo-core",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
},
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "xmlpull:xmlpull": {
+ "locked": "1.1.3.1",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
+ },
+ "xpp3:xpp3_min": {
+ "locked": "1.1.4c",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
}
}
}
\ No newline at end of file
diff --git a/client/build.gradle b/client/build.gradle
index 1a5ba7f2e..285ac6ceb 100644
--- a/client/build.gradle
+++ b/client/build.gradle
@@ -18,8 +18,6 @@ configurations.all {
dependencies {
implementation project(':conductor-common')
- // SBMTODO: remove guava dep
- implementation "com.google.guava:guava:${revGuava}"
implementation "com.sun.jersey:jersey-client:${revJersey}"
diff --git a/client/dependencies.lock b/client/dependencies.lock
index 01ac2df2e..518650069 100644
--- a/client/dependencies.lock
+++ b/client/dependencies.lock
@@ -1,21 +1,110 @@
{
"annotationProcessor": {
"org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
}
},
"compileClasspath": {
+ "aopalliance:aopalliance": {
+ "locked": "1.0",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
"com.amazonaws:aws-java-sdk-core": {
"locked": "1.11.86"
},
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
"com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.13.2"
+ "locked": "2.11.4"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
},
"com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.13.2"
+ "locked": "2.11.4"
+ },
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
+ },
+ "com.github.andrewoma.dexx:dexx-collections": {
+ "locked": "0.2",
+ "transitive": [
+ "com.github.vlsi.compactmap:compactmap"
+ ]
+ },
+ "com.github.vlsi.compactmap:compactmap": {
+ "locked": "2.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.google.guava:guava": {
- "locked": "30.0-jre"
+ "locked": "19.0",
+ "transitive": [
+ "com.google.inject:guice",
+ "com.netflix.servo:servo-core"
+ ]
+ },
+ "com.google.inject:guice": {
+ "locked": "4.1.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.archaius:archaius-core": {
+ "locked": "0.7.6",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -23,23 +112,139 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
+ "com.netflix.netflix-commons:netflix-eventbus": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.servo:servo-core": {
+ "locked": "0.12.21",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.netflix.spectator:spectator-api": {
"locked": "0.122.0"
},
+ "com.sun.jersey.contribs:jersey-apache-client4": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4"
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "com.sun.jersey:jersey-core": {
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-client"
+ ]
+ },
+ "com.thoughtworks.xstream:xstream": {
+ "locked": "1.4.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-configuration:commons-configuration": {
+ "locked": "1.10",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"commons-io:commons-io": {
"locked": "2.7"
},
+ "commons-lang:commons-lang": {
+ "locked": "2.6",
+ "transitive": [
+ "commons-configuration:commons-configuration"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "commons-configuration:commons-configuration",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations"
+ ]
+ },
+ "javax.inject:javax.inject": {
+ "locked": "1",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "javax.ws.rs:jsr311-api": {
+ "locked": "1.1.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-core"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
"locked": "2.17.1"
@@ -51,56 +256,224 @@
"locked": "2.17.1"
},
"org.slf4j:slf4j-api": {
- "locked": "1.7.36"
+ "locked": "1.7.30",
+ "transitive": [
+ "com.netflix.servo:servo-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "xmlpull:xmlpull": {
+ "locked": "1.1.3.1",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
+ },
+ "xpp3:xpp3_min": {
+ "locked": "1.1.4c",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
}
},
"pmd": {
+ "com.beust:jcommander": {
+ "locked": "1.48",
+ "transitive": [
+ "net.sourceforge.pmd:pmd-core"
+ ]
+ },
+ "com.google.code.gson:gson": {
+ "locked": "2.8.7",
+ "transitive": [
+ "net.sourceforge.pmd:pmd-core"
+ ]
+ },
+ "commons-io:commons-io": {
+ "locked": "2.6",
+ "transitive": [
+ "net.sourceforge.pmd:pmd-core",
+ "net.sourceforge.pmd:pmd-java"
+ ]
+ },
+ "net.sourceforge.pmd:pmd-core": {
+ "locked": "6.39.0",
+ "transitive": [
+ "net.sourceforge.pmd:pmd-java"
+ ]
+ },
"net.sourceforge.pmd:pmd-java": {
"locked": "6.39.0"
+ },
+ "net.sourceforge.saxon:saxon": {
+ "locked": "9.1.0.8",
+ "transitive": [
+ "net.sourceforge.pmd:pmd-core",
+ "net.sourceforge.pmd:pmd-java"
+ ]
+ },
+ "org.antlr:antlr4-runtime": {
+ "locked": "4.7.2",
+ "transitive": [
+ "net.sourceforge.pmd:pmd-core"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10",
+ "transitive": [
+ "net.sourceforge.pmd:pmd-core",
+ "net.sourceforge.pmd:pmd-java"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "9.2",
+ "transitive": [
+ "net.sourceforge.pmd:pmd-core",
+ "net.sourceforge.pmd:pmd-java"
+ ]
}
},
"runtimeClasspath": {
+ "antlr:antlr": {
+ "locked": "2.7.7",
+ "transitive": [
+ "org.antlr:antlr-runtime",
+ "org.antlr:stringtemplate"
+ ]
+ },
+ "aopalliance:aopalliance": {
+ "locked": "1.0",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
"com.amazonaws:aws-java-sdk-core": {
"locked": "1.11.86"
},
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
},
"com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.13.2"
+ "locked": "2.11.4"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.13.2"
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
},
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.11.4"
+ },
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
+ },
+ "com.github.andrewoma.dexx:dexx-collections": {
+ "locked": "0.2",
+ "transitive": [
+ "com.github.vlsi.compactmap:compactmap"
+ ]
+ },
+ "com.github.vlsi.compactmap:compactmap": {
+ "locked": "2.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "com.google.code.gson:gson": {
+ "locked": "2.8.7",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
},
"com.google.guava:guava": {
- "locked": "30.0-jre"
+ "locked": "19.0",
+ "transitive": [
+ "com.google.inject:guice",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.netflix-commons:netflix-infix",
+ "com.netflix.servo:servo-core"
+ ]
+ },
+ "com.google.inject:guice": {
+ "locked": "4.1.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.13.0"
+ ]
+ },
+ "com.netflix.archaius:archaius-core": {
+ "locked": "0.7.6",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -108,88 +481,485 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
+ "com.netflix.netflix-commons:netflix-eventbus": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.netflix-commons:netflix-infix": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
+ "com.netflix.servo:servo-core": {
+ "locked": "0.12.21",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
"com.netflix.spectator:spectator-api": {
"locked": "0.122.0"
},
+ "com.sun.jersey.contribs:jersey-apache-client4": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4"
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "com.sun.jersey:jersey-core": {
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-client"
+ ]
+ },
+ "com.thoughtworks.xstream:xstream": {
+ "locked": "1.4.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-configuration:commons-configuration": {
+ "locked": "1.10",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"commons-io:commons-io": {
"locked": "2.7"
},
+ "commons-jxpath:commons-jxpath": {
+ "locked": "1.3",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "commons-lang:commons-lang": {
+ "locked": "2.6",
+ "transitive": [
+ "commons-configuration:commons-configuration"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "commons-configuration:commons-configuration",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations"
+ ]
+ },
+ "javax.inject:javax.inject": {
+ "locked": "1",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "javax.servlet:servlet-api": {
+ "locked": "2.5",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "javax.ws.rs:jsr311-api": {
+ "locked": "1.1.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-core"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "org.antlr:antlr-runtime": {
+ "locked": "3.4",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "org.antlr:stringtemplate": {
+ "locked": "3.2.1",
+ "transitive": [
+ "org.antlr:antlr-runtime"
+ ]
+ },
"org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
+ "locked": "2.0.5",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.5"
+ ]
},
"org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
+ "locked": "3.10",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.12.0"
+ ]
+ },
+ "org.apache.commons:commons-math": {
+ "locked": "2.2",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.codehaus.jettison:jettison": {
+ "locked": "1.4.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"org.slf4j:slf4j-api": {
- "locked": "1.7.36"
+ "locked": "1.7.30",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.netflix-commons:netflix-eventbus",
+ "com.netflix.netflix-commons:netflix-infix",
+ "com.netflix.servo:servo-core",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "xmlpull:xmlpull": {
+ "locked": "1.1.3.1",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
+ },
+ "xpp3:xpp3_min": {
+ "locked": "1.1.4c",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
}
},
"spotbugs": {
"com.github.spotbugs:spotbugs": {
"locked": "4.4.1"
+ },
+ "com.github.spotbugs:spotbugs-annotations": {
+ "locked": "4.4.1",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.github.spotbugs:spotbugs-annotations"
+ ]
+ },
+ "com.google.code.gson:gson": {
+ "locked": "2.8.7",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "jaxen:jaxen": {
+ "locked": "1.2.0",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "net.jcip:jcip-annotations": {
+ "locked": "1.0",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "net.sf.saxon:Saxon-HE": {
+ "locked": "10.5",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "org.apache.bcel:bcel": {
+ "locked": "6.5.0",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.10",
+ "transitive": [
+ "com.github.spotbugs:spotbugs",
+ "org.apache.commons:commons-text"
+ ]
+ },
+ "org.apache.commons:commons-text": {
+ "locked": "1.9",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "org.dom4j:dom4j": {
+ "locked": "2.1.3",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.7.2",
+ "transitive": [
+ "com.github.spotbugs:spotbugs",
+ "com.github.spotbugs:spotbugs-annotations"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "9.2",
+ "transitive": [
+ "com.github.spotbugs:spotbugs",
+ "org.ow2.asm:asm-commons",
+ "org.ow2.asm:asm-tree",
+ "org.ow2.asm:asm-util"
+ ]
+ },
+ "org.ow2.asm:asm-analysis": {
+ "locked": "9.2",
+ "transitive": [
+ "com.github.spotbugs:spotbugs",
+ "org.ow2.asm:asm-commons",
+ "org.ow2.asm:asm-util"
+ ]
+ },
+ "org.ow2.asm:asm-commons": {
+ "locked": "9.2",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "org.ow2.asm:asm-tree": {
+ "locked": "9.2",
+ "transitive": [
+ "com.github.spotbugs:spotbugs",
+ "org.ow2.asm:asm-analysis",
+ "org.ow2.asm:asm-commons",
+ "org.ow2.asm:asm-util"
+ ]
+ },
+ "org.ow2.asm:asm-util": {
+ "locked": "9.2",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.github.spotbugs:spotbugs"
+ ]
}
},
"spotbugsSlf4j": {
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.slf4j:slf4j-simple"
+ ]
+ },
"org.slf4j:slf4j-simple": {
"locked": "1.8.0-beta4"
}
},
"testCompileClasspath": {
+ "aopalliance:aopalliance": {
+ "locked": "1.0",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
"com.amazonaws:aws-java-sdk-core": {
"locked": "1.11.86"
},
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
"com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.13.2"
+ "locked": "2.11.4"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
},
"com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.13.2"
+ "locked": "2.11.4"
+ },
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
+ },
+ "com.github.andrewoma.dexx:dexx-collections": {
+ "locked": "0.2",
+ "transitive": [
+ "com.github.vlsi.compactmap:compactmap"
+ ]
+ },
+ "com.github.vlsi.compactmap:compactmap": {
+ "locked": "2.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.google.guava:guava": {
- "locked": "30.0-jre"
+ "locked": "19.0",
+ "transitive": [
+ "com.google.inject:guice",
+ "com.netflix.servo:servo-core"
+ ]
+ },
+ "com.google.inject:guice": {
+ "locked": "4.1.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "com.netflix.archaius:archaius-core": {
+ "locked": "0.7.6",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -197,94 +967,649 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
+ "com.netflix.netflix-commons:netflix-eventbus": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.servo:servo-core": {
+ "locked": "0.12.21",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.netflix.spectator:spectator-api": {
"locked": "0.122.0"
},
+ "com.sun.jersey.contribs:jersey-apache-client4": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4"
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "com.sun.jersey:jersey-core": {
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-client"
+ ]
+ },
+ "com.thoughtworks.xstream:xstream": {
+ "locked": "1.4.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-configuration:commons-configuration": {
+ "locked": "1.10",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"commons-io:commons-io": {
"locked": "2.7"
},
+ "commons-lang:commons-lang": {
+ "locked": "2.6",
+ "transitive": [
+ "commons-configuration:commons-configuration"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "commons-configuration:commons-configuration",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "javax.inject:javax.inject": {
+ "locked": "1",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "javax.ws.rs:jsr311-api": {
+ "locked": "1.1.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-core"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine",
+ "org.powermock:powermock-module-junit4",
+ "org.powermock:powermock-module-junit4-common"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core",
+ "org.powermock:powermock-core",
+ "org.powermock:powermock-reflect"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core",
+ "org.powermock:powermock-core",
+ "org.powermock:powermock-reflect"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
},
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.hamcrest:hamcrest-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest-core": {
+ "locked": "2.2",
+ "transitive": [
+ "org.powermock:powermock-module-junit4",
+ "org.powermock:powermock-module-junit4-common"
+ ]
+ },
+ "org.javassist:javassist": {
+ "locked": "3.27.0-GA",
+ "transitive": [
+ "org.powermock:powermock-core"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-params"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.powermock:powermock-api-mockito2",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "3.0.1",
+ "transitive": [
+ "org.mockito:mockito-core",
+ "org.powermock:powermock-reflect"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
"org.powermock:powermock-api-mockito2": {
"locked": "2.0.9"
},
+ "org.powermock:powermock-api-support": {
+ "locked": "2.0.9",
+ "transitive": [
+ "org.powermock:powermock-api-mockito2"
+ ]
+ },
+ "org.powermock:powermock-core": {
+ "locked": "2.0.9",
+ "transitive": [
+ "org.powermock:powermock-api-support",
+ "org.powermock:powermock-module-junit4-common"
+ ]
+ },
"org.powermock:powermock-module-junit4": {
"locked": "2.0.9"
},
+ "org.powermock:powermock-module-junit4-common": {
+ "locked": "2.0.9",
+ "transitive": [
+ "org.powermock:powermock-module-junit4"
+ ]
+ },
+ "org.powermock:powermock-reflect": {
+ "locked": "2.0.9",
+ "transitive": [
+ "org.powermock:powermock-api-support",
+ "org.powermock:powermock-core",
+ "org.powermock:powermock-module-junit4-common"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
"org.slf4j:slf4j-api": {
- "locked": "1.7.36"
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.servo:servo-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "xmlpull:xmlpull": {
+ "locked": "1.1.3.1",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
+ },
+ "xpp3:xpp3_min": {
+ "locked": "1.1.4c",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
}
},
"testRuntimeClasspath": {
+ "antlr:antlr": {
+ "locked": "2.7.7",
+ "transitive": [
+ "org.antlr:antlr-runtime",
+ "org.antlr:stringtemplate"
+ ]
+ },
+ "aopalliance:aopalliance": {
+ "locked": "1.0",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
"com.amazonaws:aws-java-sdk-core": {
"locked": "1.11.86"
},
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
},
"com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.13.2"
+ "locked": "2.11.4"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.13.2"
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
},
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.11.4"
+ },
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
+ ]
+ },
+ "com.github.andrewoma.dexx:dexx-collections": {
+ "locked": "0.2",
+ "transitive": [
+ "com.github.vlsi.compactmap:compactmap"
+ ]
+ },
+ "com.github.vlsi.compactmap:compactmap": {
+ "locked": "2.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "com.google.code.gson:gson": {
+ "locked": "2.8.7",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
},
"com.google.guava:guava": {
- "locked": "30.0-jre"
+ "locked": "19.0",
+ "transitive": [
+ "com.google.inject:guice",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.netflix-commons:netflix-infix",
+ "com.netflix.servo:servo-core"
+ ]
+ },
+ "com.google.inject:guice": {
+ "locked": "4.1.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.13.0"
+ ]
+ },
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "com.netflix.archaius:archaius-core": {
+ "locked": "0.7.6",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -292,79 +1617,587 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
+ "com.netflix.netflix-commons:netflix-eventbus": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.netflix.netflix-commons:netflix-infix": {
+ "locked": "0.3.0",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
+ "com.netflix.servo:servo-core": {
+ "locked": "0.12.21",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
"com.netflix.spectator:spectator-api": {
"locked": "0.122.0"
},
+ "com.sun.jersey.contribs:jersey-apache-client4": {
+ "locked": "1.19.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4"
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "com.sun.jersey:jersey-core": {
+ "locked": "1.19.4",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-client"
+ ]
+ },
+ "com.thoughtworks.xstream:xstream": {
+ "locked": "1.4.13",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-codec:commons-codec": {
+ "locked": "1.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "commons-configuration:commons-configuration": {
+ "locked": "1.10",
+ "transitive": [
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.eureka:eureka-client"
+ ]
},
"commons-io:commons-io": {
"locked": "2.7"
},
+ "commons-jxpath:commons-jxpath": {
+ "locked": "1.3",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "commons-lang:commons-lang": {
+ "locked": "2.6",
+ "transitive": [
+ "commons-configuration:commons-configuration"
+ ]
+ },
+ "commons-logging:commons-logging": {
+ "locked": "1.2",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "commons-configuration:commons-configuration",
+ "org.apache.httpcomponents:httpclient"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "javax.inject:javax.inject": {
+ "locked": "1",
+ "transitive": [
+ "com.google.inject:guice"
+ ]
+ },
+ "javax.servlet:servlet-api": {
+ "locked": "2.5",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "javax.ws.rs:jsr311-api": {
+ "locked": "1.1.1",
+ "transitive": [
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey:jersey-core"
+ ]
+ },
+ "joda-time:joda-time": {
+ "locked": "2.8.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine",
+ "org.powermock:powermock-module-junit4",
+ "org.powermock:powermock-module-junit4-common"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core",
+ "org.powermock:powermock-core",
+ "org.powermock:powermock-reflect"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core",
+ "org.powermock:powermock-core",
+ "org.powermock:powermock-reflect"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.antlr:antlr-runtime": {
+ "locked": "3.4",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-infix"
+ ]
+ },
+ "org.antlr:stringtemplate": {
+ "locked": "3.2.1",
+ "transitive": [
+ "org.antlr:antlr-runtime"
+ ]
},
"org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
+ "locked": "2.0.5",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.5"
+ ]
},
"org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
+ "locked": "3.10",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.12.0"
+ ]
+ },
+ "org.apache.commons:commons-math": {
+ "locked": "2.2",
+ "transitive": [
+ "com.netflix.netflix-commons:netflix-eventbus"
+ ]
+ },
+ "org.apache.httpcomponents:httpclient": {
+ "locked": "4.5.13",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core",
+ "com.netflix.eureka:eureka-client",
+ "com.sun.jersey.contribs:jersey-apache-client4"
+ ]
+ },
+ "org.apache.httpcomponents:httpcore": {
+ "locked": "4.4.14",
+ "transitive": [
+ "org.apache.httpcomponents:httpclient"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.codehaus.jettison:jettison": {
+ "locked": "1.4.0",
+ "transitive": [
+ "com.netflix.eureka:eureka-client"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.hamcrest:hamcrest-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest-core": {
+ "locked": "2.2",
+ "transitive": [
+ "org.powermock:powermock-module-junit4",
+ "org.powermock:powermock-module-junit4-common"
+ ]
+ },
+ "org.javassist:javassist": {
+ "locked": "3.27.0-GA",
+ "transitive": [
+ "org.powermock:powermock-core"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.mockito:mockito-junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.powermock:powermock-api-mockito2",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "3.0.1",
+ "transitive": [
+ "org.mockito:mockito-core",
+ "org.powermock:powermock-reflect"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
},
"org.powermock:powermock-api-mockito2": {
"locked": "2.0.9"
},
+ "org.powermock:powermock-api-support": {
+ "locked": "2.0.9",
+ "transitive": [
+ "org.powermock:powermock-api-mockito2"
+ ]
+ },
+ "org.powermock:powermock-core": {
+ "locked": "2.0.9",
+ "transitive": [
+ "org.powermock:powermock-api-support",
+ "org.powermock:powermock-module-junit4-common"
+ ]
+ },
"org.powermock:powermock-module-junit4": {
"locked": "2.0.9"
},
+ "org.powermock:powermock-module-junit4-common": {
+ "locked": "2.0.9",
+ "transitive": [
+ "org.powermock:powermock-module-junit4"
+ ]
+ },
+ "org.powermock:powermock-reflect": {
+ "locked": "2.0.9",
+ "transitive": [
+ "org.powermock:powermock-api-support",
+ "org.powermock:powermock-core",
+ "org.powermock:powermock-module-junit4-common"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
"org.slf4j:slf4j-api": {
- "locked": "1.7.36"
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.archaius:archaius-core",
+ "com.netflix.netflix-commons:netflix-eventbus",
+ "com.netflix.netflix-commons:netflix-infix",
+ "com.netflix.servo:servo-core",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "software.amazon.ion:ion-java": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.amazonaws:aws-java-sdk-core"
+ ]
+ },
+ "xmlpull:xmlpull": {
+ "locked": "1.1.3.1",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
+ },
+ "xpp3:xpp3_min": {
+ "locked": "1.1.4c",
+ "transitive": [
+ "com.thoughtworks.xstream:xstream"
+ ]
}
}
}
\ No newline at end of file
diff --git a/client/src/main/java/com/netflix/conductor/client/automator/TaskPollExecutor.java b/client/src/main/java/com/netflix/conductor/client/automator/TaskPollExecutor.java
index e2ae52f70..fdcb1a046 100644
--- a/client/src/main/java/com/netflix/conductor/client/automator/TaskPollExecutor.java
+++ b/client/src/main/java/com/netflix/conductor/client/automator/TaskPollExecutor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -18,11 +18,8 @@
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
+import java.util.function.Function;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
@@ -36,7 +33,6 @@
import com.netflix.conductor.client.worker.Worker;
import com.netflix.conductor.common.metadata.tasks.Task;
import com.netflix.conductor.common.metadata.tasks.TaskResult;
-import com.netflix.conductor.common.utils.RetryUtil;
import com.netflix.discovery.EurekaClient;
import com.netflix.spectator.api.Registry;
import com.netflix.spectator.api.Spectator;
@@ -259,7 +255,7 @@ private void executeTask(Worker worker, Task task) {
worker.getClass().getSimpleName(),
worker.getIdentity(),
result.getStatus());
- updateWithRetry(updateRetryCount, task, result, worker);
+ updateTaskResult(updateRetryCount, task, result, worker);
}
private void finalizeTask(Task task, Throwable throwable) {
@@ -279,44 +275,29 @@ private void finalizeTask(Task task, Throwable throwable) {
}
}
- private void updateWithRetry(int count, Task task, TaskResult result, Worker worker) {
+ private void updateTaskResult(int count, Task task, TaskResult result, Worker worker) {
try {
- String updateTaskDesc =
- String.format(
- "Retry updating task result: %s for task: %s in worker: %s",
- result.toString(), task.getTaskDefName(), worker.getIdentity());
- String evaluatePayloadDesc =
- String.format(
- "Evaluate Task payload for task: %s in worker: %s",
- task.getTaskDefName(), worker.getIdentity());
- String methodName = "updateWithRetry";
-
- TaskResult finalResult =
- new RetryUtil()
- .retryOnException(
- () -> {
- TaskResult taskResult = result.copy();
- taskClient.evaluateAndUploadLargePayload(
- taskResult, task.getTaskType());
- return taskResult;
- },
- null,
- null,
- count,
- evaluatePayloadDesc,
- methodName);
-
- new RetryUtil<>()
- .retryOnException(
- () -> {
- taskClient.updateTask(finalResult);
- return null;
- },
- null,
- null,
+ // upload if necessary
+ Optional optionalExternalStorageLocation =
+ retryOperation(
+ (TaskResult taskResult) -> upload(taskResult, task.getTaskType()),
count,
- updateTaskDesc,
- methodName);
+ result,
+ "evaluateAndUploadLargePayload");
+
+ if (optionalExternalStorageLocation.isPresent()) {
+ result.setExternalOutputPayloadStoragePath(optionalExternalStorageLocation.get());
+ result.setOutputData(null);
+ }
+
+ retryOperation(
+ (TaskResult taskResult) -> {
+ taskClient.updateTask(taskResult);
+ return null;
+ },
+ count,
+ result,
+ "updateTask");
} catch (Exception e) {
worker.onErrorUpdate(task);
MetricsContainer.incrementTaskUpdateErrorCount(worker.getTaskDefName(), e);
@@ -328,6 +309,34 @@ private void updateWithRetry(int count, Task task, TaskResult result, Worker wor
}
}
+ private Optional upload(TaskResult result, String taskType) {
+ try {
+ return taskClient.evaluateAndUploadLargePayload(result.getOutputData(), taskType);
+ } catch (IllegalArgumentException iae) {
+ result.setReasonForIncompletion(iae.getMessage());
+ result.setOutputData(null);
+ result.setStatus(TaskResult.Status.FAILED_WITH_TERMINAL_ERROR);
+ return Optional.empty();
+ }
+ }
+
+ private R retryOperation(Function operation, int count, T input, String opName) {
+ int index = 0;
+ while (index < count) {
+ try {
+ return operation.apply(input);
+ } catch (Exception e) {
+ index++;
+ try {
+ Thread.sleep(500L);
+ } catch (InterruptedException ie) {
+ LOGGER.error("Retry interrupted", ie);
+ }
+ }
+ }
+ throw new RuntimeException("Exhausted retries performing " + opName);
+ }
+
private void handleException(Throwable t, TaskResult result, Worker worker, Task task) {
LOGGER.error(String.format("Error while executing task %s", task.toString()), t);
MetricsContainer.incrementTaskExecutionErrorCount(worker.getTaskDefName(), t);
@@ -338,7 +347,7 @@ private void handleException(Throwable t, TaskResult result, Worker worker, Task
t.printStackTrace(new PrintWriter(stringWriter));
result.log(stringWriter.toString());
- updateWithRetry(updateRetryCount, task, result, worker);
+ updateTaskResult(updateRetryCount, task, result, worker);
}
private PollingSemaphore getPollingSemaphore(String taskType) {
diff --git a/client/src/main/java/com/netflix/conductor/client/automator/TaskRunnerConfigurer.java b/client/src/main/java/com/netflix/conductor/client/automator/TaskRunnerConfigurer.java
index 1b7dbab03..bb3cfa1c4 100644
--- a/client/src/main/java/com/netflix/conductor/client/automator/TaskRunnerConfigurer.java
+++ b/client/src/main/java/com/netflix/conductor/client/automator/TaskRunnerConfigurer.java
@@ -198,17 +198,23 @@ public TaskRunnerConfigurer build() {
}
}
- /** @return Thread Count for the shared executor pool */
+ /**
+ * @return Thread Count for the shared executor pool
+ */
public int getThreadCount() {
return threadCount;
}
- /** @return Thread Count for individual task type */
+ /**
+ * @return Thread Count for individual task type
+ */
public Map getTaskThreadCount() {
return taskThreadCount;
}
- /** @return seconds before forcing shutdown of worker */
+ /**
+ * @return seconds before forcing shutdown of worker
+ */
public int getShutdownGracePeriodSeconds() {
return shutdownGracePeriodSeconds;
}
@@ -229,7 +235,9 @@ public int getUpdateRetryCount() {
return updateRetryCount;
}
- /** @return prefix used for worker names */
+ /**
+ * @return prefix used for worker names
+ */
public String getWorkerNamePrefix() {
return workerNamePrefix;
}
diff --git a/client/src/main/java/com/netflix/conductor/client/http/EventClient.java b/client/src/main/java/com/netflix/conductor/client/http/EventClient.java
index 970b919db..46bf00d55 100644
--- a/client/src/main/java/com/netflix/conductor/client/http/EventClient.java
+++ b/client/src/main/java/com/netflix/conductor/client/http/EventClient.java
@@ -36,7 +36,9 @@ public EventClient() {
this(new DefaultClientConfig(), new DefaultConductorClientConfiguration(), null);
}
- /** @param clientConfig REST Client configuration */
+ /**
+ * @param clientConfig REST Client configuration
+ */
public EventClient(ClientConfig clientConfig) {
this(clientConfig, new DefaultConductorClientConfiguration(), null);
}
diff --git a/client/src/main/java/com/netflix/conductor/client/http/MetadataClient.java b/client/src/main/java/com/netflix/conductor/client/http/MetadataClient.java
index 50f014ea2..f27e84308 100644
--- a/client/src/main/java/com/netflix/conductor/client/http/MetadataClient.java
+++ b/client/src/main/java/com/netflix/conductor/client/http/MetadataClient.java
@@ -34,7 +34,9 @@ public MetadataClient() {
this(new DefaultClientConfig(), new DefaultConductorClientConfiguration(), null);
}
- /** @param clientConfig REST Client configuration */
+ /**
+ * @param clientConfig REST Client configuration
+ */
public MetadataClient(ClientConfig clientConfig) {
this(clientConfig, new DefaultConductorClientConfiguration(), null);
}
diff --git a/client/src/main/java/com/netflix/conductor/client/http/TaskClient.java b/client/src/main/java/com/netflix/conductor/client/http/TaskClient.java
index 54aa0f47e..a21c43454 100644
--- a/client/src/main/java/com/netflix/conductor/client/http/TaskClient.java
+++ b/client/src/main/java/com/netflix/conductor/client/http/TaskClient.java
@@ -14,6 +14,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -69,7 +70,9 @@ public TaskClient() {
this(new DefaultClientConfig(), new DefaultConductorClientConfiguration(), null);
}
- /** @param config REST Client configuration */
+ /**
+ * @param config REST Client configuration
+ */
public TaskClient(ClientConfig config) {
this(config, new DefaultConductorClientConfiguration(), null);
}
@@ -235,14 +238,10 @@ public void updateTask(TaskResult taskResult) {
postForEntityWithRequestOnly("tasks", taskResult);
}
- public void evaluateAndUploadLargePayload(TaskResult taskResult, String taskType) {
- Preconditions.checkNotNull(taskResult, "Task result cannot be null");
- Preconditions.checkArgument(
- StringUtils.isBlank(taskResult.getExternalOutputPayloadStoragePath()),
- "External Storage Path must not be set");
-
+ public Optional evaluateAndUploadLargePayload(
+ Map taskOutputData, String taskType) {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
- objectMapper.writeValue(byteArrayOutputStream, taskResult.getOutputData());
+ objectMapper.writeValue(byteArrayOutputStream, taskOutputData);
byte[] taskOutputBytes = byteArrayOutputStream.toByteArray();
long taskResultSize = taskOutputBytes.length;
MetricsContainer.recordTaskResultPayloadSize(taskType, taskResultSize);
@@ -254,30 +253,22 @@ public void evaluateAndUploadLargePayload(TaskResult taskResult, String taskType
|| taskResultSize
> conductorClientConfiguration.getTaskOutputMaxPayloadThresholdKB()
* 1024L) {
- taskResult.setReasonForIncompletion(
+ throw new IllegalArgumentException(
String.format(
"The TaskResult payload size: %d is greater than the permissible %d bytes",
taskResultSize, payloadSizeThreshold));
- taskResult.setStatus(TaskResult.Status.FAILED_WITH_TERMINAL_ERROR);
- taskResult.setOutputData(null);
- } else {
- MetricsContainer.incrementExternalPayloadUsedCount(
- taskType,
- ExternalPayloadStorage.Operation.WRITE.name(),
- ExternalPayloadStorage.PayloadType.TASK_OUTPUT.name());
- String externalStoragePath =
- uploadToExternalPayloadStorage(
- ExternalPayloadStorage.PayloadType.TASK_OUTPUT,
- taskOutputBytes,
- taskResultSize);
- taskResult.setExternalOutputPayloadStoragePath(externalStoragePath);
- taskResult.setOutputData(null);
}
+ MetricsContainer.incrementExternalPayloadUsedCount(
+ taskType,
+ ExternalPayloadStorage.Operation.WRITE.name(),
+ ExternalPayloadStorage.PayloadType.TASK_OUTPUT.name());
+ return Optional.of(
+ uploadToExternalPayloadStorage(
+ PayloadType.TASK_OUTPUT, taskOutputBytes, taskResultSize));
}
+ return Optional.empty();
} catch (IOException e) {
- String errorMsg =
- String.format(
- "Unable to update task: %s with task result", taskResult.getTaskId());
+ String errorMsg = String.format("Unable to update task: %s with task result", taskType);
LOGGER.error(errorMsg, e);
throw new ConductorClientException(errorMsg, e);
}
@@ -352,13 +343,43 @@ public void removeTaskFromQueue(String taskType, String taskId) {
public int getQueueSizeForTask(String taskType) {
Preconditions.checkArgument(StringUtils.isNotBlank(taskType), "Task type cannot be blank");
- Map taskTypeToQueueSizeMap =
+ Integer queueSize =
getForEntity(
- "tasks/queue/sizes", new Object[] {"taskType", taskType}, queueSizeMap);
- if (taskTypeToQueueSizeMap.containsKey(taskType)) {
- return taskTypeToQueueSizeMap.get(taskType);
+ "tasks/queue/size",
+ new Object[] {"taskType", taskType},
+ new GenericType() {});
+ return queueSize != null ? queueSize : 0;
+ }
+
+ public int getQueueSizeForTask(
+ String taskType, String domain, String isolationGroupId, String executionNamespace) {
+ Preconditions.checkArgument(StringUtils.isNotBlank(taskType), "Task type cannot be blank");
+
+ List params = new LinkedList<>();
+ params.add("taskType");
+ params.add(taskType);
+
+ if (StringUtils.isNotBlank(domain)) {
+ params.add("domain");
+ params.add(domain);
+ }
+
+ if (StringUtils.isNotBlank(isolationGroupId)) {
+ params.add("isolationGroupId");
+ params.add(isolationGroupId);
}
- return 0;
+
+ if (StringUtils.isNotBlank(executionNamespace)) {
+ params.add("executionNamespace");
+ params.add(executionNamespace);
+ }
+
+ Integer queueSize =
+ getForEntity(
+ "tasks/queue/size",
+ params.toArray(new Object[0]),
+ new GenericType() {});
+ return queueSize != null ? queueSize : 0;
}
/**
diff --git a/client/src/main/java/com/netflix/conductor/client/http/WorkflowClient.java b/client/src/main/java/com/netflix/conductor/client/http/WorkflowClient.java
index 3bc445bda..a75129f13 100644
--- a/client/src/main/java/com/netflix/conductor/client/http/WorkflowClient.java
+++ b/client/src/main/java/com/netflix/conductor/client/http/WorkflowClient.java
@@ -54,7 +54,9 @@ public WorkflowClient() {
this(new DefaultClientConfig(), new DefaultConductorClientConfiguration(), null);
}
- /** @param config REST Client configuration */
+ /**
+ * @param config REST Client configuration
+ */
public WorkflowClient(ClientConfig config) {
this(config, new DefaultConductorClientConfiguration(), null);
}
diff --git a/client/src/test/java/com/netflix/conductor/client/automator/TaskPollExecutorTest.java b/client/src/test/java/com/netflix/conductor/client/automator/TaskPollExecutorTest.java
index 54287ca56..19791e385 100644
--- a/client/src/test/java/com/netflix/conductor/client/automator/TaskPollExecutorTest.java
+++ b/client/src/test/java/com/netflix/conductor/client/automator/TaskPollExecutorTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -14,12 +14,9 @@
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import java.util.UUID;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
import org.junit.Test;
import org.mockito.Mockito;
@@ -34,25 +31,19 @@
import com.netflix.conductor.common.metadata.tasks.TaskResult;
import com.netflix.discovery.EurekaClient;
-import com.google.common.util.concurrent.Uninterruptibles;
-
import static com.netflix.conductor.common.metadata.tasks.TaskResult.Status.IN_PROGRESS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
public class TaskPollExecutorTest {
private static final String TEST_TASK_DEF_NAME = "test";
@Test
- public void testTaskExecutionException() {
+ public void testTaskExecutionException() throws InterruptedException {
Worker worker =
Worker.create(
TEST_TASK_DEF_NAME,
@@ -83,13 +74,13 @@ public void testTaskExecutionException() {
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
verify(taskClient).updateTask(any());
}
@SuppressWarnings("rawtypes")
@Test
- public void testMultipleTasksExecution() {
+ public void testMultipleTasksExecution() throws InterruptedException {
String outputKey = "KEY";
Task task = testTask();
Worker worker = mock(Worker.class);
@@ -101,9 +92,10 @@ public void testMultipleTasksExecution() {
private int count = 0;
Map outputMap = new HashMap<>();
- public TaskResult answer(InvocationOnMock invocation) {
+ public TaskResult answer(InvocationOnMock invocation)
+ throws InterruptedException {
// Sleep for 2 seconds to simulate task execution
- Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS);
+ Thread.sleep(2000L);
TaskResult taskResult = new TaskResult(task);
outputMap.put(outputKey, count++);
taskResult.setOutputData(outputMap);
@@ -138,15 +130,16 @@ public TaskResult answer(InvocationOnMock invocation) {
Executors.newSingleThreadScheduledExecutor()
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
// execute() is called 3 times on the worker (once for each task)
verify(worker, times(3)).execute(any());
verify(taskClient, times(3)).updateTask(any());
}
+ @SuppressWarnings("unchecked")
@Test
- public void testLargePayloadCanFailUpdateWithRetry() {
+ public void testLargePayloadCanFailUpdateWithRetry() throws InterruptedException {
Task task = testTask();
Worker worker = mock(Worker.class);
@@ -163,11 +156,11 @@ public void testLargePayloadCanFailUpdateWithRetry() {
Object[] args = invocation.getArguments();
TaskResult result = (TaskResult) args[0];
assertNull(result.getReasonForIncompletion());
- result.setReasonForIncompletion("some_reason");
+ result.setReasonForIncompletion("some_reason_1");
throw new ConductorClientException();
})
.when(taskClient)
- .evaluateAndUploadLargePayload(any(TaskResult.class), any());
+ .evaluateAndUploadLargePayload(any(Map.class), any());
TaskPollExecutor taskPollExecutor =
new TaskPollExecutor(
@@ -184,14 +177,58 @@ public void testLargePayloadCanFailUpdateWithRetry() {
Executors.newSingleThreadScheduledExecutor()
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
// When evaluateAndUploadLargePayload fails indefinitely, task update shouldn't be called.
verify(taskClient, times(0)).updateTask(any());
}
@Test
- public void testTaskPollException() {
+ public void testLargePayloadLocationUpdate() throws InterruptedException {
+ Task task = testTask();
+ String largePayloadLocation = "large_payload_location";
+
+ Worker worker = mock(Worker.class);
+ when(worker.getPollingInterval()).thenReturn(3000);
+ when(worker.getTaskDefName()).thenReturn(TEST_TASK_DEF_NAME);
+ when(worker.execute(any())).thenReturn(new TaskResult(task));
+
+ TaskClient taskClient = Mockito.mock(TaskClient.class);
+ when(taskClient.pollTask(any(), any(), any())).thenReturn(task);
+ when(taskClient.ack(any(), any())).thenReturn(true);
+ //noinspection unchecked
+ when(taskClient.evaluateAndUploadLargePayload(any(Map.class), any()))
+ .thenReturn(Optional.of(largePayloadLocation));
+
+ TaskPollExecutor taskPollExecutor =
+ new TaskPollExecutor(
+ null, taskClient, 1, 3, new HashMap<>(), "test-worker-", new HashMap<>());
+ CountDownLatch latch = new CountDownLatch(1);
+
+ doAnswer(
+ invocation -> {
+ Object[] args = invocation.getArguments();
+ TaskResult result = (TaskResult) args[0];
+ assertNull(result.getOutputData());
+ assertEquals(
+ largePayloadLocation,
+ result.getExternalOutputPayloadStoragePath());
+ latch.countDown();
+ return null;
+ })
+ .when(taskClient)
+ .updateTask(any());
+
+ Executors.newSingleThreadScheduledExecutor()
+ .scheduleAtFixedRate(
+ () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
+ latch.await();
+
+ verify(taskClient, times(1)).updateTask(any());
+ }
+
+ @Test
+ public void testTaskPollException() throws InterruptedException {
Task task = testTask();
Worker worker = mock(Worker.class);
@@ -224,12 +261,12 @@ public void testTaskPollException() {
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
verify(taskClient).updateTask(any());
}
@Test
- public void testTaskPoll() {
+ public void testTaskPoll() throws InterruptedException {
Task task = testTask();
Worker worker = mock(Worker.class);
@@ -260,12 +297,12 @@ public void testTaskPoll() {
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
verify(taskClient).updateTask(any());
}
@Test
- public void testTaskPollDomain() {
+ public void testTaskPollDomain() throws InterruptedException {
TaskClient taskClient = Mockito.mock(TaskClient.class);
String testDomain = "foo";
Map taskToDomain = new HashMap<>();
@@ -292,12 +329,12 @@ public void testTaskPollDomain() {
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
verify(taskClient).pollTask(TEST_TASK_DEF_NAME, workerName, testDomain);
}
@Test
- public void testPollOutOfDiscoveryForTask() {
+ public void testPollOutOfDiscoveryForTask() throws InterruptedException {
Task task = testTask();
EurekaClient client = mock(EurekaClient.class);
@@ -331,7 +368,7 @@ public void testPollOutOfDiscoveryForTask() {
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
verify(taskClient).updateTask(any());
}
@@ -418,7 +455,7 @@ public void testPollOutOfDiscoveryAsExplicitFalseForTask()
}
@Test
- public void testPollOutOfDiscoveryIsIgnoredWhenDiscoveryIsUp() {
+ public void testPollOutOfDiscoveryIsIgnoredWhenDiscoveryIsUp() throws InterruptedException {
Task task = testTask();
EurekaClient client = mock(EurekaClient.class);
@@ -452,12 +489,12 @@ public void testPollOutOfDiscoveryIsIgnoredWhenDiscoveryIsUp() {
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
verify(taskClient).updateTask(any());
}
@Test
- public void testTaskThreadCount() {
+ public void testTaskThreadCount() throws InterruptedException {
TaskClient taskClient = Mockito.mock(TaskClient.class);
Map taskThreadCount = new HashMap<>();
@@ -485,7 +522,7 @@ public void testTaskThreadCount() {
.scheduleAtFixedRate(
() -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS);
- Uninterruptibles.awaitUninterruptibly(latch);
+ latch.await();
verify(taskClient).pollTask(TEST_TASK_DEF_NAME, workerName, null);
}
diff --git a/common/build.gradle b/common/build.gradle
index 47901c620..87d4212ea 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -13,8 +13,6 @@ dependencies {
implementation "org.apache.commons:commons-lang3"
- implementation "com.github.rholder:guava-retrying:${revGuavaRetrying}"
-
implementation "org.apache.bval:bval-jsr:${revBval}"
implementation "com.google.protobuf:protobuf-java:${revProtoBuf}"
@@ -40,7 +38,7 @@ dependencies {
task protogen(dependsOn: jar, type: JavaExec) {
classpath configurations.annotationsProcessorCodegen
- main = 'com.netflix.conductor.annotationsprocessor.protogen.ProtoGenTask'
+ mainClass = "com.netflix.conductor.annotationsprocessor.protogen.ProtoGenTask"
args(
"conductor.proto",
"com.netflix.conductor.proto",
diff --git a/common/dependencies.lock b/common/dependencies.lock
index e9218dbb4..78957aef7 100644
--- a/common/dependencies.lock
+++ b/common/dependencies.lock
@@ -1,94 +1,178 @@
{
"annotationProcessor": {
"org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
}
},
"annotationsProcessorCodegen": {
"com.github.jknack:handlebars": {
- "firstLevelTransitive": [
+ "locked": "4.3.0",
+ "transitive": [
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "4.3.0"
+ ]
+ },
+ "com.google.code.findbugs:jsr305": {
+ "locked": "3.0.2",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.11.0",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.guava:failureaccess": {
+ "locked": "1.0.1",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
},
"com.google.guava:guava": {
- "firstLevelTransitive": [
+ "locked": "31.1-jre",
+ "transitive": [
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "31.1-jre"
+ ]
+ },
+ "com.google.guava:listenablefuture": {
+ "locked": "9999.0-empty-to-avoid-conflict-with-guava",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "com.google.j2objc:j2objc-annotations": {
+ "locked": "1.3",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.20.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "3.20.0"
+ ]
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-annotations-processor": {
"project": true
},
"com.squareup:javapoet": {
- "firstLevelTransitive": [
+ "locked": "1.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "1.13.0"
+ ]
},
"javax.annotation:javax.annotation-api": {
- "firstLevelTransitive": [
+ "locked": "1.3.2",
+ "transitive": [
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "1.3.2"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.13.3",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "2.17.2"
+ "com.netflix.conductor:conductor-annotations-processor",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.13.3",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "2.17.2"
+ "com.netflix.conductor:conductor-annotations-processor",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.13.3",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "2.17.2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.13.3",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "2.17.2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.13.3",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-annotations-processor"
- ],
- "locked": "2.17.2"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.12.0",
+ "transitive": [
+ "com.google.guava:guava"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.github.jknack:handlebars",
+ "org.apache.logging.log4j:log4j-slf4j-impl"
+ ]
}
},
"compileClasspath": {
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "io.swagger.core.v3:swagger-core",
+ "io.swagger.core.v3:swagger-models"
+ ]
+ },
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "org.webjars:webjars-locator-core"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.13.2.2"
- },
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml",
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
+ "io.swagger.core.v3:swagger-core"
+ ]
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.11.4",
+ "transitive": [
+ "io.swagger.core.v3:swagger-core"
+ ]
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.11.4",
+ "transitive": [
+ "io.swagger.core.v3:swagger-core"
+ ]
+ },
+ "com.fasterxml:classmate": {
+ "locked": "1.5.1",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
},
"com.google.protobuf:protobuf-java": {
"locked": "3.13.0"
@@ -96,17 +180,78 @@
"com.netflix.conductor:conductor-annotations": {
"project": true
},
+ "io.github.classgraph:classgraph": {
+ "locked": "4.8.143",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-ui"
+ ]
+ },
+ "io.swagger.core.v3:swagger-annotations": {
+ "locked": "2.2.0",
+ "transitive": [
+ "io.swagger.core.v3:swagger-core"
+ ]
+ },
+ "io.swagger.core.v3:swagger-core": {
+ "locked": "2.2.0",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-common"
+ ]
+ },
+ "io.swagger.core.v3:swagger-models": {
+ "locked": "2.2.0",
+ "transitive": [
+ "io.swagger.core.v3:swagger-core"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.validation:jakarta.validation-api": {
+ "locked": "2.0.2",
+ "transitive": [
+ "io.swagger.core.v3:swagger-core",
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "io.swagger.core.v3:swagger-core"
+ ]
+ },
"org.apache.bval:bval-jsr": {
"locked": "2.0.5"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10",
+ "transitive": [
+ "io.swagger.core.v3:swagger-core"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
"locked": "2.17.1"
@@ -117,25 +262,180 @@
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.glassfish:jakarta.el": {
+ "locked": "3.0.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.hibernate.validator:hibernate-validator": {
+ "locked": "6.1.7.Final",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.jboss.logging:jboss-logging": {
+ "locked": "3.4.2.Final",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "io.swagger.core.v3:swagger-core",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j",
+ "org.webjars:webjars-locator-core"
+ ]
+ },
+ "org.springdoc:springdoc-openapi-common": {
+ "locked": "1.6.8",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-webmvc-core"
+ ]
+ },
"org.springdoc:springdoc-openapi-ui": {
- "locked": "1.6.7"
+ "locked": "1.6.8"
+ },
+ "org.springdoc:springdoc-openapi-webmvc-core": {
+ "locked": "1.6.8",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-ui"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-common",
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-validation": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context",
+ "org.springframework:spring-webmvc"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context",
+ "org.springframework:spring-web",
+ "org.springframework:spring-webmvc"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework:spring-webmvc"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-web",
+ "org.springframework:spring-webmvc"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context",
+ "org.springframework:spring-webmvc"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-web": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-common",
+ "org.springframework:spring-webmvc"
+ ]
+ },
+ "org.springframework:spring-webmvc": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-webmvc-core"
+ ]
+ },
+ "org.webjars:swagger-ui": {
+ "locked": "4.10.3",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-ui"
+ ]
+ },
+ "org.webjars:webjars-locator-core": {
+ "locked": "0.45",
+ "transitive": [
+ "org.springdoc:springdoc-openapi-ui"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml",
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
},
"runtimeClasspath": {
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.13.2.2"
- },
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0"
+ "locked": "2.11.4"
},
"com.google.protobuf:protobuf-java": {
"locked": "3.13.0"
@@ -147,152 +447,842 @@
"locked": "2.0.5"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-slf4j-impl"
+ ]
}
},
"testCompileClasspath": {
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.13.2.2"
+ "locked": "2.11.4"
},
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0"
+ "com.fasterxml:classmate": {
+ "locked": "1.5.1",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
},
"com.google.protobuf:protobuf-java": {
"locked": "3.13.0"
},
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
"com.netflix.conductor:conductor-annotations": {
"project": true
},
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.validation:jakarta.validation-api": {
+ "locked": "2.0.2",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
},
"org.apache.bval:bval-jsr": {
"locked": "2.0.5"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.glassfish:jakarta.el": {
+ "locked": "3.0.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hibernate.validator:hibernate-validator": {
+ "locked": "6.1.7.Final",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.jboss.logging:jboss-logging": {
+ "locked": "3.4.2.Final",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-params"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
},
"org.springframework.boot:spring-boot-starter-validation": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
},
"testRuntimeClasspath": {
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
+ },
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.13.2.2"
+ "locked": "2.11.4"
},
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0"
+ "com.fasterxml:classmate": {
+ "locked": "1.5.1",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
},
"com.google.protobuf:protobuf-java": {
"locked": "3.13.0"
},
+ "com.jayway.jsonpath:json-path": {
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
"com.netflix.conductor:conductor-annotations": {
"project": true
},
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "locked": "1.2.2",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.validation:jakarta.validation-api": {
+ "locked": "2.0.2",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "locked": "2.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
},
"org.apache.bval:bval-jsr": {
"locked": "2.0.5"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.glassfish:jakarta.el": {
+ "locked": "3.0.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hibernate.validator:hibernate-validator": {
+ "locked": "6.1.7.Final",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.jboss.logging:jboss-logging": {
+ "locked": "3.4.2.Final",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.mockito:mockito-junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
},
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
},
"org.springframework.boot:spring-boot-starter-validation": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
}
}
\ No newline at end of file
diff --git a/common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java b/common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java
index 6ec57d9ac..55347529d 100644
--- a/common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java
+++ b/common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java
@@ -22,7 +22,7 @@
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
-import com.google.common.base.Strings;
+import org.apache.commons.lang3.StringUtils;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
@@ -51,7 +51,7 @@ public void initialize(OwnerEmailMandatoryConstraint constraintAnnotation) {}
@Override
public boolean isValid(String ownerEmail, ConstraintValidatorContext context) {
- return !ownerEmailMandatory || !Strings.isNullOrEmpty(ownerEmail);
+ return !ownerEmailMandatory || !StringUtils.isEmpty(ownerEmail);
}
private static boolean ownerEmailMandatory = true;
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java b/common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java
index 268754152..01f229480 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java
@@ -24,52 +24,72 @@ public abstract class Auditable {
private String updatedBy;
- /** @return the ownerApp */
+ /**
+ * @return the ownerApp
+ */
public String getOwnerApp() {
return ownerApp;
}
- /** @param ownerApp the ownerApp to set */
+ /**
+ * @param ownerApp the ownerApp to set
+ */
public void setOwnerApp(String ownerApp) {
this.ownerApp = ownerApp;
}
- /** @return the createTime */
+ /**
+ * @return the createTime
+ */
public Long getCreateTime() {
return createTime;
}
- /** @param createTime the createTime to set */
+ /**
+ * @param createTime the createTime to set
+ */
public void setCreateTime(Long createTime) {
this.createTime = createTime;
}
- /** @return the updateTime */
+ /**
+ * @return the updateTime
+ */
public Long getUpdateTime() {
return updateTime;
}
- /** @param updateTime the updateTime to set */
+ /**
+ * @param updateTime the updateTime to set
+ */
public void setUpdateTime(Long updateTime) {
this.updateTime = updateTime;
}
- /** @return the createdBy */
+ /**
+ * @return the createdBy
+ */
public String getCreatedBy() {
return createdBy;
}
- /** @param createdBy the createdBy to set */
+ /**
+ * @param createdBy the createdBy to set
+ */
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
- /** @return the updatedBy */
+ /**
+ * @return the updatedBy
+ */
public String getUpdatedBy() {
return updatedBy;
}
- /** @param updatedBy the updatedBy to set */
+ /**
+ * @param updatedBy the updatedBy to set
+ */
public void setUpdatedBy(String updatedBy) {
this.updatedBy = updatedBy;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java b/common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java
index 65a740774..d6a2065e6 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java
@@ -63,82 +63,114 @@ public EventExecution(String id, String messageId) {
this.messageId = messageId;
}
- /** @return the id */
+ /**
+ * @return the id
+ */
public String getId() {
return id;
}
- /** @param id the id to set */
+ /**
+ * @param id the id to set
+ */
public void setId(String id) {
this.id = id;
}
- /** @return the messageId */
+ /**
+ * @return the messageId
+ */
public String getMessageId() {
return messageId;
}
- /** @param messageId the messageId to set */
+ /**
+ * @param messageId the messageId to set
+ */
public void setMessageId(String messageId) {
this.messageId = messageId;
}
- /** @return the name */
+ /**
+ * @return the name
+ */
public String getName() {
return name;
}
- /** @param name the name to set */
+ /**
+ * @param name the name to set
+ */
public void setName(String name) {
this.name = name;
}
- /** @return the event */
+ /**
+ * @return the event
+ */
public String getEvent() {
return event;
}
- /** @param event the event to set */
+ /**
+ * @param event the event to set
+ */
public void setEvent(String event) {
this.event = event;
}
- /** @return the created */
+ /**
+ * @return the created
+ */
public long getCreated() {
return created;
}
- /** @param created the created to set */
+ /**
+ * @param created the created to set
+ */
public void setCreated(long created) {
this.created = created;
}
- /** @return the status */
+ /**
+ * @return the status
+ */
public Status getStatus() {
return status;
}
- /** @param status the status to set */
+ /**
+ * @param status the status to set
+ */
public void setStatus(Status status) {
this.status = status;
}
- /** @return the action */
+ /**
+ * @return the action
+ */
public Action.Type getAction() {
return action;
}
- /** @param action the action to set */
+ /**
+ * @param action the action to set
+ */
public void setAction(Action.Type action) {
this.action = action;
}
- /** @return the output */
+ /**
+ * @return the output
+ */
public Map getOutput() {
return output;
}
- /** @param output the output to set */
+ /**
+ * @param output the output to set
+ */
public void setOutput(Map output) {
this.output = output;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java b/common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java
index fe8c9f042..77dda4c1e 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java
@@ -56,62 +56,86 @@ public class EventHandler {
public EventHandler() {}
- /** @return the name MUST be unique within a conductor instance */
+ /**
+ * @return the name MUST be unique within a conductor instance
+ */
public String getName() {
return name;
}
- /** @param name the name to set */
+ /**
+ * @param name the name to set
+ */
public void setName(String name) {
this.name = name;
}
- /** @return the event */
+ /**
+ * @return the event
+ */
public String getEvent() {
return event;
}
- /** @param event the event to set */
+ /**
+ * @param event the event to set
+ */
public void setEvent(String event) {
this.event = event;
}
- /** @return the condition */
+ /**
+ * @return the condition
+ */
public String getCondition() {
return condition;
}
- /** @param condition the condition to set */
+ /**
+ * @param condition the condition to set
+ */
public void setCondition(String condition) {
this.condition = condition;
}
- /** @return the actions */
+ /**
+ * @return the actions
+ */
public List getActions() {
return actions;
}
- /** @param actions the actions to set */
+ /**
+ * @param actions the actions to set
+ */
public void setActions(List actions) {
this.actions = actions;
}
- /** @return the active */
+ /**
+ * @return the active
+ */
public boolean isActive() {
return active;
}
- /** @param active if set to false, the event handler is deactivated */
+ /**
+ * @param active if set to false, the event handler is deactivated
+ */
public void setActive(boolean active) {
this.active = active;
}
- /** @return the evaluator type */
+ /**
+ * @return the evaluator type
+ */
public String getEvaluatorType() {
return evaluatorType;
}
- /** @param evaluatorType the evaluatorType to set */
+ /**
+ * @param evaluatorType the evaluatorType to set
+ */
public void setEvaluatorType(String evaluatorType) {
this.evaluatorType = evaluatorType;
}
@@ -141,42 +165,58 @@ public enum Type {
@ProtoField(id = 5)
private boolean expandInlineJSON;
- /** @return the action */
+ /**
+ * @return the action
+ */
public Type getAction() {
return action;
}
- /** @param action the action to set */
+ /**
+ * @param action the action to set
+ */
public void setAction(Type action) {
this.action = action;
}
- /** @return the start_workflow */
+ /**
+ * @return the start_workflow
+ */
public StartWorkflow getStart_workflow() {
return start_workflow;
}
- /** @param start_workflow the start_workflow to set */
+ /**
+ * @param start_workflow the start_workflow to set
+ */
public void setStart_workflow(StartWorkflow start_workflow) {
this.start_workflow = start_workflow;
}
- /** @return the complete_task */
+ /**
+ * @return the complete_task
+ */
public TaskDetails getComplete_task() {
return complete_task;
}
- /** @param complete_task the complete_task to set */
+ /**
+ * @param complete_task the complete_task to set
+ */
public void setComplete_task(TaskDetails complete_task) {
this.complete_task = complete_task;
}
- /** @return the fail_task */
+ /**
+ * @return the fail_task
+ */
public TaskDetails getFail_task() {
return fail_task;
}
- /** @param fail_task the fail_task to set */
+ /**
+ * @param fail_task the fail_task to set
+ */
public void setFail_task(TaskDetails fail_task) {
this.fail_task = fail_task;
}
@@ -189,7 +229,9 @@ public void setExpandInlineJSON(boolean expandInlineJSON) {
this.expandInlineJSON = expandInlineJSON;
}
- /** @return true if the json strings within the payload should be expanded. */
+ /**
+ * @return true if the json strings within the payload should be expanded.
+ */
public boolean isExpandInlineJSON() {
return expandInlineJSON;
}
@@ -214,32 +256,44 @@ public static class TaskDetails {
@ProtoField(id = 5)
private String taskId;
- /** @return the workflowId */
+ /**
+ * @return the workflowId
+ */
public String getWorkflowId() {
return workflowId;
}
- /** @param workflowId the workflowId to set */
+ /**
+ * @param workflowId the workflowId to set
+ */
public void setWorkflowId(String workflowId) {
this.workflowId = workflowId;
}
- /** @return the taskRefName */
+ /**
+ * @return the taskRefName
+ */
public String getTaskRefName() {
return taskRefName;
}
- /** @param taskRefName the taskRefName to set */
+ /**
+ * @param taskRefName the taskRefName to set
+ */
public void setTaskRefName(String taskRefName) {
this.taskRefName = taskRefName;
}
- /** @return the output */
+ /**
+ * @return the output
+ */
public Map getOutput() {
return output;
}
- /** @param output the output to set */
+ /**
+ * @param output the output to set
+ */
public void setOutput(Map output) {
this.output = output;
}
@@ -252,12 +306,16 @@ public void setOutputMessage(Any outputMessage) {
this.outputMessage = outputMessage;
}
- /** @return the taskId */
+ /**
+ * @return the taskId
+ */
public String getTaskId() {
return taskId;
}
- /** @param taskId the taskId to set */
+ /**
+ * @param taskId the taskId to set
+ */
public void setTaskId(String taskId) {
this.taskId = taskId;
}
@@ -285,42 +343,58 @@ public static class StartWorkflow {
@ProtoField(id = 6)
private Map taskToDomain;
- /** @return the name */
+ /**
+ * @return the name
+ */
public String getName() {
return name;
}
- /** @param name the name to set */
+ /**
+ * @param name the name to set
+ */
public void setName(String name) {
this.name = name;
}
- /** @return the version */
+ /**
+ * @return the version
+ */
public Integer getVersion() {
return version;
}
- /** @param version the version to set */
+ /**
+ * @param version the version to set
+ */
public void setVersion(Integer version) {
this.version = version;
}
- /** @return the correlationId */
+ /**
+ * @return the correlationId
+ */
public String getCorrelationId() {
return correlationId;
}
- /** @param correlationId the correlationId to set */
+ /**
+ * @param correlationId the correlationId to set
+ */
public void setCorrelationId(String correlationId) {
this.correlationId = correlationId;
}
- /** @return the input */
+ /**
+ * @return the input
+ */
public Map getInput() {
return input;
}
- /** @param input the input to set */
+ /**
+ * @param input the input to set
+ */
public void setInput(Map input) {
this.input = input;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java
index 82a6a1af2..f51016340 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java
@@ -216,12 +216,16 @@ public void setTaskType(String taskType) {
this.taskType = taskType;
}
- /** @return Status of the task */
+ /**
+ * @return Status of the task
+ */
public Status getStatus() {
return status;
}
- /** @param status Status of the task */
+ /**
+ * @param status Status of the task
+ */
public void setStatus(Status status) {
this.status = status;
}
@@ -237,107 +241,149 @@ public void setInputData(Map inputData) {
this.inputData = inputData;
}
- /** @return the referenceTaskName */
+ /**
+ * @return the referenceTaskName
+ */
public String getReferenceTaskName() {
return referenceTaskName;
}
- /** @param referenceTaskName the referenceTaskName to set */
+ /**
+ * @param referenceTaskName the referenceTaskName to set
+ */
public void setReferenceTaskName(String referenceTaskName) {
this.referenceTaskName = referenceTaskName;
}
- /** @return the correlationId */
+ /**
+ * @return the correlationId
+ */
public String getCorrelationId() {
return correlationId;
}
- /** @param correlationId the correlationId to set */
+ /**
+ * @param correlationId the correlationId to set
+ */
public void setCorrelationId(String correlationId) {
this.correlationId = correlationId;
}
- /** @return the retryCount */
+ /**
+ * @return the retryCount
+ */
public int getRetryCount() {
return retryCount;
}
- /** @param retryCount the retryCount to set */
+ /**
+ * @param retryCount the retryCount to set
+ */
public void setRetryCount(int retryCount) {
this.retryCount = retryCount;
}
- /** @return the scheduledTime */
+ /**
+ * @return the scheduledTime
+ */
public long getScheduledTime() {
return scheduledTime;
}
- /** @param scheduledTime the scheduledTime to set */
+ /**
+ * @param scheduledTime the scheduledTime to set
+ */
public void setScheduledTime(long scheduledTime) {
this.scheduledTime = scheduledTime;
}
- /** @return the startTime */
+ /**
+ * @return the startTime
+ */
public long getStartTime() {
return startTime;
}
- /** @param startTime the startTime to set */
+ /**
+ * @param startTime the startTime to set
+ */
public void setStartTime(long startTime) {
this.startTime = startTime;
}
- /** @return the endTime */
+ /**
+ * @return the endTime
+ */
public long getEndTime() {
return endTime;
}
- /** @param endTime the endTime to set */
+ /**
+ * @param endTime the endTime to set
+ */
public void setEndTime(long endTime) {
this.endTime = endTime;
}
- /** @return the startDelayInSeconds */
+ /**
+ * @return the startDelayInSeconds
+ */
public int getStartDelayInSeconds() {
return startDelayInSeconds;
}
- /** @param startDelayInSeconds the startDelayInSeconds to set */
+ /**
+ * @param startDelayInSeconds the startDelayInSeconds to set
+ */
public void setStartDelayInSeconds(int startDelayInSeconds) {
this.startDelayInSeconds = startDelayInSeconds;
}
- /** @return the retriedTaskId */
+ /**
+ * @return the retriedTaskId
+ */
public String getRetriedTaskId() {
return retriedTaskId;
}
- /** @param retriedTaskId the retriedTaskId to set */
+ /**
+ * @param retriedTaskId the retriedTaskId to set
+ */
public void setRetriedTaskId(String retriedTaskId) {
this.retriedTaskId = retriedTaskId;
}
- /** @return the seq */
+ /**
+ * @return the seq
+ */
public int getSeq() {
return seq;
}
- /** @param seq the seq to set */
+ /**
+ * @param seq the seq to set
+ */
public void setSeq(int seq) {
this.seq = seq;
}
- /** @return the updateTime */
+ /**
+ * @return the updateTime
+ */
public long getUpdateTime() {
return updateTime;
}
- /** @param updateTime the updateTime to set */
+ /**
+ * @param updateTime the updateTime to set
+ */
public void setUpdateTime(long updateTime) {
this.updateTime = updateTime;
}
- /** @return the queueWaitTime */
+ /**
+ * @return the queueWaitTime
+ */
public long getQueueWaitTime() {
if (this.startTime > 0 && this.scheduledTime > 0) {
if (this.updateTime > 0 && getCallbackAfterSeconds() > 0) {
@@ -352,12 +398,16 @@ public long getQueueWaitTime() {
return 0L;
}
- /** @return True if the task has been retried after failure */
+ /**
+ * @return True if the task has been retried after failure
+ */
public boolean isRetried() {
return retried;
}
- /** @param retried the retried to set */
+ /**
+ * @param retried the retried to set
+ */
public void setRetried(boolean retried) {
this.retried = retried;
}
@@ -370,12 +420,16 @@ public boolean isExecuted() {
return executed;
}
- /** @param executed the executed value to set */
+ /**
+ * @param executed the executed value to set
+ */
public void setExecuted(boolean executed) {
this.executed = executed;
}
- /** @return No. of times task has been polled */
+ /**
+ * @return No. of times task has been polled
+ */
public int getPollCount() {
return pollCount;
}
@@ -396,7 +450,9 @@ public void setCallbackFromWorker(boolean callbackFromWorker) {
this.callbackFromWorker = callbackFromWorker;
}
- /** @return Name of the task definition */
+ /**
+ * @return Name of the task definition
+ */
public String getTaskDefName() {
if (taskDefName == null || "".equals(taskDefName)) {
taskDefName = taskType;
@@ -404,7 +460,9 @@ public String getTaskDefName() {
return taskDefName;
}
- /** @param taskDefName Name of the task definition */
+ /**
+ * @param taskDefName Name of the task definition
+ */
public void setTaskDefName(String taskDefName) {
this.taskDefName = taskDefName;
}
@@ -424,12 +482,16 @@ public void setResponseTimeoutSeconds(long responseTimeoutSeconds) {
this.responseTimeoutSeconds = responseTimeoutSeconds;
}
- /** @return the workflowInstanceId */
+ /**
+ * @return the workflowInstanceId
+ */
public String getWorkflowInstanceId() {
return workflowInstanceId;
}
- /** @param workflowInstanceId the workflowInstanceId to set */
+ /**
+ * @param workflowInstanceId the workflowInstanceId to set
+ */
public void setWorkflowInstanceId(String workflowInstanceId) {
this.workflowInstanceId = workflowInstanceId;
}
@@ -447,52 +509,72 @@ public com.netflix.conductor.common.metadata.tasks.Task setWorkflowType(String w
return this;
}
- /** @return the taskId */
+ /**
+ * @return the taskId
+ */
public String getTaskId() {
return taskId;
}
- /** @param taskId the taskId to set */
+ /**
+ * @param taskId the taskId to set
+ */
public void setTaskId(String taskId) {
this.taskId = taskId;
}
- /** @return the reasonForIncompletion */
+ /**
+ * @return the reasonForIncompletion
+ */
public String getReasonForIncompletion() {
return reasonForIncompletion;
}
- /** @param reasonForIncompletion the reasonForIncompletion to set */
+ /**
+ * @param reasonForIncompletion the reasonForIncompletion to set
+ */
public void setReasonForIncompletion(String reasonForIncompletion) {
this.reasonForIncompletion = StringUtils.substring(reasonForIncompletion, 0, 500);
}
- /** @return the callbackAfterSeconds */
+ /**
+ * @return the callbackAfterSeconds
+ */
public long getCallbackAfterSeconds() {
return callbackAfterSeconds;
}
- /** @param callbackAfterSeconds the callbackAfterSeconds to set */
+ /**
+ * @param callbackAfterSeconds the callbackAfterSeconds to set
+ */
public void setCallbackAfterSeconds(long callbackAfterSeconds) {
this.callbackAfterSeconds = callbackAfterSeconds;
}
- /** @return the workerId */
+ /**
+ * @return the workerId
+ */
public String getWorkerId() {
return workerId;
}
- /** @param workerId the workerId to set */
+ /**
+ * @param workerId the workerId to set
+ */
public void setWorkerId(String workerId) {
this.workerId = workerId;
}
- /** @return the outputData */
+ /**
+ * @return the outputData
+ */
public Map getOutputData() {
return outputData;
}
- /** @param outputData the outputData to set */
+ /**
+ * @param outputData the outputData to set
+ */
public void setOutputData(Map outputData) {
if (outputData == null) {
outputData = new HashMap<>();
@@ -500,22 +582,30 @@ public void setOutputData(Map outputData) {
this.outputData = outputData;
}
- /** @return Workflow Task definition */
+ /**
+ * @return Workflow Task definition
+ */
public WorkflowTask getWorkflowTask() {
return workflowTask;
}
- /** @param workflowTask Task definition */
+ /**
+ * @param workflowTask Task definition
+ */
public void setWorkflowTask(WorkflowTask workflowTask) {
this.workflowTask = workflowTask;
}
- /** @return the domain */
+ /**
+ * @return the domain
+ */
public String getDomain() {
return domain;
}
- /** @param domain the Domain */
+ /**
+ * @param domain the Domain
+ */
public void setDomain(String domain) {
this.domain = domain;
}
@@ -536,7 +626,9 @@ public void setOutputMessage(Any outputMessage) {
this.outputMessage = outputMessage;
}
- /** @return {@link Optional} containing the task definition if available */
+ /**
+ * @return {@link Optional} containing the task definition if available
+ */
public Optional getTaskDefinition() {
return Optional.ofNullable(this.getWorkflowTask()).map(WorkflowTask::getTaskDefinition);
}
@@ -557,7 +649,9 @@ public void setRateLimitFrequencyInSeconds(int rateLimitFrequencyInSeconds) {
this.rateLimitFrequencyInSeconds = rateLimitFrequencyInSeconds;
}
- /** @return the external storage path for the task input payload */
+ /**
+ * @return the external storage path for the task input payload
+ */
public String getExternalInputPayloadStoragePath() {
return externalInputPayloadStoragePath;
}
@@ -570,7 +664,9 @@ public void setExternalInputPayloadStoragePath(String externalInputPayloadStorag
this.externalInputPayloadStoragePath = externalInputPayloadStoragePath;
}
- /** @return the external storage path for the task output payload */
+ /**
+ * @return the external storage path for the task output payload
+ */
public String getExternalOutputPayloadStoragePath() {
return externalOutputPayloadStoragePath;
}
@@ -599,12 +695,16 @@ public void setExecutionNameSpace(String executionNameSpace) {
this.executionNameSpace = executionNameSpace;
}
- /** @return the iteration */
+ /**
+ * @return the iteration
+ */
public int getIteration() {
return iteration;
}
- /** @param iteration iteration */
+ /**
+ * @param iteration iteration
+ */
public void setIteration(int iteration) {
this.iteration = iteration;
}
@@ -618,7 +718,9 @@ public int getWorkflowPriority() {
return workflowPriority;
}
- /** @param workflowPriority Priority defined for workflow */
+ /**
+ * @param workflowPriority Priority defined for workflow
+ */
public void setWorkflowPriority(int workflowPriority) {
this.workflowPriority = workflowPriority;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java
index e36d95774..b518fbb7a 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java
@@ -158,87 +158,121 @@ public TaskDef(
this.responseTimeoutSeconds = responseTimeoutSeconds;
}
- /** @return the name */
+ /**
+ * @return the name
+ */
public String getName() {
return name;
}
- /** @param name the name to set */
+ /**
+ * @param name the name to set
+ */
public void setName(String name) {
this.name = name;
}
- /** @return the description */
+ /**
+ * @return the description
+ */
public String getDescription() {
return description;
}
- /** @param description the description to set */
+ /**
+ * @param description the description to set
+ */
public void setDescription(String description) {
this.description = description;
}
- /** @return the retryCount */
+ /**
+ * @return the retryCount
+ */
public int getRetryCount() {
return retryCount;
}
- /** @param retryCount the retryCount to set */
+ /**
+ * @param retryCount the retryCount to set
+ */
public void setRetryCount(int retryCount) {
this.retryCount = retryCount;
}
- /** @return the timeoutSeconds */
+ /**
+ * @return the timeoutSeconds
+ */
public long getTimeoutSeconds() {
return timeoutSeconds;
}
- /** @param timeoutSeconds the timeoutSeconds to set */
+ /**
+ * @param timeoutSeconds the timeoutSeconds to set
+ */
public void setTimeoutSeconds(long timeoutSeconds) {
this.timeoutSeconds = timeoutSeconds;
}
- /** @return Returns the input keys */
+ /**
+ * @return Returns the input keys
+ */
public List getInputKeys() {
return inputKeys;
}
- /** @param inputKeys Set of keys that the task accepts in the input map */
+ /**
+ * @param inputKeys Set of keys that the task accepts in the input map
+ */
public void setInputKeys(List inputKeys) {
this.inputKeys = inputKeys;
}
- /** @return Returns the output keys for the task when executed */
+ /**
+ * @return Returns the output keys for the task when executed
+ */
public List getOutputKeys() {
return outputKeys;
}
- /** @param outputKeys Sets the output keys */
+ /**
+ * @param outputKeys Sets the output keys
+ */
public void setOutputKeys(List outputKeys) {
this.outputKeys = outputKeys;
}
- /** @return the timeoutPolicy */
+ /**
+ * @return the timeoutPolicy
+ */
public TimeoutPolicy getTimeoutPolicy() {
return timeoutPolicy;
}
- /** @param timeoutPolicy the timeoutPolicy to set */
+ /**
+ * @param timeoutPolicy the timeoutPolicy to set
+ */
public void setTimeoutPolicy(TimeoutPolicy timeoutPolicy) {
this.timeoutPolicy = timeoutPolicy;
}
- /** @return the retryLogic */
+ /**
+ * @return the retryLogic
+ */
public RetryLogic getRetryLogic() {
return retryLogic;
}
- /** @param retryLogic the retryLogic to set */
+ /**
+ * @param retryLogic the retryLogic to set
+ */
public void setRetryLogic(RetryLogic retryLogic) {
this.retryLogic = retryLogic;
}
- /** @return the retryDelaySeconds */
+ /**
+ * @return the retryDelaySeconds
+ */
public int getRetryDelaySeconds() {
return retryDelaySeconds;
}
@@ -258,12 +292,16 @@ public void setResponseTimeoutSeconds(long responseTimeoutSeconds) {
this.responseTimeoutSeconds = responseTimeoutSeconds;
}
- /** @param retryDelaySeconds the retryDelaySeconds to set */
+ /**
+ * @param retryDelaySeconds the retryDelaySeconds to set
+ */
public void setRetryDelaySeconds(int retryDelaySeconds) {
this.retryDelaySeconds = retryDelaySeconds;
}
- /** @return the inputTemplate */
+ /**
+ * @return the inputTemplate
+ */
public Map getInputTemplate() {
return inputTemplate;
}
@@ -309,17 +347,23 @@ public void setConcurrentExecLimit(Integer concurrentExecLimit) {
this.concurrentExecLimit = concurrentExecLimit;
}
- /** @return Limit of number of concurrent task that can be IN_PROGRESS at a given time */
+ /**
+ * @return Limit of number of concurrent task that can be IN_PROGRESS at a given time
+ */
public Integer getConcurrentExecLimit() {
return concurrentExecLimit;
}
- /** @return concurrency limit */
+ /**
+ * @return concurrency limit
+ */
public int concurrencyLimit() {
return concurrentExecLimit == null ? 0 : concurrentExecLimit;
}
- /** @param inputTemplate the inputTemplate to set */
+ /**
+ * @param inputTemplate the inputTemplate to set
+ */
public void setInputTemplate(Map inputTemplate) {
this.inputTemplate = inputTemplate;
}
@@ -340,32 +384,44 @@ public void setExecutionNameSpace(String executionNameSpace) {
this.executionNameSpace = executionNameSpace;
}
- /** @return the email of the owner of this task definition */
+ /**
+ * @return the email of the owner of this task definition
+ */
public String getOwnerEmail() {
return ownerEmail;
}
- /** @param ownerEmail the owner email to set */
+ /**
+ * @param ownerEmail the owner email to set
+ */
public void setOwnerEmail(String ownerEmail) {
this.ownerEmail = ownerEmail;
}
- /** @param pollTimeoutSeconds the poll timeout to set */
+ /**
+ * @param pollTimeoutSeconds the poll timeout to set
+ */
public void setPollTimeoutSeconds(Integer pollTimeoutSeconds) {
this.pollTimeoutSeconds = pollTimeoutSeconds;
}
- /** @return the poll timeout of this task definition */
+ /**
+ * @return the poll timeout of this task definition
+ */
public Integer getPollTimeoutSeconds() {
return pollTimeoutSeconds;
}
- /** @param backoffScaleFactor the backoff rate to set */
+ /**
+ * @param backoffScaleFactor the backoff rate to set
+ */
public void setBackoffScaleFactor(Integer backoffScaleFactor) {
this.backoffScaleFactor = backoffScaleFactor;
}
- /** @return the backoff rate of this task definition */
+ /**
+ * @return the backoff rate of this task definition
+ */
public Integer getBackoffScaleFactor() {
return backoffScaleFactor;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskExecLog.java b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskExecLog.java
index ae9dfb6c9..256e1da6f 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskExecLog.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskExecLog.java
@@ -37,32 +37,44 @@ public TaskExecLog(String log) {
this.createdTime = System.currentTimeMillis();
}
- /** @return Task Exec Log */
+ /**
+ * @return Task Exec Log
+ */
public String getLog() {
return log;
}
- /** @param log The Log */
+ /**
+ * @param log The Log
+ */
public void setLog(String log) {
this.log = log;
}
- /** @return the taskId */
+ /**
+ * @return the taskId
+ */
public String getTaskId() {
return taskId;
}
- /** @param taskId the taskId to set */
+ /**
+ * @param taskId the taskId to set
+ */
public void setTaskId(String taskId) {
this.taskId = taskId;
}
- /** @return the createdTime */
+ /**
+ * @return the createdTime
+ */
public long getCreatedTime() {
return createdTime;
}
- /** @param createdTime the createdTime to set */
+ /**
+ * @param createdTime the createdTime to set
+ */
public void setCreatedTime(long createdTime) {
this.createdTime = createdTime;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskResult.java b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskResult.java
index d44917620..d1628ea61 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskResult.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskResult.java
@@ -100,7 +100,9 @@ public TaskResult(Task task) {
public TaskResult() {}
- /** @return Workflow instance id for which the task result is produced */
+ /**
+ * @return Workflow instance id for which the task result is produced
+ */
public String getWorkflowInstanceId() {
return workflowInstanceId;
}
@@ -155,7 +157,9 @@ public void setWorkerId(String workerId) {
this.workerId = workerId;
}
- /** @return the status */
+ /**
+ * @return the status
+ */
public Status getStatus() {
return status;
}
@@ -177,7 +181,9 @@ public Map getOutputData() {
return outputData;
}
- /** @param outputData output data to be set for the task execution result */
+ /**
+ * @param outputData output data to be set for the task execution result
+ */
public void setOutputData(Map outputData) {
this.outputData = outputData;
}
@@ -202,12 +208,16 @@ public void setOutputMessage(Any outputMessage) {
this.outputMessage = outputMessage;
}
- /** @return Task execution logs */
+ /**
+ * @return Task execution logs
+ */
public List getLogs() {
return logs;
}
- /** @param logs Task execution logs */
+ /**
+ * @param logs Task execution logs
+ */
public void setLogs(List logs) {
this.logs = logs;
}
@@ -221,7 +231,9 @@ public TaskResult log(String log) {
return this;
}
- /** @return the path where the task output is stored in external storage */
+ /**
+ * @return the path where the task output is stored in external storage
+ */
public String getExternalOutputPayloadStoragePath() {
return externalOutputPayloadStoragePath;
}
@@ -299,25 +311,4 @@ public static TaskResult newTaskResult(Status status) {
result.setStatus(status);
return result;
}
-
- /**
- * Copy the given task result object
- *
- * @return a deep copy of the task result object except the externalOutputPayloadStoragePath
- * field
- */
- public TaskResult copy() {
- TaskResult taskResult = new TaskResult();
- taskResult.setWorkflowInstanceId(workflowInstanceId);
- taskResult.setTaskId(taskId);
- taskResult.setReasonForIncompletion(reasonForIncompletion);
- taskResult.setCallbackAfterSeconds(callbackAfterSeconds);
- taskResult.setWorkerId(workerId);
- taskResult.setStatus(status);
- taskResult.setOutputData(outputData);
- taskResult.setOutputMessage(outputMessage);
- taskResult.setLogs(logs);
- taskResult.setSubWorkflowId(subWorkflowId);
- return taskResult;
- }
}
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/SubWorkflowParams.java b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/SubWorkflowParams.java
index 82fae4637..816981b86 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/SubWorkflowParams.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/SubWorkflowParams.java
@@ -23,7 +23,6 @@
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonSetter;
-import com.google.common.base.Preconditions;
@ProtoMessage
public class SubWorkflowParams {
@@ -44,7 +43,9 @@ public class SubWorkflowParams {
@ProtoField(id = 4)
private Object workflowDefinition;
- /** @return the name */
+ /**
+ * @return the name
+ */
public String getName() {
if (workflowDefinition != null) {
return getWorkflowDef().getName();
@@ -53,12 +54,16 @@ public String getName() {
}
}
- /** @param name the name to set */
+ /**
+ * @param name the name to set
+ */
public void setName(String name) {
this.name = name;
}
- /** @return the version */
+ /**
+ * @return the version
+ */
public Integer getVersion() {
if (workflowDefinition != null) {
return getWorkflowDef().getVersion();
@@ -67,41 +72,56 @@ public Integer getVersion() {
}
}
- /** @param version the version to set */
+ /**
+ * @param version the version to set
+ */
public void setVersion(Integer version) {
this.version = version;
}
- /** @return the taskToDomain */
+ /**
+ * @return the taskToDomain
+ */
public Map getTaskToDomain() {
return taskToDomain;
}
- /** @param taskToDomain the taskToDomain to set */
+ /**
+ * @param taskToDomain the taskToDomain to set
+ */
public void setTaskToDomain(Map taskToDomain) {
this.taskToDomain = taskToDomain;
}
- /** @return the workflowDefinition as an Object */
+ /**
+ * @return the workflowDefinition as an Object
+ */
public Object getWorkflowDefinition() {
return workflowDefinition;
}
- /** @return the workflowDefinition as a WorkflowDef */
+ /**
+ * @return the workflowDefinition as a WorkflowDef
+ */
@JsonGetter("workflowDefinition")
public WorkflowDef getWorkflowDef() {
return (WorkflowDef) workflowDefinition;
}
- /** @param workflowDef the workflowDefinition to set */
+ /**
+ * @param workflowDef the workflowDefinition to set
+ */
public void setWorkflowDefinition(Object workflowDef) {
- Preconditions.checkArgument(
- workflowDef == null || workflowDef instanceof WorkflowDef,
- "workflowDefinition must be either null or WorkflowDef");
+ if (!(workflowDef == null || workflowDef instanceof WorkflowDef)) {
+ throw new IllegalArgumentException(
+ "workflowDefinition must be either null or WorkflowDef");
+ }
this.workflowDefinition = workflowDef;
}
- /** @param workflowDef the workflowDefinition to set */
+ /**
+ * @param workflowDef the workflowDefinition to set
+ */
@JsonSetter("workflowDefinition")
public void setWorkflowDef(WorkflowDef workflowDef) {
this.workflowDefinition = workflowDef;
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowDef.java b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowDef.java
index f81a91fb0..c91e27692 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowDef.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowDef.java
@@ -101,72 +101,100 @@ public enum TimeoutPolicy {
@ProtoField(id = 15)
private Map inputTemplate = new HashMap<>();
- /** @return the name */
+ /**
+ * @return the name
+ */
public String getName() {
return name;
}
- /** @param name the name to set */
+ /**
+ * @param name the name to set
+ */
public void setName(String name) {
this.name = name;
}
- /** @return the description */
+ /**
+ * @return the description
+ */
public String getDescription() {
return description;
}
- /** @param description the description to set */
+ /**
+ * @param description the description to set
+ */
public void setDescription(String description) {
this.description = description;
}
- /** @return the tasks */
+ /**
+ * @return the tasks
+ */
public List getTasks() {
return tasks;
}
- /** @param tasks the tasks to set */
+ /**
+ * @param tasks the tasks to set
+ */
public void setTasks(List<@Valid WorkflowTask> tasks) {
this.tasks = tasks;
}
- /** @return the inputParameters */
+ /**
+ * @return the inputParameters
+ */
public List getInputParameters() {
return inputParameters;
}
- /** @param inputParameters the inputParameters to set */
+ /**
+ * @param inputParameters the inputParameters to set
+ */
public void setInputParameters(List inputParameters) {
this.inputParameters = inputParameters;
}
- /** @return the outputParameters */
+ /**
+ * @return the outputParameters
+ */
public Map getOutputParameters() {
return outputParameters;
}
- /** @param outputParameters the outputParameters to set */
+ /**
+ * @param outputParameters the outputParameters to set
+ */
public void setOutputParameters(Map outputParameters) {
this.outputParameters = outputParameters;
}
- /** @return the version */
+ /**
+ * @return the version
+ */
public int getVersion() {
return version;
}
- /** @return the failureWorkflow */
+ /**
+ * @return the failureWorkflow
+ */
public String getFailureWorkflow() {
return failureWorkflow;
}
- /** @param failureWorkflow the failureWorkflow to set */
+ /**
+ * @param failureWorkflow the failureWorkflow to set
+ */
public void setFailureWorkflow(String failureWorkflow) {
this.failureWorkflow = failureWorkflow;
}
- /** @param version the version to set */
+ /**
+ * @param version the version to set
+ */
public void setVersion(int version) {
this.version = version;
}
@@ -190,12 +218,16 @@ public void setRestartable(boolean restartable) {
this.restartable = restartable;
}
- /** @return the schemaVersion */
+ /**
+ * @return the schemaVersion
+ */
public int getSchemaVersion() {
return schemaVersion;
}
- /** @param schemaVersion the schemaVersion to set */
+ /**
+ * @param schemaVersion the schemaVersion to set
+ */
public void setSchemaVersion(int schemaVersion) {
this.schemaVersion = schemaVersion;
}
@@ -217,42 +249,58 @@ public void setWorkflowStatusListenerEnabled(boolean workflowStatusListenerEnabl
this.workflowStatusListenerEnabled = workflowStatusListenerEnabled;
}
- /** @return the email of the owner of this workflow definition */
+ /**
+ * @return the email of the owner of this workflow definition
+ */
public String getOwnerEmail() {
return ownerEmail;
}
- /** @param ownerEmail the owner email to set */
+ /**
+ * @param ownerEmail the owner email to set
+ */
public void setOwnerEmail(String ownerEmail) {
this.ownerEmail = ownerEmail;
}
- /** @return the timeoutPolicy */
+ /**
+ * @return the timeoutPolicy
+ */
public TimeoutPolicy getTimeoutPolicy() {
return timeoutPolicy;
}
- /** @param timeoutPolicy the timeoutPolicy to set */
+ /**
+ * @param timeoutPolicy the timeoutPolicy to set
+ */
public void setTimeoutPolicy(TimeoutPolicy timeoutPolicy) {
this.timeoutPolicy = timeoutPolicy;
}
- /** @return the time after which a workflow is deemed to have timed out */
+ /**
+ * @return the time after which a workflow is deemed to have timed out
+ */
public long getTimeoutSeconds() {
return timeoutSeconds;
}
- /** @param timeoutSeconds the timeout in seconds to set */
+ /**
+ * @param timeoutSeconds the timeout in seconds to set
+ */
public void setTimeoutSeconds(long timeoutSeconds) {
this.timeoutSeconds = timeoutSeconds;
}
- /** @return the global workflow variables */
+ /**
+ * @return the global workflow variables
+ */
public Map getVariables() {
return variables;
}
- /** @param variables the set of global workflow variables to set */
+ /**
+ * @param variables the set of global workflow variables to set
+ */
public void setVariables(Map variables) {
this.variables = variables;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java
index e059853c6..f6cf4fc48 100644
--- a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java
+++ b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java
@@ -145,47 +145,65 @@ public void setTasks(List tasks) {
@ProtoField(id = 28)
private String expression;
- /** @return the name */
+ /**
+ * @return the name
+ */
public String getName() {
return name;
}
- /** @param name the name to set */
+ /**
+ * @param name the name to set
+ */
public void setName(String name) {
this.name = name;
}
- /** @return the taskReferenceName */
+ /**
+ * @return the taskReferenceName
+ */
public String getTaskReferenceName() {
return taskReferenceName;
}
- /** @param taskReferenceName the taskReferenceName to set */
+ /**
+ * @param taskReferenceName the taskReferenceName to set
+ */
public void setTaskReferenceName(String taskReferenceName) {
this.taskReferenceName = taskReferenceName;
}
- /** @return the description */
+ /**
+ * @return the description
+ */
public String getDescription() {
return description;
}
- /** @param description the description to set */
+ /**
+ * @param description the description to set
+ */
public void setDescription(String description) {
this.description = description;
}
- /** @return the inputParameters */
+ /**
+ * @return the inputParameters
+ */
public Map getInputParameters() {
return inputParameters;
}
- /** @param inputParameters the inputParameters to set */
+ /**
+ * @param inputParameters the inputParameters to set
+ */
public void setInputParameters(Map inputParameters) {
this.inputParameters = inputParameters;
}
- /** @return the type */
+ /**
+ * @return the type
+ */
public String getType() {
return type;
}
@@ -194,67 +212,93 @@ public void setWorkflowTaskType(TaskType type) {
this.type = type.name();
}
- /** @param type the type to set */
+ /**
+ * @param type the type to set
+ */
public void setType(@NotEmpty(message = "WorkTask type cannot be null or empty") String type) {
this.type = type;
}
- /** @return the decisionCases */
+ /**
+ * @return the decisionCases
+ */
public Map> getDecisionCases() {
return decisionCases;
}
- /** @param decisionCases the decisionCases to set */
+ /**
+ * @param decisionCases the decisionCases to set
+ */
public void setDecisionCases(Map> decisionCases) {
this.decisionCases = decisionCases;
}
- /** @return the defaultCase */
+ /**
+ * @return the defaultCase
+ */
public List getDefaultCase() {
return defaultCase;
}
- /** @param defaultCase the defaultCase to set */
+ /**
+ * @param defaultCase the defaultCase to set
+ */
public void setDefaultCase(List defaultCase) {
this.defaultCase = defaultCase;
}
- /** @return the forkTasks */
+ /**
+ * @return the forkTasks
+ */
public List> getForkTasks() {
return forkTasks;
}
- /** @param forkTasks the forkTasks to set */
+ /**
+ * @param forkTasks the forkTasks to set
+ */
public void setForkTasks(List> forkTasks) {
this.forkTasks = forkTasks;
}
- /** @return the startDelay in seconds */
+ /**
+ * @return the startDelay in seconds
+ */
public int getStartDelay() {
return startDelay;
}
- /** @param startDelay the startDelay to set */
+ /**
+ * @param startDelay the startDelay to set
+ */
public void setStartDelay(int startDelay) {
this.startDelay = startDelay;
}
- /** @return the retryCount */
+ /**
+ * @return the retryCount
+ */
public Integer getRetryCount() {
return retryCount;
}
- /** @param retryCount the retryCount to set */
+ /**
+ * @param retryCount the retryCount to set
+ */
public void setRetryCount(final Integer retryCount) {
this.retryCount = retryCount;
}
- /** @return the dynamicTaskNameParam */
+ /**
+ * @return the dynamicTaskNameParam
+ */
public String getDynamicTaskNameParam() {
return dynamicTaskNameParam;
}
- /** @param dynamicTaskNameParam the dynamicTaskNameParam to set to be used by DYNAMIC tasks */
+ /**
+ * @param dynamicTaskNameParam the dynamicTaskNameParam to set to be used by DYNAMIC tasks
+ */
public void setDynamicTaskNameParam(String dynamicTaskNameParam) {
this.dynamicTaskNameParam = dynamicTaskNameParam;
}
@@ -336,57 +380,79 @@ public void setScriptExpression(String expression) {
this.scriptExpression = expression;
}
- /** @return the subWorkflow */
+ /**
+ * @return the subWorkflow
+ */
public SubWorkflowParams getSubWorkflowParam() {
return subWorkflowParam;
}
- /** @param subWorkflow the subWorkflowParam to set */
+ /**
+ * @param subWorkflow the subWorkflowParam to set
+ */
public void setSubWorkflowParam(SubWorkflowParams subWorkflow) {
this.subWorkflowParam = subWorkflow;
}
- /** @return the joinOn */
+ /**
+ * @return the joinOn
+ */
public List getJoinOn() {
return joinOn;
}
- /** @param joinOn the joinOn to set */
+ /**
+ * @param joinOn the joinOn to set
+ */
public void setJoinOn(List joinOn) {
this.joinOn = joinOn;
}
- /** @return the loopCondition */
+ /**
+ * @return the loopCondition
+ */
public String getLoopCondition() {
return loopCondition;
}
- /** @param loopCondition the expression to set */
+ /**
+ * @param loopCondition the expression to set
+ */
public void setLoopCondition(String loopCondition) {
this.loopCondition = loopCondition;
}
- /** @return the loopOver */
+ /**
+ * @return the loopOver
+ */
public List getLoopOver() {
return loopOver;
}
- /** @param loopOver the loopOver to set */
+ /**
+ * @param loopOver the loopOver to set
+ */
public void setLoopOver(List loopOver) {
this.loopOver = loopOver;
}
- /** @return Sink value for the EVENT type of task */
+ /**
+ * @return Sink value for the EVENT type of task
+ */
public String getSink() {
return sink;
}
- /** @param sink Name of the sink */
+ /**
+ * @param sink Name of the sink
+ */
public void setSink(String sink) {
this.sink = sink;
}
- /** @return whether wait for an external event to complete the task, for EVENT and HTTP tasks */
+ /**
+ * @return whether wait for an external event to complete the task, for EVENT and HTTP tasks
+ */
public Boolean isAsyncComplete() {
return asyncComplete;
}
@@ -403,17 +469,23 @@ public boolean isOptional() {
return optional;
}
- /** @return Task definition associated to the Workflow Task */
+ /**
+ * @return Task definition associated to the Workflow Task
+ */
public TaskDef getTaskDefinition() {
return taskDefinition;
}
- /** @param taskDefinition Task definition */
+ /**
+ * @param taskDefinition Task definition
+ */
public void setTaskDefinition(TaskDef taskDefinition) {
this.taskDefinition = taskDefinition;
}
- /** @param optional when set to true, the task is marked as optional */
+ /**
+ * @param optional when set to true, the task is marked as optional
+ */
public void setOptional(boolean optional) {
this.optional = optional;
}
@@ -438,12 +510,16 @@ public void setDefaultExclusiveJoinTask(List defaultExclusiveJoinTask) {
this.defaultExclusiveJoinTask = defaultExclusiveJoinTask;
}
- /** @return the evaluatorType */
+ /**
+ * @return the evaluatorType
+ */
public String getEvaluatorType() {
return evaluatorType;
}
- /** @param evaluatorType the evaluatorType to set */
+ /**
+ * @param evaluatorType the evaluatorType to set
+ */
public void setEvaluatorType(String evaluatorType) {
this.evaluatorType = evaluatorType;
}
@@ -457,7 +533,9 @@ public String getExpression() {
return expression;
}
- /** @param expression the expression to set */
+ /**
+ * @param expression the expression to set
+ */
public void setExpression(String expression) {
this.expression = expression;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/run/SearchResult.java b/common/src/main/java/com/netflix/conductor/common/run/SearchResult.java
index d77249f80..72be415a9 100644
--- a/common/src/main/java/com/netflix/conductor/common/run/SearchResult.java
+++ b/common/src/main/java/com/netflix/conductor/common/run/SearchResult.java
@@ -28,22 +28,30 @@ public SearchResult(long totalHits, List results) {
this.results = results;
}
- /** @return the totalHits */
+ /**
+ * @return the totalHits
+ */
public long getTotalHits() {
return totalHits;
}
- /** @return the results */
+ /**
+ * @return the results
+ */
public List getResults() {
return results;
}
- /** @param totalHits the totalHits to set */
+ /**
+ * @param totalHits the totalHits to set
+ */
public void setTotalHits(long totalHits) {
this.totalHits = totalHits;
}
- /** @param results the results to set */
+ /**
+ * @param results the results to set
+ */
public void setResults(List results) {
this.results = results;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/run/TaskSummary.java b/common/src/main/java/com/netflix/conductor/common/run/TaskSummary.java
index f8322f62f..9823f8b85 100644
--- a/common/src/main/java/com/netflix/conductor/common/run/TaskSummary.java
+++ b/common/src/main/java/com/netflix/conductor/common/run/TaskSummary.java
@@ -129,167 +129,233 @@ public TaskSummary(Task task) {
}
}
- /** @return the workflowId */
+ /**
+ * @return the workflowId
+ */
public String getWorkflowId() {
return workflowId;
}
- /** @param workflowId the workflowId to set */
+ /**
+ * @param workflowId the workflowId to set
+ */
public void setWorkflowId(String workflowId) {
this.workflowId = workflowId;
}
- /** @return the workflowType */
+ /**
+ * @return the workflowType
+ */
public String getWorkflowType() {
return workflowType;
}
- /** @param workflowType the workflowType to set */
+ /**
+ * @param workflowType the workflowType to set
+ */
public void setWorkflowType(String workflowType) {
this.workflowType = workflowType;
}
- /** @return the correlationId */
+ /**
+ * @return the correlationId
+ */
public String getCorrelationId() {
return correlationId;
}
- /** @param correlationId the correlationId to set */
+ /**
+ * @param correlationId the correlationId to set
+ */
public void setCorrelationId(String correlationId) {
this.correlationId = correlationId;
}
- /** @return the scheduledTime */
+ /**
+ * @return the scheduledTime
+ */
public String getScheduledTime() {
return scheduledTime;
}
- /** @param scheduledTime the scheduledTime to set */
+ /**
+ * @param scheduledTime the scheduledTime to set
+ */
public void setScheduledTime(String scheduledTime) {
this.scheduledTime = scheduledTime;
}
- /** @return the startTime */
+ /**
+ * @return the startTime
+ */
public String getStartTime() {
return startTime;
}
- /** @param startTime the startTime to set */
+ /**
+ * @param startTime the startTime to set
+ */
public void setStartTime(String startTime) {
this.startTime = startTime;
}
- /** @return the updateTime */
+ /**
+ * @return the updateTime
+ */
public String getUpdateTime() {
return updateTime;
}
- /** @param updateTime the updateTime to set */
+ /**
+ * @param updateTime the updateTime to set
+ */
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
- /** @return the endTime */
+ /**
+ * @return the endTime
+ */
public String getEndTime() {
return endTime;
}
- /** @param endTime the endTime to set */
+ /**
+ * @param endTime the endTime to set
+ */
public void setEndTime(String endTime) {
this.endTime = endTime;
}
- /** @return the status */
+ /**
+ * @return the status
+ */
public Status getStatus() {
return status;
}
- /** @param status the status to set */
+ /**
+ * @param status the status to set
+ */
public void setStatus(Status status) {
this.status = status;
}
- /** @return the reasonForIncompletion */
+ /**
+ * @return the reasonForIncompletion
+ */
public String getReasonForIncompletion() {
return reasonForIncompletion;
}
- /** @param reasonForIncompletion the reasonForIncompletion to set */
+ /**
+ * @param reasonForIncompletion the reasonForIncompletion to set
+ */
public void setReasonForIncompletion(String reasonForIncompletion) {
this.reasonForIncompletion = reasonForIncompletion;
}
- /** @return the executionTime */
+ /**
+ * @return the executionTime
+ */
public long getExecutionTime() {
return executionTime;
}
- /** @param executionTime the executionTime to set */
+ /**
+ * @param executionTime the executionTime to set
+ */
public void setExecutionTime(long executionTime) {
this.executionTime = executionTime;
}
- /** @return the queueWaitTime */
+ /**
+ * @return the queueWaitTime
+ */
public long getQueueWaitTime() {
return queueWaitTime;
}
- /** @param queueWaitTime the queueWaitTime to set */
+ /**
+ * @param queueWaitTime the queueWaitTime to set
+ */
public void setQueueWaitTime(long queueWaitTime) {
this.queueWaitTime = queueWaitTime;
}
- /** @return the taskDefName */
+ /**
+ * @return the taskDefName
+ */
public String getTaskDefName() {
return taskDefName;
}
- /** @param taskDefName the taskDefName to set */
+ /**
+ * @param taskDefName the taskDefName to set
+ */
public void setTaskDefName(String taskDefName) {
this.taskDefName = taskDefName;
}
- /** @return the taskType */
+ /**
+ * @return the taskType
+ */
public String getTaskType() {
return taskType;
}
- /** @param taskType the taskType to set */
+ /**
+ * @param taskType the taskType to set
+ */
public void setTaskType(String taskType) {
this.taskType = taskType;
}
- /** @return input to the task */
+ /**
+ * @return input to the task
+ */
public String getInput() {
return input;
}
- /** @param input input to the task */
+ /**
+ * @param input input to the task
+ */
public void setInput(String input) {
this.input = input;
}
- /** @return output of the task */
+ /**
+ * @return output of the task
+ */
public String getOutput() {
return output;
}
- /** @param output Task output */
+ /**
+ * @param output Task output
+ */
public void setOutput(String output) {
this.output = output;
}
- /** @return the taskId */
+ /**
+ * @return the taskId
+ */
public String getTaskId() {
return taskId;
}
- /** @param taskId the taskId to set */
+ /**
+ * @param taskId the taskId to set
+ */
public void setTaskId(String taskId) {
this.taskId = taskId;
}
- /** @return the external storage path for the task input payload */
+ /**
+ * @return the external storage path for the task input payload
+ */
public String getExternalInputPayloadStoragePath() {
return externalInputPayloadStoragePath;
}
@@ -302,7 +368,9 @@ public void setExternalInputPayloadStoragePath(String externalInputPayloadStorag
this.externalInputPayloadStoragePath = externalInputPayloadStoragePath;
}
- /** @return the external storage path for the task output payload */
+ /**
+ * @return the external storage path for the task output payload
+ */
public String getExternalOutputPayloadStoragePath() {
return externalOutputPayloadStoragePath;
}
@@ -315,12 +383,16 @@ public void setExternalOutputPayloadStoragePath(String externalOutputPayloadStor
this.externalOutputPayloadStoragePath = externalOutputPayloadStoragePath;
}
- /** @return the priority defined on workflow */
+ /**
+ * @return the priority defined on workflow
+ */
public int getWorkflowPriority() {
return workflowPriority;
}
- /** @param workflowPriority Priority defined for workflow */
+ /**
+ * @param workflowPriority Priority defined for workflow
+ */
public void setWorkflowPriority(int workflowPriority) {
this.workflowPriority = workflowPriority;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/run/Workflow.java b/common/src/main/java/com/netflix/conductor/common/run/Workflow.java
index 946ab90ed..0afc4d947 100644
--- a/common/src/main/java/com/netflix/conductor/common/run/Workflow.java
+++ b/common/src/main/java/com/netflix/conductor/common/run/Workflow.java
@@ -12,13 +12,7 @@
*/
package com.netflix.conductor.common.run;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
import java.util.stream.Collectors;
import javax.validation.constraints.Max;
@@ -33,8 +27,6 @@
import com.netflix.conductor.common.metadata.tasks.Task;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
-import com.google.common.base.Preconditions;
-
@ProtoMessage
public class Workflow extends Auditable {
@@ -133,62 +125,86 @@ public boolean isSuccessful() {
public Workflow() {}
- /** @return the status */
+ /**
+ * @return the status
+ */
public WorkflowStatus getStatus() {
return status;
}
- /** @param status the status to set */
+ /**
+ * @param status the status to set
+ */
public void setStatus(WorkflowStatus status) {
this.status = status;
}
- /** @return the startTime */
+ /**
+ * @return the startTime
+ */
public long getStartTime() {
return getCreateTime();
}
- /** @param startTime the startTime to set */
+ /**
+ * @param startTime the startTime to set
+ */
public void setStartTime(long startTime) {
this.setCreateTime(startTime);
}
- /** @return the endTime */
+ /**
+ * @return the endTime
+ */
public long getEndTime() {
return endTime;
}
- /** @param endTime the endTime to set */
+ /**
+ * @param endTime the endTime to set
+ */
public void setEndTime(long endTime) {
this.endTime = endTime;
}
- /** @return the workflowId */
+ /**
+ * @return the workflowId
+ */
public String getWorkflowId() {
return workflowId;
}
- /** @param workflowId the workflowId to set */
+ /**
+ * @param workflowId the workflowId to set
+ */
public void setWorkflowId(String workflowId) {
this.workflowId = workflowId;
}
- /** @return the tasks which are scheduled, in progress or completed. */
+ /**
+ * @return the tasks which are scheduled, in progress or completed.
+ */
public List getTasks() {
return tasks;
}
- /** @param tasks the tasks to set */
+ /**
+ * @param tasks the tasks to set
+ */
public void setTasks(List tasks) {
this.tasks = tasks;
}
- /** @return the input */
+ /**
+ * @return the input
+ */
public Map getInput() {
return input;
}
- /** @param input the input to set */
+ /**
+ * @param input the input to set
+ */
public void setInput(Map input) {
if (input == null) {
input = new HashMap<>();
@@ -196,22 +212,30 @@ public void setInput(Map input) {
this.input = input;
}
- /** @return the task to domain map */
+ /**
+ * @return the task to domain map
+ */
public Map getTaskToDomain() {
return taskToDomain;
}
- /** @param taskToDomain the task to domain map */
+ /**
+ * @param taskToDomain the task to domain map
+ */
public void setTaskToDomain(Map taskToDomain) {
this.taskToDomain = taskToDomain;
}
- /** @return the output */
+ /**
+ * @return the output
+ */
public Map getOutput() {
return output;
}
- /** @param output the output to set */
+ /**
+ * @param output the output to set
+ */
public void setOutput(Map output) {
if (output == null) {
output = new HashMap<>();
@@ -219,12 +243,16 @@ public void setOutput(Map output) {
this.output = output;
}
- /** @return The correlation id used when starting the workflow */
+ /**
+ * @return The correlation id used when starting the workflow
+ */
public String getCorrelationId() {
return correlationId;
}
- /** @param correlationId the correlation id */
+ /**
+ * @param correlationId the correlation id
+ */
public void setCorrelationId(String correlationId) {
this.correlationId = correlationId;
}
@@ -245,32 +273,44 @@ public void setReasonForIncompletion(String reasonForIncompletion) {
this.reasonForIncompletion = reasonForIncompletion;
}
- /** @return the parentWorkflowId */
+ /**
+ * @return the parentWorkflowId
+ */
public String getParentWorkflowId() {
return parentWorkflowId;
}
- /** @param parentWorkflowId the parentWorkflowId to set */
+ /**
+ * @param parentWorkflowId the parentWorkflowId to set
+ */
public void setParentWorkflowId(String parentWorkflowId) {
this.parentWorkflowId = parentWorkflowId;
}
- /** @return the parentWorkflowTaskId */
+ /**
+ * @return the parentWorkflowTaskId
+ */
public String getParentWorkflowTaskId() {
return parentWorkflowTaskId;
}
- /** @param parentWorkflowTaskId the parentWorkflowTaskId to set */
+ /**
+ * @param parentWorkflowTaskId the parentWorkflowTaskId to set
+ */
public void setParentWorkflowTaskId(String parentWorkflowTaskId) {
this.parentWorkflowTaskId = parentWorkflowTaskId;
}
- /** @return Name of the event that started the workflow */
+ /**
+ * @return Name of the event that started the workflow
+ */
public String getEvent() {
return event;
}
- /** @param event Name of the event that started the workflow */
+ /**
+ * @param event Name of the event that started the workflow
+ */
public void setEvent(String event) {
this.event = event;
}
@@ -291,7 +331,9 @@ public void setWorkflowDefinition(WorkflowDef workflowDefinition) {
this.workflowDefinition = workflowDefinition;
}
- /** @return the external storage path of the workflow input payload */
+ /**
+ * @return the external storage path of the workflow input payload
+ */
public String getExternalInputPayloadStoragePath() {
return externalInputPayloadStoragePath;
}
@@ -304,17 +346,23 @@ public void setExternalInputPayloadStoragePath(String externalInputPayloadStorag
this.externalInputPayloadStoragePath = externalInputPayloadStoragePath;
}
- /** @return the external storage path of the workflow output payload */
+ /**
+ * @return the external storage path of the workflow output payload
+ */
public String getExternalOutputPayloadStoragePath() {
return externalOutputPayloadStoragePath;
}
- /** @return the priority to define on tasks */
+ /**
+ * @return the priority to define on tasks
+ */
public int getPriority() {
return priority;
}
- /** @param priority priority of tasks (between 0 and 99) */
+ /**
+ * @param priority priority of tasks (between 0 and 99)
+ */
public void setPriority(int priority) {
if (priority < 0 || priority > 99) {
throw new IllegalArgumentException("priority MUST be between 0 and 99 (inclusive)");
@@ -328,7 +376,9 @@ public void setPriority(int priority) {
* @return the workflow definition name.
*/
public String getWorkflowName() {
- Preconditions.checkNotNull(workflowDefinition, "Workflow definition is null");
+ if (workflowDefinition == null) {
+ throw new NullPointerException("Workflow definition is null");
+ }
return workflowDefinition.getName();
}
@@ -338,7 +388,9 @@ public String getWorkflowName() {
* @return the workflow definition version.
*/
public int getWorkflowVersion() {
- Preconditions.checkNotNull(workflowDefinition, "Workflow definition is null");
+ if (workflowDefinition == null) {
+ throw new NullPointerException("Workflow definition is null");
+ }
return workflowDefinition.getVersion();
}
@@ -350,12 +402,16 @@ public void setExternalOutputPayloadStoragePath(String externalOutputPayloadStor
this.externalOutputPayloadStoragePath = externalOutputPayloadStoragePath;
}
- /** @return the global workflow variables */
+ /**
+ * @return the global workflow variables
+ */
public Map getVariables() {
return variables;
}
- /** @param variables the set of global workflow variables to set */
+ /**
+ * @param variables the set of global workflow variables to set
+ */
public void setVariables(Map variables) {
this.variables = variables;
}
@@ -369,7 +425,9 @@ public long getLastRetriedTime() {
return lastRetriedTime;
}
- /** @param lastRetriedTime time in milliseconds when the workflow is retried */
+ /**
+ * @param lastRetriedTime time in milliseconds when the workflow is retried
+ */
public void setLastRetriedTime(long lastRetriedTime) {
this.lastRetriedTime = lastRetriedTime;
}
@@ -403,7 +461,9 @@ public Task getTaskByRefName(String refName) {
return found.getLast();
}
- /** @return a deep copy of the workflow instance */
+ /**
+ * @return a deep copy of the workflow instance
+ */
public Workflow copy() {
Workflow copy = new Workflow();
copy.setInput(input);
diff --git a/common/src/main/java/com/netflix/conductor/common/run/WorkflowSummary.java b/common/src/main/java/com/netflix/conductor/common/run/WorkflowSummary.java
index 333cf29df..3c6536bae 100644
--- a/common/src/main/java/com/netflix/conductor/common/run/WorkflowSummary.java
+++ b/common/src/main/java/com/netflix/conductor/common/run/WorkflowSummary.java
@@ -126,42 +126,58 @@ public WorkflowSummary(Workflow workflow) {
}
}
- /** @return the workflowType */
+ /**
+ * @return the workflowType
+ */
public String getWorkflowType() {
return workflowType;
}
- /** @return the version */
+ /**
+ * @return the version
+ */
public int getVersion() {
return version;
}
- /** @return the workflowId */
+ /**
+ * @return the workflowId
+ */
public String getWorkflowId() {
return workflowId;
}
- /** @return the correlationId */
+ /**
+ * @return the correlationId
+ */
public String getCorrelationId() {
return correlationId;
}
- /** @return the startTime */
+ /**
+ * @return the startTime
+ */
public String getStartTime() {
return startTime;
}
- /** @return the endTime */
+ /**
+ * @return the endTime
+ */
public String getEndTime() {
return endTime;
}
- /** @return the status */
+ /**
+ * @return the status
+ */
public WorkflowStatus getStatus() {
return status;
}
- /** @return the input */
+ /**
+ * @return the input
+ */
public String getInput() {
return input;
}
@@ -170,7 +186,9 @@ public long getInputSize() {
return input != null ? input.length() : 0;
}
- /** @return the output */
+ /**
+ * @return the output
+ */
public String getOutput() {
return output;
}
@@ -179,27 +197,37 @@ public long getOutputSize() {
return output != null ? output.length() : 0;
}
- /** @return the reasonForIncompletion */
+ /**
+ * @return the reasonForIncompletion
+ */
public String getReasonForIncompletion() {
return reasonForIncompletion;
}
- /** @return the executionTime */
+ /**
+ * @return the executionTime
+ */
public long getExecutionTime() {
return executionTime;
}
- /** @return the updateTime */
+ /**
+ * @return the updateTime
+ */
public String getUpdateTime() {
return updateTime;
}
- /** @return The event */
+ /**
+ * @return The event
+ */
public String getEvent() {
return event;
}
- /** @param event The event */
+ /**
+ * @param event The event
+ */
public void setEvent(String event) {
this.event = event;
}
@@ -260,7 +288,9 @@ public void setExecutionTime(long executionTime) {
this.executionTime = executionTime;
}
- /** @return the external storage path of the workflow input payload */
+ /**
+ * @return the external storage path of the workflow input payload
+ */
public String getExternalInputPayloadStoragePath() {
return externalInputPayloadStoragePath;
}
@@ -273,7 +303,9 @@ public void setExternalInputPayloadStoragePath(String externalInputPayloadStorag
this.externalInputPayloadStoragePath = externalInputPayloadStoragePath;
}
- /** @return the external storage path of the workflow output payload */
+ /**
+ * @return the external storage path of the workflow output payload
+ */
public String getExternalOutputPayloadStoragePath() {
return externalOutputPayloadStoragePath;
}
@@ -286,12 +318,16 @@ public void setExternalOutputPayloadStoragePath(String externalOutputPayloadStor
this.externalOutputPayloadStoragePath = externalOutputPayloadStoragePath;
}
- /** @return the priority to define on tasks */
+ /**
+ * @return the priority to define on tasks
+ */
public int getPriority() {
return priority;
}
- /** @param priority priority of tasks (between 0 and 99) */
+ /**
+ * @param priority priority of tasks (between 0 and 99)
+ */
public void setPriority(int priority) {
this.priority = priority;
}
diff --git a/common/src/main/java/com/netflix/conductor/common/utils/RetryUtil.java b/common/src/main/java/com/netflix/conductor/common/utils/RetryUtil.java
deleted file mode 100644
index 49672c838..000000000
--- a/common/src/main/java/com/netflix/conductor/common/utils/RetryUtil.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.common.utils;
-
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Supplier;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.github.rholder.retry.Attempt;
-import com.github.rholder.retry.BlockStrategies;
-import com.github.rholder.retry.RetryException;
-import com.github.rholder.retry.RetryListener;
-import com.github.rholder.retry.Retryer;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.github.rholder.retry.WaitStrategies;
-import com.google.common.base.Predicate;
-
-import static java.lang.String.format;
-
-/**
- * Utility class that deals with retries in case of transient failures.
- *
- *
Note: Create a new {@link RetryUtil} for every operation that needs to retried for the
- * stated retries.
- *
- *
Limitations:
- *
- *
- * The current implementation does not make a distinction between transient and non transient
- * errors. There is no categorization of transient and non transient failure in Conductor.
- * Once the exception hierarchy is available in Conductor, this class implementation can be
- * changed to short circuit the non transient errors.
- * Currently only couple of wait strategies are implemented {@link
- * WaitStrategies#exponentialWait()} and {@link WaitStrategies#randomWait(long, TimeUnit)}
- * with fixed attributes for each of the strategies.
- * The retry limit is not configurable and is hard coded to 3
- *
- *
- * @param The type of the object that will be returned by the flaky supplier function
- */
-@SuppressWarnings("UnstableApiUsage")
-public class RetryUtil {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(RetryUtil.class);
-
- private final AtomicInteger internalNumberOfRetries = new AtomicInteger();
-
- /**
- * A helper method which has the ability to execute a flaky supplier function and retry in case
- * of failures.
- *
- * @param supplierCommand: Any function that is flaky and needs multiple retries.
- * @param throwablePredicate: A Guava {@link Predicate} housing the exceptional criteria to
- * perform informed filtering before retrying.
- * @param resultRetryPredicate: a predicate to be evaluated for a valid condition of the
- * expected result
- * @param retryCount: Number of times the function is to be retried before failure
- * @param shortDescription: A short description of the function that will be used in logging and
- * error propagation. The intention of this description is to provide context for
- * Operability.
- * @param operationName: The name of the function for traceability in logs
- * @return an instance of return type of the supplierCommand
- * @throws RuntimeException in case of failed attempts to get T, which needs to be returned by
- * the supplierCommand. The instance of the returned exception has:
- *
- * A message with shortDescription and operationName with the number of retries made
- * And a reference to the original exception generated during the last {@link Attempt}
- * of the retry
- *
- */
- @SuppressWarnings("Guava")
- public T retryOnException(
- Supplier supplierCommand,
- Predicate throwablePredicate,
- Predicate resultRetryPredicate,
- int retryCount,
- String shortDescription,
- String operationName)
- throws RuntimeException {
-
- Retryer retryer =
- RetryerBuilder.newBuilder()
- .retryIfException(
- Optional.ofNullable(throwablePredicate).orElse(exception -> true))
- .retryIfResult(
- Optional.ofNullable(resultRetryPredicate).orElse(result -> false))
- .withWaitStrategy(
- WaitStrategies.join(
- WaitStrategies.exponentialWait(1000, 90, TimeUnit.SECONDS),
- WaitStrategies.randomWait(
- 100,
- TimeUnit.MILLISECONDS,
- 500,
- TimeUnit.MILLISECONDS)))
- .withStopStrategy(StopStrategies.stopAfterAttempt(retryCount))
- .withBlockStrategy(BlockStrategies.threadSleepStrategy())
- .withRetryListener(
- new RetryListener() {
- @Override
- public void onRetry(Attempt attempt) {
- LOGGER.debug(
- "Attempt # {}, {} millis since first attempt. Operation: {}, description:{}",
- attempt.getAttemptNumber(),
- attempt.getDelaySinceFirstAttempt(),
- operationName,
- shortDescription);
- internalNumberOfRetries.incrementAndGet();
- }
- })
- .build();
-
- try {
- return retryer.call(supplierCommand::get);
- } catch (ExecutionException executionException) {
- String errorMessage =
- format(
- "Operation '%s:%s' failed for the %d time in RetryUtil",
- operationName, shortDescription, internalNumberOfRetries.get());
- LOGGER.debug(errorMessage);
- throw new RuntimeException(errorMessage, executionException.getCause());
- } catch (RetryException retryException) {
- String errorMessage =
- format(
- "Operation '%s:%s' failed after retrying %d times, retry limit %d",
- operationName, shortDescription, internalNumberOfRetries.get(), 3);
- LOGGER.error(errorMessage, retryException.getLastFailedAttempt().getExceptionCause());
- throw new RuntimeException(
- errorMessage, retryException.getLastFailedAttempt().getExceptionCause());
- }
- }
-}
diff --git a/contribs/build.gradle b/contribs/build.gradle
deleted file mode 100644
index 93ea5b8e6..000000000
--- a/contribs/build.gradle
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2021 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-
-dependencies {
- implementation project(':conductor-common')
- implementation project(':conductor-core')
- compileOnly 'org.springframework.boot:spring-boot-starter'
- compileOnly 'org.springframework.boot:spring-boot-starter-web'
-
- implementation "com.amazonaws:aws-java-sdk-s3:${revAwsSdk}"
- implementation "com.amazonaws:aws-java-sdk-sqs:${revAwsSdk}"
-
- implementation "org.apache.commons:commons-lang3:"
-
- implementation "net.thisptr:jackson-jq:${revJq}"
- // SBMTODO: remove guava dep
- implementation "com.google.guava:guava:${revGuava}"
-
- implementation "javax.ws.rs:jsr311-api:${revJsr311Api}"
-
- implementation "org.apache.kafka:kafka-clients:${revKafka}"
-
- implementation "com.rabbitmq:amqp-client:${revAmqpClient}"
-
- implementation "io.nats:java-nats-streaming:${revNatsStreaming}"
-
- implementation "io.reactivex:rxjava:${revRxJava}"
-
- implementation "com.netflix.spectator:spectator-reg-metrics3:${revSpectator}"
- implementation "com.netflix.spectator:spectator-reg-micrometer:${revSpectator}"
- implementation "io.prometheus:simpleclient:${revPrometheus}"
- implementation "io.micrometer:micrometer-registry-prometheus:${revMicrometer}"
-
- testImplementation 'org.springframework.boot:spring-boot-starter-web'
- testImplementation "org.testcontainers:mockserver:${revTestContainer}"
- testImplementation "org.mock-server:mockserver-client-java:${revMockServerClient}"
-
- testImplementation project(':conductor-common').sourceSets.test.output
-}
diff --git a/contribs/dependencies.lock b/contribs/dependencies.lock
deleted file mode 100644
index fb5ab96bd..000000000
--- a/contribs/dependencies.lock
+++ /dev/null
@@ -1,549 +0,0 @@
-{
- "annotationProcessor": {
- "org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.6.6"
- }
- },
- "compileClasspath": {
- "com.amazonaws:aws-java-sdk-s3": {
- "locked": "1.11.86"
- },
- "com.amazonaws:aws-java-sdk-sqs": {
- "locked": "1.11.86"
- },
- "com.google.guava:guava": {
- "locked": "30.0-jre"
- },
- "com.netflix.conductor:conductor-common": {
- "project": true
- },
- "com.netflix.conductor:conductor-core": {
- "project": true
- },
- "com.netflix.spectator:spectator-reg-metrics3": {
- "locked": "0.122.0"
- },
- "com.netflix.spectator:spectator-reg-micrometer": {
- "locked": "0.122.0"
- },
- "com.rabbitmq:amqp-client": {
- "locked": "5.14.0"
- },
- "io.micrometer:micrometer-registry-prometheus": {
- "locked": "1.6.2"
- },
- "io.nats:java-nats-streaming": {
- "locked": "0.5.0"
- },
- "io.prometheus:simpleclient": {
- "locked": "0.9.0"
- },
- "io.reactivex:rxjava": {
- "locked": "1.2.2"
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1"
- },
- "net.thisptr:jackson-jq": {
- "locked": "0.0.13"
- },
- "org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
- },
- "org.apache.kafka:kafka-clients": {
- "locked": "2.6.0"
- },
- "org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-web": {
- "locked": "2.17.1"
- },
- "org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
- },
- "org.springframework.boot:spring-boot-starter-web": {
- "locked": "2.6.6"
- }
- },
- "runtimeClasspath": {
- "com.amazonaws:aws-java-sdk-s3": {
- "locked": "1.11.86"
- },
- "com.amazonaws:aws-java-sdk-sqs": {
- "locked": "1.11.86"
- },
- "com.fasterxml.jackson.core:jackson-annotations": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
- },
- "com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
- },
- "com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2.2"
- },
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
- },
- "com.google.guava:guava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "30.0-jre"
- },
- "com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "3.13.0"
- },
- "com.jayway.jsonpath:json-path": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.6.0"
- },
- "com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "project": true
- },
- "com.netflix.conductor:conductor-common": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "project": true
- },
- "com.netflix.conductor:conductor-core": {
- "project": true
- },
- "com.netflix.spectator:spectator-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "0.122.0"
- },
- "com.netflix.spectator:spectator-reg-metrics3": {
- "locked": "0.122.0"
- },
- "com.netflix.spectator:spectator-reg-micrometer": {
- "locked": "0.122.0"
- },
- "com.rabbitmq:amqp-client": {
- "locked": "5.14.0"
- },
- "com.spotify:completable-futures": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "0.3.3"
- },
- "commons-io:commons-io": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.7"
- },
- "io.micrometer:micrometer-registry-prometheus": {
- "locked": "1.6.2"
- },
- "io.nats:java-nats-streaming": {
- "locked": "0.5.0"
- },
- "io.prometheus:simpleclient": {
- "locked": "0.9.0"
- },
- "io.reactivex:rxjava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.2.2"
- },
- "jakarta.activation:jakarta.activation-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.2.2"
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.3.3"
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1"
- },
- "net.thisptr:jackson-jq": {
- "locked": "0.0.13"
- },
- "org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.0.5"
- },
- "org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "3.12.0"
- },
- "org.apache.kafka:kafka-clients": {
- "locked": "2.6.0"
- },
- "org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- }
- },
- "testCompileClasspath": {
- "com.amazonaws:aws-java-sdk-s3": {
- "locked": "1.11.86"
- },
- "com.amazonaws:aws-java-sdk-sqs": {
- "locked": "1.11.86"
- },
- "com.google.guava:guava": {
- "locked": "30.0-jre"
- },
- "com.netflix.conductor:conductor-common": {
- "project": true
- },
- "com.netflix.conductor:conductor-core": {
- "project": true
- },
- "com.netflix.spectator:spectator-reg-metrics3": {
- "locked": "0.122.0"
- },
- "com.netflix.spectator:spectator-reg-micrometer": {
- "locked": "0.122.0"
- },
- "com.rabbitmq:amqp-client": {
- "locked": "5.14.0"
- },
- "io.micrometer:micrometer-registry-prometheus": {
- "locked": "1.6.2"
- },
- "io.nats:java-nats-streaming": {
- "locked": "0.5.0"
- },
- "io.prometheus:simpleclient": {
- "locked": "0.9.0"
- },
- "io.reactivex:rxjava": {
- "locked": "1.2.2"
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1"
- },
- "junit:junit": {
- "locked": "4.13.2"
- },
- "net.thisptr:jackson-jq": {
- "locked": "0.0.13"
- },
- "org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
- },
- "org.apache.kafka:kafka-clients": {
- "locked": "2.6.0"
- },
- "org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-web": {
- "locked": "2.17.1"
- },
- "org.mock-server:mockserver-client-java": {
- "locked": "5.11.2"
- },
- "org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
- },
- "org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
- },
- "org.springframework.boot:spring-boot-starter-web": {
- "locked": "2.6.6"
- },
- "org.testcontainers:mockserver": {
- "locked": "1.15.3"
- }
- },
- "testRuntimeClasspath": {
- "com.amazonaws:aws-java-sdk-s3": {
- "locked": "1.11.86"
- },
- "com.amazonaws:aws-java-sdk-sqs": {
- "locked": "1.11.86"
- },
- "com.fasterxml.jackson.core:jackson-annotations": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
- },
- "com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2"
- },
- "com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.13.2.2"
- },
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
- },
- "com.google.guava:guava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "30.0-jre"
- },
- "com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "3.13.0"
- },
- "com.jayway.jsonpath:json-path": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.6.0"
- },
- "com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "project": true
- },
- "com.netflix.conductor:conductor-common": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "project": true
- },
- "com.netflix.conductor:conductor-core": {
- "project": true
- },
- "com.netflix.spectator:spectator-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "0.122.0"
- },
- "com.netflix.spectator:spectator-reg-metrics3": {
- "locked": "0.122.0"
- },
- "com.netflix.spectator:spectator-reg-micrometer": {
- "locked": "0.122.0"
- },
- "com.rabbitmq:amqp-client": {
- "locked": "5.14.0"
- },
- "com.spotify:completable-futures": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "0.3.3"
- },
- "commons-io:commons-io": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.8.0"
- },
- "io.micrometer:micrometer-registry-prometheus": {
- "locked": "1.6.2"
- },
- "io.nats:java-nats-streaming": {
- "locked": "0.5.0"
- },
- "io.prometheus:simpleclient": {
- "locked": "0.9.0"
- },
- "io.reactivex:rxjava": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.2.2"
- },
- "jakarta.activation:jakarta.activation-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "1.2.2"
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.3.3"
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1"
- },
- "junit:junit": {
- "locked": "4.13.2"
- },
- "net.thisptr:jackson-jq": {
- "locked": "0.0.13"
- },
- "org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.0.5"
- },
- "org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "3.12.0"
- },
- "org.apache.kafka:kafka-clients": {
- "locked": "2.6.0"
- },
- "org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core"
- ],
- "locked": "2.17.1"
- },
- "org.mock-server:mockserver-client-java": {
- "locked": "5.11.2"
- },
- "org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
- },
- "org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
- },
- "org.springframework.boot:spring-boot-starter-web": {
- "locked": "2.6.6"
- },
- "org.testcontainers:mockserver": {
- "locked": "1.15.3"
- }
- }
-}
\ No newline at end of file
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWithTTLWorkflowStatusListener.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWithTTLWorkflowStatusListener.java
deleted file mode 100644
index 69b50d6a3..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWithTTLWorkflowStatusListener.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.listener.archive;
-
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import javax.annotation.PreDestroy;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.netflix.conductor.core.dal.ExecutionDAOFacade;
-import com.netflix.conductor.core.listener.WorkflowStatusListener;
-import com.netflix.conductor.metrics.Monitors;
-import com.netflix.conductor.model.WorkflowModel;
-
-public class ArchivingWithTTLWorkflowStatusListener implements WorkflowStatusListener {
-
- private static final Logger LOGGER =
- LoggerFactory.getLogger(ArchivingWithTTLWorkflowStatusListener.class);
-
- private final ExecutionDAOFacade executionDAOFacade;
- private final int archiveTTLSeconds;
- private final int delayArchiveSeconds;
- private final ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
-
- public ArchivingWithTTLWorkflowStatusListener(
- ExecutionDAOFacade executionDAOFacade, ArchivingWorkflowListenerProperties properties) {
- this.executionDAOFacade = executionDAOFacade;
- this.archiveTTLSeconds = (int) properties.getTtlDuration().getSeconds();
- this.delayArchiveSeconds = properties.getWorkflowArchivalDelay();
-
- this.scheduledThreadPoolExecutor =
- new ScheduledThreadPoolExecutor(
- properties.getDelayQueueWorkerThreadCount(),
- (runnable, executor) -> {
- LOGGER.warn(
- "Request {} to delay archiving index dropped in executor {}",
- runnable,
- executor);
- Monitors.recordDiscardedArchivalCount();
- });
- this.scheduledThreadPoolExecutor.setRemoveOnCancelPolicy(true);
- }
-
- @PreDestroy
- public void shutdownExecutorService() {
- try {
- LOGGER.info("Gracefully shutdown executor service");
- scheduledThreadPoolExecutor.shutdown();
- if (scheduledThreadPoolExecutor.awaitTermination(
- delayArchiveSeconds, TimeUnit.SECONDS)) {
- LOGGER.debug("tasks completed, shutting down");
- } else {
- LOGGER.warn("Forcing shutdown after waiting for {} seconds", delayArchiveSeconds);
- scheduledThreadPoolExecutor.shutdownNow();
- }
- } catch (InterruptedException ie) {
- LOGGER.warn(
- "Shutdown interrupted, invoking shutdownNow on scheduledThreadPoolExecutor for delay queue");
- scheduledThreadPoolExecutor.shutdownNow();
- Thread.currentThread().interrupt();
- }
- }
-
- @Override
- public void onWorkflowCompleted(WorkflowModel workflow) {
- LOGGER.info("Archiving workflow {} on completion ", workflow.getWorkflowId());
- if (delayArchiveSeconds > 0) {
- scheduledThreadPoolExecutor.schedule(
- new DelayArchiveWorkflow(workflow, executionDAOFacade),
- delayArchiveSeconds,
- TimeUnit.SECONDS);
- } else {
- this.executionDAOFacade.removeWorkflowWithExpiry(
- workflow.getWorkflowId(), true, archiveTTLSeconds);
- Monitors.recordWorkflowArchived(workflow.getWorkflowName(), workflow.getStatus());
- }
- }
-
- @Override
- public void onWorkflowTerminated(WorkflowModel workflow) {
- LOGGER.info("Archiving workflow {} on termination", workflow.getWorkflowId());
- if (delayArchiveSeconds > 0) {
- scheduledThreadPoolExecutor.schedule(
- new DelayArchiveWorkflow(workflow, executionDAOFacade),
- delayArchiveSeconds,
- TimeUnit.SECONDS);
- } else {
- this.executionDAOFacade.removeWorkflowWithExpiry(
- workflow.getWorkflowId(), true, archiveTTLSeconds);
- Monitors.recordWorkflowArchived(workflow.getWorkflowName(), workflow.getStatus());
- }
- }
-
- private class DelayArchiveWorkflow implements Runnable {
-
- private final String workflowId;
- private final String workflowName;
- private final WorkflowModel.Status status;
- private final ExecutionDAOFacade executionDAOFacade;
-
- DelayArchiveWorkflow(WorkflowModel workflow, ExecutionDAOFacade executionDAOFacade) {
- this.workflowId = workflow.getWorkflowId();
- this.workflowName = workflow.getWorkflowName();
- this.status = workflow.getStatus();
- this.executionDAOFacade = executionDAOFacade;
- }
-
- @Override
- public void run() {
- try {
- this.executionDAOFacade.removeWorkflowWithExpiry(
- workflowId, true, archiveTTLSeconds);
- LOGGER.info("Archived workflow {}", workflowId);
- Monitors.recordWorkflowArchived(workflowName, status);
- Monitors.recordArchivalDelayQueueSize(
- scheduledThreadPoolExecutor.getQueue().size());
- } catch (Exception e) {
- LOGGER.error("Unable to archive workflow: {}", workflowId, e);
- }
- }
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerConfiguration.java
deleted file mode 100644
index c98c0c173..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerConfiguration.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.listener.archive;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.netflix.conductor.core.dal.ExecutionDAOFacade;
-import com.netflix.conductor.core.listener.WorkflowStatusListener;
-
-@Configuration
-@EnableConfigurationProperties(ArchivingWorkflowListenerProperties.class)
-@ConditionalOnProperty(name = "conductor.workflow-status-listener.type", havingValue = "archive")
-public class ArchivingWorkflowListenerConfiguration {
-
- @Bean
- public WorkflowStatusListener getWorkflowStatusListener(
- ExecutionDAOFacade executionDAOFacade, ArchivingWorkflowListenerProperties properties) {
- if (properties.getTtlDuration().getSeconds() > 0) {
- return new ArchivingWithTTLWorkflowStatusListener(executionDAOFacade, properties);
- } else {
- return new ArchivingWorkflowStatusListener(executionDAOFacade);
- }
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerProperties.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerProperties.java
deleted file mode 100644
index dfd57d301..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerProperties.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.listener.archive;
-
-import java.time.Duration;
-import java.time.temporal.ChronoUnit;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.convert.DurationUnit;
-import org.springframework.core.env.Environment;
-
-@ConfigurationProperties("conductor.workflow-status-listener.archival")
-public class ArchivingWorkflowListenerProperties {
-
- private final Environment environment;
-
- @Autowired
- public ArchivingWorkflowListenerProperties(Environment environment) {
- this.environment = environment;
- }
-
- /**
- * The time to live in seconds for workflow archiving module. Currently, only RedisExecutionDAO
- * supports this
- */
- @DurationUnit(ChronoUnit.SECONDS)
- private Duration ttlDuration = Duration.ZERO;
-
- /** The number of threads to process the delay queue in workflow archival */
- private int delayQueueWorkerThreadCount = 5;
-
- public Duration getTtlDuration() {
- return ttlDuration;
- }
-
- public void setTtlDuration(Duration ttlDuration) {
- this.ttlDuration = ttlDuration;
- }
-
- public int getDelayQueueWorkerThreadCount() {
- return delayQueueWorkerThreadCount;
- }
-
- public void setDelayQueueWorkerThreadCount(int delayQueueWorkerThreadCount) {
- this.delayQueueWorkerThreadCount = delayQueueWorkerThreadCount;
- }
-
- /** The time to delay the archival of workflow */
- public int getWorkflowArchivalDelay() {
- return environment.getProperty(
- "conductor.workflow-status-listener.archival.delaySeconds",
- Integer.class,
- environment.getProperty(
- "conductor.app.asyncUpdateDelaySeconds", Integer.class, 60));
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowStatusListener.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowStatusListener.java
deleted file mode 100644
index f1fe98cca..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowStatusListener.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.listener.archive;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.netflix.conductor.core.dal.ExecutionDAOFacade;
-import com.netflix.conductor.core.listener.WorkflowStatusListener;
-import com.netflix.conductor.metrics.Monitors;
-import com.netflix.conductor.model.WorkflowModel;
-
-/**
- * Provides default implementation of workflow archiving immediately after workflow is completed or
- * terminated.
- *
- * @author pavel.halabala
- */
-public class ArchivingWorkflowStatusListener implements WorkflowStatusListener {
-
- private static final Logger LOGGER =
- LoggerFactory.getLogger(ArchivingWorkflowStatusListener.class);
- private final ExecutionDAOFacade executionDAOFacade;
-
- public ArchivingWorkflowStatusListener(ExecutionDAOFacade executionDAOFacade) {
- this.executionDAOFacade = executionDAOFacade;
- }
-
- @Override
- public void onWorkflowCompleted(WorkflowModel workflow) {
- LOGGER.info("Archiving workflow {} on completion ", workflow.getWorkflowId());
- this.executionDAOFacade.removeWorkflow(workflow.getWorkflowId(), true);
- Monitors.recordWorkflowArchived(workflow.getWorkflowName(), workflow.getStatus());
- }
-
- @Override
- public void onWorkflowTerminated(WorkflowModel workflow) {
- LOGGER.info("Archiving workflow {} on termination", workflow.getWorkflowId());
- this.executionDAOFacade.removeWorkflow(workflow.getWorkflowId(), true);
- Monitors.recordWorkflowArchived(workflow.getWorkflowName(), workflow.getStatus());
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisher.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisher.java
deleted file mode 100644
index 5f85e876e..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisher.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.listener.conductorqueue;
-
-import java.util.Collections;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.netflix.conductor.common.run.WorkflowSummary;
-import com.netflix.conductor.core.events.queue.Message;
-import com.netflix.conductor.core.listener.WorkflowStatusListener;
-import com.netflix.conductor.dao.QueueDAO;
-import com.netflix.conductor.model.WorkflowModel;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/**
- * Publishes a {@link Message} containing a {@link WorkflowSummary} to the undlerying {@link
- * QueueDAO} implementation on a workflow completion or termination event.
- */
-public class ConductorQueueStatusPublisher implements WorkflowStatusListener {
-
- private static final Logger LOGGER =
- LoggerFactory.getLogger(ConductorQueueStatusPublisher.class);
- private final QueueDAO queueDAO;
- private final ObjectMapper objectMapper;
-
- private final String successStatusQueue;
- private final String failureStatusQueue;
- private final String finalizeStatusQueue;
-
- public ConductorQueueStatusPublisher(
- QueueDAO queueDAO,
- ObjectMapper objectMapper,
- ConductorQueueStatusPublisherProperties properties) {
- this.queueDAO = queueDAO;
- this.objectMapper = objectMapper;
- this.successStatusQueue = properties.getSuccessQueue();
- this.failureStatusQueue = properties.getFailureQueue();
- this.finalizeStatusQueue = properties.getFinalizeQueue();
- }
-
- @Override
- public void onWorkflowCompleted(WorkflowModel workflow) {
- LOGGER.info("Publishing callback of workflow {} on completion ", workflow.getWorkflowId());
- queueDAO.push(successStatusQueue, Collections.singletonList(workflowToMessage(workflow)));
- }
-
- @Override
- public void onWorkflowTerminated(WorkflowModel workflow) {
- LOGGER.info("Publishing callback of workflow {} on termination", workflow.getWorkflowId());
- queueDAO.push(failureStatusQueue, Collections.singletonList(workflowToMessage(workflow)));
- }
-
- @Override
- public void onWorkflowFinalized(WorkflowModel workflow) {
- LOGGER.info("Publishing callback of workflow {} on finalization", workflow.getWorkflowId());
- queueDAO.push(finalizeStatusQueue, Collections.singletonList(workflowToMessage(workflow)));
- }
-
- private Message workflowToMessage(WorkflowModel workflowModel) {
- String jsonWfSummary;
- WorkflowSummary summary = new WorkflowSummary(workflowModel.toWorkflow());
- try {
- jsonWfSummary = objectMapper.writeValueAsString(summary);
- } catch (JsonProcessingException e) {
- LOGGER.error(
- "Failed to convert WorkflowSummary: {} to String. Exception: {}", summary, e);
- throw new RuntimeException(e);
- }
- return new Message(workflowModel.getWorkflowId(), jsonWfSummary, null);
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherConfiguration.java
deleted file mode 100644
index df4e69404..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherConfiguration.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.listener.conductorqueue;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.netflix.conductor.core.listener.WorkflowStatusListener;
-import com.netflix.conductor.dao.QueueDAO;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-@Configuration
-@EnableConfigurationProperties(ConductorQueueStatusPublisherProperties.class)
-@ConditionalOnProperty(
- name = "conductor.workflow-status-listener.type",
- havingValue = "queue_publisher")
-public class ConductorQueueStatusPublisherConfiguration {
-
- @Bean
- public WorkflowStatusListener getWorkflowStatusListener(
- QueueDAO queueDAO,
- ConductorQueueStatusPublisherProperties properties,
- ObjectMapper objectMapper) {
- return new ConductorQueueStatusPublisher(queueDAO, objectMapper, properties);
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherProperties.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherProperties.java
deleted file mode 100644
index ea9a53f74..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherProperties.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.listener.conductorqueue;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-@ConfigurationProperties("conductor.workflow-status-listener.queue-publisher")
-public class ConductorQueueStatusPublisherProperties {
-
- private String successQueue = "_callbackSuccessQueue";
-
- private String failureQueue = "_callbackFailureQueue";
-
- private String finalizeQueue = "_callbackFinalizeQueue";
-
- public String getSuccessQueue() {
- return successQueue;
- }
-
- public void setSuccessQueue(String successQueue) {
- this.successQueue = successQueue;
- }
-
- public String getFailureQueue() {
- return failureQueue;
- }
-
- public void setFailureQueue(String failureQueue) {
- this.failureQueue = failureQueue;
- }
-
- public String getFinalizeQueue() {
- return finalizeQueue;
- }
-
- public void setFinalizeQueue(String finalizeQueue) {
- this.finalizeQueue = finalizeQueue;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/DatadogMetricsConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/metrics/DatadogMetricsConfiguration.java
deleted file mode 100644
index 32ca11edc..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/DatadogMetricsConfiguration.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.metrics;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Configuration;
-
-import com.netflix.spectator.api.Spectator;
-import com.netflix.spectator.micrometer.MicrometerRegistry;
-
-import io.micrometer.core.instrument.MeterRegistry;
-
-/**
- * Metrics Datadog module, sending all metrics to a Datadog server.
- *
- *
Enable in config: conductor.metrics-datadog.enabled=true
- *
- *
Make sure your dependencies include both micrometer-registry-datadog &
- * spring-boot-starter-actuator
- */
-@ConditionalOnProperty(value = "conductor.metrics-datadog.enabled", havingValue = "true")
-@Configuration
-public class DatadogMetricsConfiguration {
-
- public DatadogMetricsConfiguration(MeterRegistry meterRegistry) {
- final MicrometerRegistry metricsRegistry = new MicrometerRegistry(meterRegistry);
- Spectator.globalRegistry().add(metricsRegistry);
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfiguration.java
deleted file mode 100644
index 33b66faff..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfiguration.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.metrics;
-
-import java.time.Duration;
-import java.util.concurrent.TimeUnit;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.codahale.metrics.MetricRegistry;
-import com.codahale.metrics.Slf4jReporter;
-
-/**
- * Metrics logging reporter, dumping all metrics into an Slf4J logger.
- *
- *
Enable in config: conductor.metrics-logger.enabled=true
- *
- *
additional config: conductor.metrics-logger.reportInterval=15s
- */
-@ConditionalOnProperty(value = "conductor.metrics-logger.enabled", havingValue = "true")
-@Configuration
-public class LoggingMetricsConfiguration {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(LoggingMetricsConfiguration.class);
-
- // Dedicated logger for metrics
- // This way one can cleanly separate the metrics stream from rest of the logs
- private static final Logger METRICS_LOGGER = LoggerFactory.getLogger("ConductorMetrics");
-
- @Value("${conductor.metrics-logger.reportInterval:#{T(java.time.Duration).ofSeconds(30)}}")
- private Duration reportInterval;
-
- @Bean
- public Slf4jReporter getSl4jReporter(MetricRegistry metricRegistry) {
- return new Slf4jReporterProvider(metricRegistry, reportInterval.getSeconds()).getReporter();
- }
-
- static class Slf4jReporterProvider {
-
- private final long metricsReportInterval;
- private final MetricRegistry metrics3Registry;
- private final Logger logger;
-
- Slf4jReporterProvider(MetricRegistry metricRegistry, long reportInterval) {
- this(metricRegistry, METRICS_LOGGER, reportInterval);
- }
-
- Slf4jReporterProvider(
- MetricRegistry metricRegistry, Logger outputLogger, long metricsReportInterval) {
- this.metrics3Registry = metricRegistry;
- this.logger = outputLogger;
- this.metricsReportInterval = metricsReportInterval;
- }
-
- public Slf4jReporter getReporter() {
- final Slf4jReporter reporter =
- Slf4jReporter.forRegistry(metrics3Registry)
- .outputTo(logger)
- .convertRatesTo(TimeUnit.SECONDS)
- .convertDurationsTo(TimeUnit.MILLISECONDS)
- .build();
-
- reporter.start(metricsReportInterval, TimeUnit.SECONDS);
- LOGGER.info(
- "Logging metrics reporter started, reporting every {} seconds",
- metricsReportInterval);
- return reporter;
- }
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/MetricsRegistryConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/metrics/MetricsRegistryConfiguration.java
deleted file mode 100644
index f28e1caa0..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/MetricsRegistryConfiguration.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.metrics;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.netflix.spectator.api.Clock;
-import com.netflix.spectator.api.Spectator;
-import com.netflix.spectator.metrics3.MetricsRegistry;
-
-import com.codahale.metrics.MetricRegistry;
-
-@ConditionalOnProperty(value = "conductor.metrics-logger.enabled", havingValue = "true")
-@Configuration
-public class MetricsRegistryConfiguration {
-
- public static final MetricRegistry METRIC_REGISTRY = new MetricRegistry();
- public static final MetricsRegistry METRICS_REGISTRY =
- new MetricsRegistry(Clock.SYSTEM, METRIC_REGISTRY);
-
- static {
- Spectator.globalRegistry().add(METRICS_REGISTRY);
- }
-
- @Bean
- public MetricRegistry metricRegistry() {
- return METRIC_REGISTRY;
- }
-
- @Bean
- public MetricsRegistry metricsRegistry() {
- return METRICS_REGISTRY;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfiguration.java
deleted file mode 100644
index f9a6c2ec7..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfiguration.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.metrics;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Configuration;
-
-import com.netflix.spectator.api.Spectator;
-import com.netflix.spectator.micrometer.MicrometerRegistry;
-
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.prometheus.PrometheusRenameFilter;
-
-/**
- * Metrics prometheus module, sending all metrics to a Prometheus server.
- *
- *
Enable in config: conductor.metrics-prometheus.enabled=true
- *
- *
Make sure your dependencies include both spectator-reg-micrometer &
- * spring-boot-starter-actuator
- */
-@ConditionalOnProperty(value = "conductor.metrics-prometheus.enabled", havingValue = "true")
-@Configuration
-public class PrometheusMetricsConfiguration {
- private static final Logger LOGGER =
- LoggerFactory.getLogger(PrometheusMetricsConfiguration.class);
-
- public PrometheusMetricsConfiguration(MeterRegistry meterRegistry) {
- LOGGER.info("Prometheus metrics module initialized");
- final MicrometerRegistry metricsRegistry = new MicrometerRegistry(meterRegistry);
- meterRegistry.config().meterFilter(new PrometheusRenameFilter());
- Spectator.globalRegistry().add(metricsRegistry);
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPConnection.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPConnection.java
deleted file mode 100644
index ab97c58e2..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPConnection.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeoutException;
-import java.util.stream.Collectors;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPRetryPattern;
-import com.netflix.conductor.contribs.queue.amqp.util.AMQPConstants;
-import com.netflix.conductor.contribs.queue.amqp.util.ConnectionType;
-
-import com.rabbitmq.client.Address;
-import com.rabbitmq.client.BlockedListener;
-import com.rabbitmq.client.Channel;
-import com.rabbitmq.client.Connection;
-import com.rabbitmq.client.ConnectionFactory;
-import com.rabbitmq.client.ShutdownListener;
-import com.rabbitmq.client.ShutdownSignalException;
-
-public class AMQPConnection {
-
- private static Logger LOGGER = LoggerFactory.getLogger(AMQPConnection.class);
- private volatile Connection publisherConnection = null;
- private volatile Connection subscriberConnection = null;
- private ConnectionFactory factory = null;
- private Address[] addresses = null;
- private static AMQPConnection amqpConnection = null;
- private static final String PUBLISHER = "Publisher";
- private static final String SUBSCRIBER = "Subscriber";
- private static final Map> availableChannelPool =
- new ConcurrentHashMap>();
- private static final Map subscriberReservedChannelPool =
- new ConcurrentHashMap();
- private static AMQPRetryPattern retrySettings = null;
-
- private AMQPConnection() {}
-
- private AMQPConnection(final ConnectionFactory factory, final Address[] address) {
- this.factory = factory;
- this.addresses = address;
- }
-
- public static synchronized AMQPConnection getInstance(
- final ConnectionFactory factory,
- final Address[] address,
- final AMQPRetryPattern retrySettings) {
- if (AMQPConnection.amqpConnection == null) {
- AMQPConnection.amqpConnection = new AMQPConnection(factory, address);
- }
- AMQPConnection.retrySettings = retrySettings;
- return AMQPConnection.amqpConnection;
- }
-
- // Exposed for UT
- public static void setAMQPConnection(AMQPConnection amqpConnection) {
- AMQPConnection.amqpConnection = amqpConnection;
- }
-
- public Address[] getAddresses() {
- return addresses;
- }
-
- private Connection createConnection(String connectionPrefix) {
- int retryIndex = 1;
- while (true) {
- try {
- Connection connection =
- factory.newConnection(
- addresses, System.getenv("HOSTNAME") + "-" + connectionPrefix);
- if (connection == null || !connection.isOpen()) {
- throw new RuntimeException("Failed to open connection");
- }
- connection.addShutdownListener(
- new ShutdownListener() {
- @Override
- public void shutdownCompleted(ShutdownSignalException cause) {
- LOGGER.error(
- "Received a shutdown exception for the connection {}. reason {} cause{}",
- connection.getClientProvidedName(),
- cause.getMessage(),
- cause);
- }
- });
- connection.addBlockedListener(
- new BlockedListener() {
- @Override
- public void handleUnblocked() throws IOException {
- LOGGER.info(
- "Connection {} is unblocked",
- connection.getClientProvidedName());
- }
-
- @Override
- public void handleBlocked(String reason) throws IOException {
- LOGGER.error(
- "Connection {} is blocked. reason: {}",
- connection.getClientProvidedName(),
- reason);
- }
- });
- return connection;
- } catch (final IOException e) {
- AMQPRetryPattern retry = retrySettings;
- if (retry == null) {
- final String error =
- "IO error while connecting to "
- + Arrays.stream(addresses)
- .map(address -> address.toString())
- .collect(Collectors.joining(","));
- LOGGER.error(error, e);
- throw new RuntimeException(error, e);
- }
- try {
- retry.continueOrPropogate(e, retryIndex);
- } catch (Exception ex) {
- final String error =
- "Retries completed. IO error while connecting to "
- + Arrays.stream(addresses)
- .map(address -> address.toString())
- .collect(Collectors.joining(","));
- LOGGER.error(error, e);
- throw new RuntimeException(error, e);
- }
- retryIndex++;
- } catch (final TimeoutException e) {
- AMQPRetryPattern retry = retrySettings;
- if (retry == null) {
- final String error =
- "Timeout while connecting to "
- + Arrays.stream(addresses)
- .map(address -> address.toString())
- .collect(Collectors.joining(","));
- LOGGER.error(error, e);
- throw new RuntimeException(error, e);
- }
- try {
- retry.continueOrPropogate(e, retryIndex);
- } catch (Exception ex) {
- final String error =
- "Retries completed. Timeout while connecting to "
- + Arrays.stream(addresses)
- .map(address -> address.toString())
- .collect(Collectors.joining(","));
- LOGGER.error(error, e);
- throw new RuntimeException(error, e);
- }
- retryIndex++;
- }
- }
- }
-
- public Channel getOrCreateChannel(ConnectionType connectionType, String queueOrExchangeName)
- throws Exception {
- LOGGER.debug(
- "Accessing the channel for queueOrExchange {} with type {} ",
- queueOrExchangeName,
- connectionType);
- switch (connectionType) {
- case SUBSCRIBER:
- String subChnName = connectionType + ";" + queueOrExchangeName;
- if (subscriberReservedChannelPool.containsKey(subChnName)) {
- Channel locChn = subscriberReservedChannelPool.get(subChnName);
- if (locChn != null && locChn.isOpen()) {
- return locChn;
- }
- }
- synchronized (this) {
- if (subscriberConnection == null || !subscriberConnection.isOpen()) {
- subscriberConnection = createConnection(SUBSCRIBER);
- }
- }
- Channel subChn = borrowChannel(connectionType, subscriberConnection);
- // Add the subscribed channels to Map to avoid messages being acknowledged on
- // different from the subscribed one
- subscriberReservedChannelPool.put(subChnName, subChn);
- return subChn;
- case PUBLISHER:
- synchronized (this) {
- if (publisherConnection == null || !publisherConnection.isOpen()) {
- publisherConnection = createConnection(PUBLISHER);
- }
- }
- return borrowChannel(connectionType, publisherConnection);
- default:
- return null;
- }
- }
-
- private Channel getOrCreateChannel(ConnectionType connType, Connection rmqConnection) {
- // Channel creation is required
- Channel locChn = null;
- int retryIndex = 1;
- while (true) {
- try {
- LOGGER.debug("Creating a channel for " + connType);
- locChn = rmqConnection.createChannel();
- if (locChn == null || !locChn.isOpen()) {
- throw new RuntimeException("Fail to open " + connType + " channel");
- }
- locChn.addShutdownListener(
- cause -> {
- LOGGER.error(
- connType + " Channel has been shutdown: {}",
- cause.getMessage(),
- cause);
- });
- return locChn;
- } catch (final IOException e) {
- AMQPRetryPattern retry = retrySettings;
- if (retry == null) {
- throw new RuntimeException(
- "Cannot open "
- + connType
- + " channel on "
- + Arrays.stream(addresses)
- .map(address -> address.toString())
- .collect(Collectors.joining(",")),
- e);
- }
- try {
- retry.continueOrPropogate(e, retryIndex);
- } catch (Exception ex) {
- throw new RuntimeException(
- "Retries completed. Cannot open "
- + connType
- + " channel on "
- + Arrays.stream(addresses)
- .map(address -> address.toString())
- .collect(Collectors.joining(",")),
- e);
- }
- retryIndex++;
- } catch (final Exception e) {
- AMQPRetryPattern retry = retrySettings;
- if (retry == null) {
- throw new RuntimeException(
- "Cannot open "
- + connType
- + " channel on "
- + Arrays.stream(addresses)
- .map(address -> address.toString())
- .collect(Collectors.joining(",")),
- e);
- }
- try {
- retry.continueOrPropogate(e, retryIndex);
- } catch (Exception ex) {
- throw new RuntimeException(
- "Retries completed. Cannot open "
- + connType
- + " channel on "
- + Arrays.stream(addresses)
- .map(address -> address.toString())
- .collect(Collectors.joining(",")),
- e);
- }
- retryIndex++;
- }
- }
- }
-
- public void close() {
- LOGGER.info("Closing all connections and channels");
- try {
- closeChannelsInMap(ConnectionType.PUBLISHER);
- closeChannelsInMap(ConnectionType.SUBSCRIBER);
- closeConnection(publisherConnection);
- closeConnection(subscriberConnection);
- } finally {
- availableChannelPool.clear();
- publisherConnection = null;
- subscriberConnection = null;
- }
- }
-
- private void closeChannelsInMap(ConnectionType conType) {
- Set channels = availableChannelPool.get(conType);
- if (channels != null && !channels.isEmpty()) {
- Iterator itr = channels.iterator();
- while (itr.hasNext()) {
- Channel channel = itr.next();
- closeChannel(channel);
- }
- channels.clear();
- }
- }
-
- private void closeConnection(Connection connection) {
- if (connection == null || !connection.isOpen()) {
- LOGGER.warn("Connection is null or closed already. Not closing it again");
- } else {
- try {
- connection.close();
- } catch (Exception e) {
- LOGGER.warn("Fail to close connection: {}", e.getMessage(), e);
- }
- }
- }
-
- private void closeChannel(Channel channel) {
- if (channel == null || !channel.isOpen()) {
- LOGGER.warn("Channel is null or closed already. Not closing it again");
- } else {
- try {
- channel.close();
- } catch (Exception e) {
- LOGGER.warn("Fail to close channel: {}", e.getMessage(), e);
- }
- }
- }
-
- /**
- * Gets the channel for specified connectionType.
- *
- * @param connectionType holds the multiple channels for different connection types for thread
- * safe operation.
- * @param rmqConnection publisher or subscriber connection instance
- * @return channel instance
- * @throws Exception
- */
- private synchronized Channel borrowChannel(
- ConnectionType connectionType, Connection rmqConnection) throws Exception {
- if (!availableChannelPool.containsKey(connectionType)) {
- Channel channel = getOrCreateChannel(connectionType, rmqConnection);
- LOGGER.info(String.format(AMQPConstants.INFO_CHANNEL_CREATION_SUCCESS, connectionType));
- return channel;
- }
- Set channels = availableChannelPool.get(connectionType);
- if (channels != null && channels.isEmpty()) {
- Channel channel = getOrCreateChannel(connectionType, rmqConnection);
- LOGGER.info(String.format(AMQPConstants.INFO_CHANNEL_CREATION_SUCCESS, connectionType));
- return channel;
- }
- Iterator itr = channels.iterator();
- while (itr.hasNext()) {
- Channel channel = itr.next();
- if (channel != null && channel.isOpen()) {
- itr.remove();
- LOGGER.info(
- String.format(AMQPConstants.INFO_CHANNEL_BORROW_SUCCESS, connectionType));
- return channel;
- } else {
- itr.remove();
- }
- }
- Channel channel = getOrCreateChannel(connectionType, rmqConnection);
- LOGGER.info(String.format(AMQPConstants.INFO_CHANNEL_RESET_SUCCESS, connectionType));
- return channel;
- }
-
- /**
- * Returns the channel to connection pool for specified connectionType.
- *
- * @param connectionType
- * @param channel
- * @throws Exception
- */
- public synchronized void returnChannel(ConnectionType connectionType, Channel channel)
- throws Exception {
- if (channel == null || !channel.isOpen()) {
- channel = null; // channel is reset.
- }
- Set channels = availableChannelPool.get(connectionType);
- if (channels == null) {
- channels = new HashSet();
- availableChannelPool.put(connectionType, channels);
- }
- channels.add(channel);
- LOGGER.info(String.format(AMQPConstants.INFO_CHANNEL_RETURN_SUCCESS, connectionType));
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueue.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueue.java
deleted file mode 100644
index 203c4dfbe..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueue.java
+++ /dev/null
@@ -1,807 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties;
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPRetryPattern;
-import com.netflix.conductor.contribs.queue.amqp.util.AMQPConstants;
-import com.netflix.conductor.contribs.queue.amqp.util.AMQPSettings;
-import com.netflix.conductor.contribs.queue.amqp.util.ConnectionType;
-import com.netflix.conductor.core.events.queue.Message;
-import com.netflix.conductor.core.events.queue.ObservableQueue;
-import com.netflix.conductor.metrics.Monitors;
-
-import com.google.common.collect.Maps;
-import com.rabbitmq.client.AMQP;
-import com.rabbitmq.client.Address;
-import com.rabbitmq.client.Channel;
-import com.rabbitmq.client.ConnectionFactory;
-import com.rabbitmq.client.Consumer;
-import com.rabbitmq.client.DefaultConsumer;
-import com.rabbitmq.client.Envelope;
-import com.rabbitmq.client.GetResponse;
-import rx.Observable;
-import rx.Subscriber;
-
-/** @author Ritu Parathody */
-public class AMQPObservableQueue implements ObservableQueue {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(AMQPObservableQueue.class);
-
- private final AMQPSettings settings;
- private final AMQPRetryPattern retrySettings;
- private final String QUEUE_TYPE = "x-queue-type";
- private final int batchSize;
- private final boolean useExchange;
- private int pollTimeInMS;
- private AMQPConnection amqpConnection;
-
- protected LinkedBlockingQueue messages = new LinkedBlockingQueue<>();
- private volatile boolean running;
-
- public AMQPObservableQueue(
- ConnectionFactory factory,
- Address[] addresses,
- boolean useExchange,
- AMQPSettings settings,
- AMQPRetryPattern retrySettings,
- int batchSize,
- int pollTimeInMS) {
- if (factory == null) {
- throw new IllegalArgumentException("Connection factory is undefined");
- }
- if (addresses == null || addresses.length == 0) {
- throw new IllegalArgumentException("Addresses are undefined");
- }
- if (settings == null) {
- throw new IllegalArgumentException("Settings are undefined");
- }
- if (batchSize <= 0) {
- throw new IllegalArgumentException("Batch size must be greater than 0");
- }
- if (pollTimeInMS <= 0) {
- throw new IllegalArgumentException("Poll time must be greater than 0 ms");
- }
- this.useExchange = useExchange;
- this.settings = settings;
- this.batchSize = batchSize;
- this.amqpConnection = AMQPConnection.getInstance(factory, addresses, retrySettings);
- this.retrySettings = retrySettings;
- this.setPollTimeInMS(pollTimeInMS);
- }
-
- @Override
- public Observable observe() {
- Observable.OnSubscribe onSubscribe = null;
- // This will enabled the messages to be processed one after the other as per the
- // observable next behavior.
- if (settings.isSequentialProcessing()) {
- LOGGER.info("Subscribing for the message processing on schedule basis");
- receiveMessages();
- onSubscribe =
- subscriber -> {
- Observable interval =
- Observable.interval(pollTimeInMS, TimeUnit.MILLISECONDS);
- interval.flatMap(
- (Long x) -> {
- if (!isRunning()) {
- LOGGER.debug(
- "Component stopped, skip listening for messages from RabbitMQ");
- return Observable.from(Collections.emptyList());
- } else {
- List available = new LinkedList<>();
- messages.drainTo(available);
-
- if (!available.isEmpty()) {
- AtomicInteger count = new AtomicInteger(0);
- StringBuilder buffer = new StringBuilder();
- available.forEach(
- msg -> {
- buffer.append(msg.getId())
- .append("=")
- .append(msg.getPayload());
- count.incrementAndGet();
-
- if (count.get()
- < available.size()) {
- buffer.append(",");
- }
- });
- LOGGER.info(
- String.format(
- "Batch from %s to conductor is %s",
- settings
- .getQueueOrExchangeName(),
- buffer.toString()));
- }
- return Observable.from(available);
- }
- })
- .subscribe(subscriber::onNext, subscriber::onError);
- };
- LOGGER.info("Subscribed for the message processing on schedule basis");
- } else {
- onSubscribe =
- subscriber -> {
- LOGGER.info("Subscribing for the event based AMQP message processing");
- receiveMessages(subscriber);
- LOGGER.info("Subscribed for the event based AMQP message processing");
- };
- }
- return Observable.create(onSubscribe);
- }
-
- @Override
- public String getType() {
- return useExchange ? AMQPConstants.AMQP_EXCHANGE_TYPE : AMQPConstants.AMQP_QUEUE_TYPE;
- }
-
- @Override
- public String getName() {
- return settings.getEventName();
- }
-
- @Override
- public String getURI() {
- return settings.getQueueOrExchangeName();
- }
-
- public int getBatchSize() {
- return batchSize;
- }
-
- public AMQPSettings getSettings() {
- return settings;
- }
-
- public Address[] getAddresses() {
- return amqpConnection.getAddresses();
- }
-
- @Override
- public List ack(List messages) {
- final List processedDeliveryTags = new ArrayList<>();
- for (final Message message : messages) {
- int retryIndex = 1;
- while (true) {
- try {
- LOGGER.info("ACK message with delivery tag {}", message.getReceipt());
- Channel chn =
- amqpConnection.getOrCreateChannel(
- ConnectionType.SUBSCRIBER,
- getSettings().getQueueOrExchangeName());
- chn.basicAck(Long.parseLong(message.getReceipt()), false);
- processedDeliveryTags.add(message.getReceipt());
- LOGGER.info("Ack'ed the message with delivery tag {}", message.getReceipt());
- break;
- } catch (final Exception e) {
- AMQPRetryPattern retry = retrySettings;
- if (retry == null) {
- LOGGER.error(
- "Cannot ACK message with delivery tag {}", message.getReceipt(), e);
- }
- try {
- retry.continueOrPropogate(e, retryIndex);
- } catch (Exception ex) {
- LOGGER.error(
- "Retries completed. Cannot ACK message with delivery tag {}",
- message.getReceipt(),
- e);
- }
- retryIndex++;
- }
- }
- }
- return processedDeliveryTags;
- }
-
- private static AMQP.BasicProperties buildBasicProperties(
- final Message message, final AMQPSettings settings) {
- return new AMQP.BasicProperties.Builder()
- .messageId(
- StringUtils.isEmpty(message.getId())
- ? UUID.randomUUID().toString()
- : message.getId())
- .correlationId(
- StringUtils.isEmpty(message.getReceipt())
- ? UUID.randomUUID().toString()
- : message.getReceipt())
- .contentType(settings.getContentType())
- .contentEncoding(settings.getContentEncoding())
- .deliveryMode(settings.getDeliveryMode())
- .build();
- }
-
- private void publishMessage(Message message, String exchange, String routingKey) {
- Channel chn = null;
- int retryIndex = 1;
- while (true) {
- try {
- final String payload = message.getPayload();
- chn =
- amqpConnection.getOrCreateChannel(
- ConnectionType.PUBLISHER, getSettings().getQueueOrExchangeName());
- chn.basicPublish(
- exchange,
- routingKey,
- buildBasicProperties(message, settings),
- payload.getBytes(settings.getContentEncoding()));
- LOGGER.info(String.format("Published message to %s: %s", exchange, payload));
- break;
- } catch (Exception ex) {
- AMQPRetryPattern retry = retrySettings;
- if (retry == null) {
- LOGGER.error(
- "Failed to publish message {} to {}",
- message.getPayload(),
- exchange,
- ex);
- throw new RuntimeException(ex);
- }
- try {
- retry.continueOrPropogate(ex, retryIndex);
- } catch (Exception e) {
- LOGGER.error(
- "Retries completed. Failed to publish message {} to {}",
- message.getPayload(),
- exchange,
- ex);
- throw new RuntimeException(ex);
- }
- retryIndex++;
- } finally {
- if (chn != null) {
- try {
- amqpConnection.returnChannel(ConnectionType.PUBLISHER, chn);
- } catch (Exception e) {
- LOGGER.error(
- "Failed to return the channel of {}. {}",
- ConnectionType.PUBLISHER,
- e);
- }
- }
- }
- }
- }
-
- @Override
- public void publish(List messages) {
- try {
- final String exchange, routingKey;
- if (useExchange) {
- // Use exchange + routing key for publishing
- getOrCreateExchange(
- ConnectionType.PUBLISHER,
- settings.getQueueOrExchangeName(),
- settings.getExchangeType(),
- settings.isDurable(),
- settings.autoDelete(),
- settings.getArguments());
- exchange = settings.getQueueOrExchangeName();
- routingKey = settings.getRoutingKey();
- } else {
- // Use queue for publishing
- final AMQP.Queue.DeclareOk declareOk =
- getOrCreateQueue(
- ConnectionType.PUBLISHER,
- settings.getQueueOrExchangeName(),
- settings.isDurable(),
- settings.isExclusive(),
- settings.autoDelete(),
- settings.getArguments());
- exchange = StringUtils.EMPTY; // Empty exchange name for queue
- routingKey = declareOk.getQueue(); // Routing name is the name of queue
- }
- messages.forEach(message -> publishMessage(message, exchange, routingKey));
- } catch (final RuntimeException ex) {
- throw ex;
- } catch (final Exception ex) {
- LOGGER.error("Failed to publish messages: {}", ex.getMessage(), ex);
- throw new RuntimeException(ex);
- }
- }
-
- @Override
- public void setUnackTimeout(Message message, long unackTimeout) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public long size() {
- Channel chn = null;
- try {
- chn =
- amqpConnection.getOrCreateChannel(
- ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName());
- return chn.messageCount(settings.getQueueOrExchangeName());
- } catch (final Exception e) {
- throw new RuntimeException(e);
- } finally {
- if (chn != null) {
- try {
- amqpConnection.returnChannel(ConnectionType.SUBSCRIBER, chn);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
-
- @Override
- public void close() {
- amqpConnection.close();
- }
-
- @Override
- public void start() {
- LOGGER.info(
- "Started listening to {}:{}",
- getClass().getSimpleName(),
- settings.getQueueOrExchangeName());
- running = true;
- }
-
- @Override
- public void stop() {
- LOGGER.info(
- "Stopped listening to {}:{}",
- getClass().getSimpleName(),
- settings.getQueueOrExchangeName());
- running = false;
- }
-
- @Override
- public boolean isRunning() {
- return running;
- }
-
- public static class Builder {
-
- private final Address[] addresses;
- private final int batchSize;
- private final int pollTimeInMS;
- private final ConnectionFactory factory;
- private final AMQPEventQueueProperties properties;
-
- public Builder(AMQPEventQueueProperties properties) {
- this.properties = properties;
- this.addresses = buildAddressesFromHosts();
- this.factory = buildConnectionFactory();
- // messages polling settings
- this.batchSize = properties.getBatchSize();
- this.pollTimeInMS = (int) properties.getPollTimeDuration().toMillis();
- }
-
- private Address[] buildAddressesFromHosts() {
- // Read hosts from config
- final String hosts = properties.getHosts();
- if (StringUtils.isEmpty(hosts)) {
- throw new IllegalArgumentException("Hosts are undefined");
- }
- return Address.parseAddresses(hosts);
- }
-
- private ConnectionFactory buildConnectionFactory() {
- final ConnectionFactory factory = new ConnectionFactory();
- // Get rabbitmq username from config
- final String username = properties.getUsername();
- if (StringUtils.isEmpty(username)) {
- throw new IllegalArgumentException("Username is null or empty");
- } else {
- factory.setUsername(username);
- }
- // Get rabbitmq password from config
- final String password = properties.getPassword();
- if (StringUtils.isEmpty(password)) {
- throw new IllegalArgumentException("Password is null or empty");
- } else {
- factory.setPassword(password);
- }
- // Get vHost from config
- final String virtualHost = properties.getVirtualHost();
- ;
- if (StringUtils.isEmpty(virtualHost)) {
- throw new IllegalArgumentException("Virtual host is null or empty");
- } else {
- factory.setVirtualHost(virtualHost);
- }
- // Get server port from config
- final int port = properties.getPort();
- if (port <= 0) {
- throw new IllegalArgumentException("Port must be greater than 0");
- } else {
- factory.setPort(port);
- }
- final boolean useNio = properties.isUseNio();
- if (useNio) {
- factory.useNio();
- }
- factory.setConnectionTimeout(properties.getConnectionTimeoutInMilliSecs());
- factory.setRequestedHeartbeat(properties.getRequestHeartbeatTimeoutInSecs());
- factory.setNetworkRecoveryInterval(properties.getNetworkRecoveryIntervalInMilliSecs());
- factory.setHandshakeTimeout(properties.getHandshakeTimeoutInMilliSecs());
- factory.setAutomaticRecoveryEnabled(true);
- factory.setTopologyRecoveryEnabled(true);
- factory.setRequestedChannelMax(properties.getMaxChannelCount());
- return factory;
- }
-
- public AMQPObservableQueue build(final boolean useExchange, final String queueURI) {
- final AMQPSettings settings = new AMQPSettings(properties).fromURI(queueURI);
- final AMQPRetryPattern retrySettings =
- new AMQPRetryPattern(
- properties.getLimit(), properties.getDuration(), properties.getType());
- return new AMQPObservableQueue(
- factory,
- addresses,
- useExchange,
- settings,
- retrySettings,
- batchSize,
- pollTimeInMS);
- }
- }
-
- private AMQP.Exchange.DeclareOk getOrCreateExchange(ConnectionType connectionType)
- throws Exception {
- return getOrCreateExchange(
- connectionType,
- settings.getQueueOrExchangeName(),
- settings.getExchangeType(),
- settings.isDurable(),
- settings.autoDelete(),
- settings.getArguments());
- }
-
- private AMQP.Exchange.DeclareOk getOrCreateExchange(
- ConnectionType connectionType,
- String name,
- final String type,
- final boolean isDurable,
- final boolean autoDelete,
- final Map arguments)
- throws Exception {
- if (StringUtils.isEmpty(name)) {
- throw new RuntimeException("Exchange name is undefined");
- }
- if (StringUtils.isEmpty(type)) {
- throw new RuntimeException("Exchange type is undefined");
- }
- Channel chn = null;
- try {
- LOGGER.debug("Creating exchange {} of type {}", name, type);
- chn =
- amqpConnection.getOrCreateChannel(
- connectionType, getSettings().getQueueOrExchangeName());
- return chn.exchangeDeclare(name, type, isDurable, autoDelete, arguments);
- } catch (final Exception e) {
- LOGGER.warn("Failed to create exchange {} of type {}", name, type, e);
- throw e;
- } finally {
- if (chn != null) {
- try {
- amqpConnection.returnChannel(connectionType, chn);
- } catch (Exception e) {
- LOGGER.error("Failed to return the channel of {}. {}", connectionType, e);
- }
- }
- }
- }
-
- private AMQP.Queue.DeclareOk getOrCreateQueue(ConnectionType connectionType) throws Exception {
- return getOrCreateQueue(
- connectionType,
- settings.getQueueOrExchangeName(),
- settings.isDurable(),
- settings.isExclusive(),
- settings.autoDelete(),
- settings.getArguments());
- }
-
- private AMQP.Queue.DeclareOk getOrCreateQueue(
- ConnectionType connectionType,
- final String name,
- final boolean isDurable,
- final boolean isExclusive,
- final boolean autoDelete,
- final Map arguments)
- throws Exception {
- if (StringUtils.isEmpty(name)) {
- throw new RuntimeException("Queue name is undefined");
- }
- arguments.put(QUEUE_TYPE, settings.getQueueType());
- Channel chn = null;
- try {
- LOGGER.debug("Creating queue {}", name);
- chn =
- amqpConnection.getOrCreateChannel(
- connectionType, getSettings().getQueueOrExchangeName());
- return chn.queueDeclare(name, isDurable, isExclusive, autoDelete, arguments);
- } catch (final Exception e) {
- LOGGER.warn("Failed to create queue {}", name, e);
- throw e;
- } finally {
- if (chn != null) {
- try {
- amqpConnection.returnChannel(connectionType, chn);
- } catch (Exception e) {
- LOGGER.error("Failed to return the channel of {}. {}", connectionType, e);
- }
- }
- }
- }
-
- private static Message asMessage(AMQPSettings settings, GetResponse response) throws Exception {
- if (response == null) {
- return null;
- }
- final Message message = new Message();
- message.setId(response.getProps().getMessageId());
- message.setPayload(new String(response.getBody(), settings.getContentEncoding()));
- message.setReceipt(String.valueOf(response.getEnvelope().getDeliveryTag()));
- return message;
- }
-
- private void receiveMessagesFromQueue(String queueName) throws Exception {
- LOGGER.debug("Accessing channel for queue {}", queueName);
-
- Consumer consumer =
- new DefaultConsumer(
- amqpConnection.getOrCreateChannel(
- ConnectionType.SUBSCRIBER,
- getSettings().getQueueOrExchangeName())) {
-
- @Override
- public void handleDelivery(
- final String consumerTag,
- final Envelope envelope,
- final AMQP.BasicProperties properties,
- final byte[] body)
- throws IOException {
- try {
- Message message =
- asMessage(
- settings,
- new GetResponse(
- envelope, properties, body, Integer.MAX_VALUE));
- if (message != null) {
- if (LOGGER.isDebugEnabled()) {
- LOGGER.debug(
- "Got message with ID {} and receipt {}",
- message.getId(),
- message.getReceipt());
- }
- messages.add(message);
- LOGGER.info("receiveMessagesFromQueue- End method {}", messages);
- }
- } catch (InterruptedException e) {
- LOGGER.error(
- "Issue in handling the mesages for the subscriber with consumer tag {}. {}",
- consumerTag,
- e);
- Thread.currentThread().interrupt();
- } catch (Exception e) {
- LOGGER.error(
- "Issue in handling the mesages for the subscriber with consumer tag {}. {}",
- consumerTag,
- e);
- }
- }
-
- public void handleCancel(String consumerTag) throws IOException {
- LOGGER.error(
- "Recieved a consumer cancel notification for subscriber {}",
- consumerTag);
- }
- };
-
- amqpConnection
- .getOrCreateChannel(
- ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName())
- .basicConsume(queueName, false, consumer);
- Monitors.recordEventQueueMessagesProcessed(getType(), queueName, messages.size());
- }
-
- private void receiveMessagesFromQueue(String queueName, Subscriber super Message> subscriber)
- throws Exception {
- LOGGER.debug("Accessing channel for queue {}", queueName);
-
- Consumer consumer =
- new DefaultConsumer(
- amqpConnection.getOrCreateChannel(
- ConnectionType.SUBSCRIBER,
- getSettings().getQueueOrExchangeName())) {
-
- @Override
- public void handleDelivery(
- final String consumerTag,
- final Envelope envelope,
- final AMQP.BasicProperties properties,
- final byte[] body)
- throws IOException {
- try {
- Message message =
- asMessage(
- settings,
- new GetResponse(
- envelope, properties, body, Integer.MAX_VALUE));
- if (message == null) {
- return;
- }
- LOGGER.info(
- "Got message with ID {} and receipt {}",
- message.getId(),
- message.getReceipt());
- LOGGER.debug("Message content {}", message);
- // Not using thread-pool here as the number of concurrent threads are
- // controlled
- // by the number of messages delivery using pre-fetch count in RabbitMQ
- Thread newThread =
- new Thread(
- () -> {
- LOGGER.info(
- "Spawning a new thread for message with ID {}",
- message.getId());
- subscriber.onNext(message);
- });
- newThread.start();
- } catch (InterruptedException e) {
- LOGGER.error(
- "Issue in handling the mesages for the subscriber with consumer tag {}. {}",
- consumerTag,
- e);
- Thread.currentThread().interrupt();
- } catch (Exception e) {
- LOGGER.error(
- "Issue in handling the mesages for the subscriber with consumer tag {}. {}",
- consumerTag,
- e);
- }
- }
-
- public void handleCancel(String consumerTag) throws IOException {
- LOGGER.error(
- "Recieved a consumer cancel notification for subscriber {}",
- consumerTag);
- }
- };
- amqpConnection
- .getOrCreateChannel(
- ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName())
- .basicConsume(queueName, false, consumer);
- }
-
- protected void receiveMessages() {
- try {
- amqpConnection
- .getOrCreateChannel(
- ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName())
- .basicQos(batchSize);
- String queueName;
- if (useExchange) {
- // Consume messages from an exchange
- getOrCreateExchange(ConnectionType.SUBSCRIBER);
- /*
- * Create queue if not present based on the settings provided in the queue URI
- * or configuration properties. Sample URI format:
- * amqp-exchange:myExchange?exchangeType=topic&routingKey=myRoutingKey&exclusive
- * =false&autoDelete=false&durable=true Default settings if not provided in the
- * queue URI or properties: isDurable: true, autoDelete: false, isExclusive:
- * false The same settings are currently used during creation of exchange as
- * well as queue. TODO: This can be enhanced further to get the settings
- * separately for exchange and queue from the URI
- */
- final AMQP.Queue.DeclareOk declareOk =
- getOrCreateQueue(
- ConnectionType.SUBSCRIBER,
- String.format("bound_to_%s", settings.getQueueOrExchangeName()),
- settings.isDurable(),
- settings.isExclusive(),
- settings.autoDelete(),
- Maps.newHashMap());
- // Bind the declared queue to exchange
- queueName = declareOk.getQueue();
- amqpConnection
- .getOrCreateChannel(
- ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName())
- .queueBind(
- queueName,
- settings.getQueueOrExchangeName(),
- settings.getRoutingKey());
- } else {
- // Consume messages from a queue
- queueName = getOrCreateQueue(ConnectionType.SUBSCRIBER).getQueue();
- }
- // Consume messages
- LOGGER.info("Consuming from queue {}", queueName);
- receiveMessagesFromQueue(queueName);
- } catch (Exception exception) {
- LOGGER.error("Exception while getting messages from RabbitMQ", exception);
- Monitors.recordObservableQMessageReceivedErrors(getType());
- }
- }
-
- protected void receiveMessages(Subscriber super Message> subscriber) {
- try {
- amqpConnection
- .getOrCreateChannel(
- ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName())
- .basicQos(batchSize);
- String queueName;
- if (useExchange) {
- // Consume messages from an exchange
- getOrCreateExchange(ConnectionType.SUBSCRIBER);
- /*
- * Create queue if not present based on the settings provided in the queue URI
- * or configuration properties. Sample URI format:
- * amqp-exchange:myExchange?exchangeType=topic&routingKey=myRoutingKey&exclusive
- * =false&autoDelete=false&durable=true Default settings if not provided in the
- * queue URI or properties: isDurable: true, autoDelete: false, isExclusive:
- * false The same settings are currently used during creation of exchange as
- * well as queue. TODO: This can be enhanced further to get the settings
- * separately for exchange and queue from the URI
- */
- final AMQP.Queue.DeclareOk declareOk =
- getOrCreateQueue(
- ConnectionType.SUBSCRIBER,
- String.format("bound_to_%s", settings.getQueueOrExchangeName()),
- settings.isDurable(),
- settings.isExclusive(),
- settings.autoDelete(),
- Maps.newHashMap());
- // Bind the declared queue to exchange
- queueName = declareOk.getQueue();
- amqpConnection
- .getOrCreateChannel(
- ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName())
- .queueBind(
- queueName,
- settings.getQueueOrExchangeName(),
- settings.getRoutingKey());
- } else {
- // Consume messages from a queue
- queueName = getOrCreateQueue(ConnectionType.SUBSCRIBER).getQueue();
- }
- // Consume messages
- LOGGER.info("Consuming from queue {}", queueName);
- receiveMessagesFromQueue(queueName, subscriber);
- } catch (Exception exception) {
- LOGGER.error("Exception while getting messages from RabbitMQ", exception);
- Monitors.recordObservableQMessageReceivedErrors(getType());
- }
- }
-
- public int getPollTimeInMS() {
- return pollTimeInMS;
- }
-
- public void setPollTimeInMS(int pollTimeInMS) {
- this.pollTimeInMS = pollTimeInMS;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueConfiguration.java
deleted file mode 100644
index 9691b3c6e..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueConfiguration.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.config;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.netflix.conductor.contribs.queue.amqp.AMQPObservableQueue.Builder;
-import com.netflix.conductor.core.config.ConductorProperties;
-import com.netflix.conductor.core.events.EventQueueProvider;
-import com.netflix.conductor.core.events.queue.ObservableQueue;
-import com.netflix.conductor.model.TaskModel.Status;
-
-@Configuration(proxyBeanMethods = false)
-@EnableConfigurationProperties(AMQPEventQueueProperties.class)
-@ConditionalOnProperty(name = "conductor.event-queues.amqp.enabled", havingValue = "true")
-public class AMQPEventQueueConfiguration {
-
- private enum QUEUE_TYPE {
- AMQP_QUEUE("amqp_queue"),
- AMQP_EXCHANGE("amqp_exchange");
-
- private final String type;
-
- QUEUE_TYPE(String type) {
- this.type = type;
- }
-
- public String getType() {
- return type;
- }
- }
-
- @Bean
- public EventQueueProvider amqpEventQueueProvider(AMQPEventQueueProperties properties) {
- return new AMQPEventQueueProvider(properties, QUEUE_TYPE.AMQP_QUEUE.getType(), false);
- }
-
- @Bean
- public EventQueueProvider amqpExchangeEventQueueProvider(AMQPEventQueueProperties properties) {
- return new AMQPEventQueueProvider(properties, QUEUE_TYPE.AMQP_EXCHANGE.getType(), true);
- }
-
- @ConditionalOnProperty(name = "conductor.default-event-queue.type", havingValue = "amqp")
- @Bean
- public Map getQueues(
- ConductorProperties conductorProperties, AMQPEventQueueProperties properties) {
- String stack = "";
- if (conductorProperties.getStack() != null && conductorProperties.getStack().length() > 0) {
- stack = conductorProperties.getStack() + "_";
- }
- final boolean useExchange = properties.isUseExchange();
-
- Status[] statuses = new Status[] {Status.COMPLETED, Status.FAILED};
- Map queues = new HashMap<>();
- for (Status status : statuses) {
- String queuePrefix =
- StringUtils.isBlank(properties.getListenerQueuePrefix())
- ? conductorProperties.getAppId() + "_amqp_notify_" + stack
- : properties.getListenerQueuePrefix();
-
- String queueName = queuePrefix + status.name();
-
- final ObservableQueue queue = new Builder(properties).build(useExchange, queueName);
- queues.put(status, queue);
- }
-
- return queues;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProperties.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProperties.java
deleted file mode 100644
index 3ebdd5788..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProperties.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.config;
-
-import java.time.Duration;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import com.netflix.conductor.contribs.queue.amqp.util.RetryType;
-
-import com.rabbitmq.client.AMQP.PROTOCOL;
-import com.rabbitmq.client.ConnectionFactory;
-
-@ConfigurationProperties("conductor.event-queues.amqp")
-public class AMQPEventQueueProperties {
-
- private int batchSize = 1;
-
- private Duration pollTimeDuration = Duration.ofMillis(100);
-
- private String hosts = ConnectionFactory.DEFAULT_HOST;
-
- private String username = ConnectionFactory.DEFAULT_USER;
-
- private String password = ConnectionFactory.DEFAULT_PASS;
-
- private String virtualHost = ConnectionFactory.DEFAULT_VHOST;
-
- private int port = PROTOCOL.PORT;
-
- private int connectionTimeoutInMilliSecs = 180000;
- private int networkRecoveryIntervalInMilliSecs = 5000;
- private int requestHeartbeatTimeoutInSecs = 30;
- private int handshakeTimeoutInMilliSecs = 180000;
- private int maxChannelCount = 5000;
- private int limit = 50;
- private int duration = 1000;
- private RetryType retryType = RetryType.REGULARINTERVALS;
-
- public int getLimit() {
- return limit;
- }
-
- public void setLimit(int limit) {
- this.limit = limit;
- }
-
- public int getDuration() {
- return duration;
- }
-
- public void setDuration(int duration) {
- this.duration = duration;
- }
-
- public RetryType getType() {
- return retryType;
- }
-
- public void setType(RetryType type) {
- this.retryType = type;
- }
-
- public int getConnectionTimeoutInMilliSecs() {
- return connectionTimeoutInMilliSecs;
- }
-
- public void setConnectionTimeoutInMilliSecs(int connectionTimeoutInMilliSecs) {
- this.connectionTimeoutInMilliSecs = connectionTimeoutInMilliSecs;
- }
-
- public int getHandshakeTimeoutInMilliSecs() {
- return handshakeTimeoutInMilliSecs;
- }
-
- public void setHandshakeTimeoutInMilliSecs(int handshakeTimeoutInMilliSecs) {
- this.handshakeTimeoutInMilliSecs = handshakeTimeoutInMilliSecs;
- }
-
- public int getMaxChannelCount() {
- return maxChannelCount;
- }
-
- public void setMaxChannelCount(int maxChannelCount) {
- this.maxChannelCount = maxChannelCount;
- }
-
- private boolean useNio = false;
-
- private boolean durable = true;
-
- private boolean exclusive = false;
-
- private boolean autoDelete = false;
-
- private String contentType = "application/json";
-
- private String contentEncoding = "UTF-8";
-
- private String exchangeType = "topic";
-
- private String queueType = "classic";
-
- private boolean sequentialMsgProcessing = true;
-
- private int deliveryMode = 2;
-
- private boolean useExchange = true;
-
- private String listenerQueuePrefix = "";
-
- public int getBatchSize() {
- return batchSize;
- }
-
- public void setBatchSize(int batchSize) {
- this.batchSize = batchSize;
- }
-
- public Duration getPollTimeDuration() {
- return pollTimeDuration;
- }
-
- public void setPollTimeDuration(Duration pollTimeDuration) {
- this.pollTimeDuration = pollTimeDuration;
- }
-
- public String getHosts() {
- return hosts;
- }
-
- public void setHosts(String hosts) {
- this.hosts = hosts;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public String getVirtualHost() {
- return virtualHost;
- }
-
- public void setVirtualHost(String virtualHost) {
- this.virtualHost = virtualHost;
- }
-
- public int getPort() {
- return port;
- }
-
- public void setPort(int port) {
- this.port = port;
- }
-
- public boolean isUseNio() {
- return useNio;
- }
-
- public void setUseNio(boolean useNio) {
- this.useNio = useNio;
- }
-
- public boolean isDurable() {
- return durable;
- }
-
- public void setDurable(boolean durable) {
- this.durable = durable;
- }
-
- public boolean isExclusive() {
- return exclusive;
- }
-
- public void setExclusive(boolean exclusive) {
- this.exclusive = exclusive;
- }
-
- public boolean isAutoDelete() {
- return autoDelete;
- }
-
- public void setAutoDelete(boolean autoDelete) {
- this.autoDelete = autoDelete;
- }
-
- public String getContentType() {
- return contentType;
- }
-
- public void setContentType(String contentType) {
- this.contentType = contentType;
- }
-
- public String getContentEncoding() {
- return contentEncoding;
- }
-
- public void setContentEncoding(String contentEncoding) {
- this.contentEncoding = contentEncoding;
- }
-
- public String getExchangeType() {
- return exchangeType;
- }
-
- public void setExchangeType(String exchangeType) {
- this.exchangeType = exchangeType;
- }
-
- public int getDeliveryMode() {
- return deliveryMode;
- }
-
- public void setDeliveryMode(int deliveryMode) {
- this.deliveryMode = deliveryMode;
- }
-
- public boolean isUseExchange() {
- return useExchange;
- }
-
- public void setUseExchange(boolean useExchange) {
- this.useExchange = useExchange;
- }
-
- public String getListenerQueuePrefix() {
- return listenerQueuePrefix;
- }
-
- public void setListenerQueuePrefix(String listenerQueuePrefix) {
- this.listenerQueuePrefix = listenerQueuePrefix;
- }
-
- public String getQueueType() {
- return queueType;
- }
-
- /**
- * @param queueType Supports two queue types, 'classic' and 'quorum'. Classic will be be
- * deprecated in 2022 and its usage discouraged from RabbitMQ community. So not using enum
- * type here to hold different values.
- */
- public void setQueueType(String queueType) {
- this.queueType = queueType;
- }
-
- /** @return the sequentialMsgProcessing */
- public boolean isSequentialMsgProcessing() {
- return sequentialMsgProcessing;
- }
-
- /**
- * @param sequentialMsgProcessing the sequentialMsgProcessing to set Supports sequential and
- * parallel message processing capabilities. In parallel message processing, number of
- * threads are controlled by batch size. No thread control or execution framework required
- * here as threads are limited and short-lived.
- */
- public void setSequentialMsgProcessing(boolean sequentialMsgProcessing) {
- this.sequentialMsgProcessing = sequentialMsgProcessing;
- }
-
- public int getNetworkRecoveryIntervalInMilliSecs() {
- return networkRecoveryIntervalInMilliSecs;
- }
-
- public void setNetworkRecoveryIntervalInMilliSecs(int networkRecoveryIntervalInMilliSecs) {
- this.networkRecoveryIntervalInMilliSecs = networkRecoveryIntervalInMilliSecs;
- }
-
- public int getRequestHeartbeatTimeoutInSecs() {
- return requestHeartbeatTimeoutInSecs;
- }
-
- public void setRequestHeartbeatTimeoutInSecs(int requestHeartbeatTimeoutInSecs) {
- this.requestHeartbeatTimeoutInSecs = requestHeartbeatTimeoutInSecs;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProvider.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProvider.java
deleted file mode 100644
index e4eb880ce..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProvider.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.config;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.lang.NonNull;
-
-import com.netflix.conductor.contribs.queue.amqp.AMQPObservableQueue;
-import com.netflix.conductor.contribs.queue.amqp.AMQPObservableQueue.Builder;
-import com.netflix.conductor.core.events.EventQueueProvider;
-import com.netflix.conductor.core.events.queue.ObservableQueue;
-
-/** @author Ritu Parathody */
-public class AMQPEventQueueProvider implements EventQueueProvider {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(AMQPEventQueueProvider.class);
- protected Map queues = new ConcurrentHashMap<>();
- private final boolean useExchange;
- private final AMQPEventQueueProperties properties;
- private final String queueType;
-
- public AMQPEventQueueProvider(
- AMQPEventQueueProperties properties, String queueType, boolean useExchange) {
- this.properties = properties;
- this.queueType = queueType;
- this.useExchange = useExchange;
- }
-
- @Override
- public String getQueueType() {
- return queueType;
- }
-
- @Override
- @NonNull
- public ObservableQueue getQueue(String queueURI) {
- if (LOGGER.isInfoEnabled()) {
- LOGGER.info("Retrieve queue with URI {}", queueURI);
- }
- // Build the queue with the inner Builder class of AMQPObservableQueue
- return queues.computeIfAbsent(queueURI, q -> new Builder(properties).build(useExchange, q));
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPRetryPattern.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPRetryPattern.java
deleted file mode 100644
index 3890a9980..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPRetryPattern.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.config;
-
-import com.netflix.conductor.contribs.queue.amqp.util.RetryType;
-
-public class AMQPRetryPattern {
-
- private int limit = 50;
- private int duration = 1000;
- private RetryType type = RetryType.REGULARINTERVALS;
-
- public AMQPRetryPattern() {}
-
- public AMQPRetryPattern(int limit, int duration, RetryType type) {
- this.limit = limit;
- this.duration = duration;
- this.type = type;
- }
-
- /**
- * This gets executed if the retry index is within the allowed limits, otherwise exception will
- * be thrown.
- *
- * @throws Exception
- */
- public void continueOrPropogate(Exception ex, int retryIndex) throws Exception {
- if (retryIndex > limit) {
- throw ex;
- }
- // Regular Intervals is the default
- long waitDuration = duration;
- if (type == RetryType.INCREMENTALINTERVALS) {
- waitDuration = duration * retryIndex;
- } else if (type == RetryType.EXPONENTIALBACKOFF) {
- waitDuration = (long) Math.pow(2, retryIndex) * duration;
- }
- try {
- Thread.sleep(waitDuration);
- } catch (InterruptedException ignored) {
- Thread.currentThread().interrupt();
- }
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConfigurations.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConfigurations.java
deleted file mode 100644
index 9caa68383..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConfigurations.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.util;
-
-/** @author Ritu Parathody */
-public enum AMQPConfigurations {
-
- // queue exchange settings
- PARAM_EXCHANGE_TYPE("exchangeType"),
- PARAM_ROUTING_KEY("routingKey"),
- PARAM_DELIVERY_MODE("deliveryMode"),
- PARAM_DURABLE("durable"),
- PARAM_EXCLUSIVE("exclusive"),
- PARAM_AUTO_DELETE("autoDelete"),
- PARAM_MAX_PRIORITY("maxPriority");
-
- String propertyName;
-
- AMQPConfigurations(String propertyName) {
- this.propertyName = propertyName;
- }
-
- @Override
- public String toString() {
- return propertyName;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConstants.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConstants.java
deleted file mode 100644
index f8f06aece..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConstants.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.util;
-
-/** @author Ritu Parathody */
-public class AMQPConstants {
-
- /** this when set will create a rabbitmq queue */
- public static String AMQP_QUEUE_TYPE = "amqp_queue";
- /** this when set will create a rabbitmq exchange */
- public static String AMQP_EXCHANGE_TYPE = "amqp_exchange";
-
- public static String PROPERTY_KEY_TEMPLATE = "conductor.event-queues.amqp.%s";
-
- /** default content type for the message read from rabbitmq */
- public static String DEFAULT_CONTENT_TYPE = "application/json";
-
- /** default encoding for the message read from rabbitmq */
- public static String DEFAULT_CONTENT_ENCODING = "UTF-8";
-
- /** default rabbitmq exchange type */
- public static String DEFAULT_EXCHANGE_TYPE = "topic";
-
- /**
- * default rabbitmq durability When set to true the queues are persisted to the disk.
- *
- *
{@see RabbitMQ }.
- */
- public static boolean DEFAULT_DURABLE = true;
-
- /**
- * default rabbitmq exclusivity When set to true the queues can be only used by one connection.
- *
- *
{@see RabbitMQ }.
- */
- public static boolean DEFAULT_EXCLUSIVE = false;
-
- /**
- * default rabbitmq auto delete When set to true the queues will be deleted when the last
- * consumer is cancelled
- *
- *
{@see RabbitMQ }.
- */
- public static boolean DEFAULT_AUTO_DELETE = false;
- /**
- * default rabbitmq delivery mode This is a property of the message When set to 1 the will be
- * non persistent and 2 will be persistent {@see Consumer Prefetch }.
- */
- public static int DEFAULT_BATCH_SIZE = 1;
- /**
- * default rabbitmq delivery mode This is a property of the amqp implementation which sets teh
- * polling time to drain the in-memory queue.
- */
- public static int DEFAULT_POLL_TIME_MS = 100;
-
- // info channel messages.
- public static final String INFO_CHANNEL_BORROW_SUCCESS =
- "Borrowed the channel object from the channel pool for " + "the connection type [%s]";
- public static final String INFO_CHANNEL_RETURN_SUCCESS =
- "Returned the borrowed channel object to the pool for " + "the connection type [%s]";
- public static final String INFO_CHANNEL_CREATION_SUCCESS =
- "Channels are not available in the pool. Created a"
- + " channel for the connection type [%s]";
- public static final String INFO_CHANNEL_RESET_SUCCESS =
- "No proper channels available in the pool. Created a "
- + "channel for the connection type [%s]";
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPSettings.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPSettings.java
deleted file mode 100644
index 7ca2c5140..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPSettings.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.util;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties;
-
-import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_AUTO_DELETE;
-import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_DELIVERY_MODE;
-import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_DURABLE;
-import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_EXCHANGE_TYPE;
-import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_EXCLUSIVE;
-import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_MAX_PRIORITY;
-import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_ROUTING_KEY;
-
-/** @author Ritu Parathody */
-public class AMQPSettings {
-
- private static final Pattern URI_PATTERN =
- Pattern.compile(
- "^(?:amqp\\_(queue|exchange))?\\:?(?[^\\?]+)\\??(?.*)$",
- Pattern.CASE_INSENSITIVE);
-
- private String queueOrExchangeName;
- private String eventName;
- private String exchangeType;
- private String queueType;
- private String routingKey;
- private final String contentEncoding;
- private final String contentType;
- private boolean durable;
- private boolean exclusive;
- private boolean autoDelete;
- private boolean sequentialProcessing;
- private int deliveryMode;
-
- private final Map arguments = new HashMap<>();
- private static final Logger LOGGER = LoggerFactory.getLogger(AMQPSettings.class);
-
- public AMQPSettings(final AMQPEventQueueProperties properties) {
- // Initialize with a default values
- durable = properties.isDurable();
- exclusive = properties.isExclusive();
- autoDelete = properties.isAutoDelete();
- contentType = properties.getContentType();
- contentEncoding = properties.getContentEncoding();
- exchangeType = properties.getExchangeType();
- routingKey = StringUtils.EMPTY;
- queueType = properties.getQueueType();
- sequentialProcessing = properties.isSequentialMsgProcessing();
- // Set common settings for publishing and consuming
- setDeliveryMode(properties.getDeliveryMode());
- }
-
- public final boolean isDurable() {
- return durable;
- }
-
- public final boolean isExclusive() {
- return exclusive;
- }
-
- public final boolean autoDelete() {
- return autoDelete;
- }
-
- public final Map getArguments() {
- return arguments;
- }
-
- public final String getContentEncoding() {
- return contentEncoding;
- }
-
- /**
- * Use queue for publishing
- *
- * @param queueName the name of queue
- */
- public void setQueue(String queueName) {
- if (StringUtils.isEmpty(queueName)) {
- throw new IllegalArgumentException("Queue name for publishing is undefined");
- }
- this.queueOrExchangeName = queueName;
- }
-
- public String getQueueOrExchangeName() {
- return queueOrExchangeName;
- }
-
- public String getExchangeType() {
- return exchangeType;
- }
-
- public String getRoutingKey() {
- return routingKey;
- }
-
- public int getDeliveryMode() {
- return deliveryMode;
- }
-
- public AMQPSettings setDeliveryMode(int deliveryMode) {
- if (deliveryMode != 1 && deliveryMode != 2) {
- throw new IllegalArgumentException("Delivery mode must be 1 or 2");
- }
- this.deliveryMode = deliveryMode;
- return this;
- }
-
- public String getContentType() {
- return contentType;
- }
-
- /**
- * Complete settings from the queue URI.
- *
- * Example for queue:
- *
- *
- * amqp-queue:myQueue?deliveryMode=1&autoDelete=true&exclusive=true
- *
- *
- * Example for exchange:
- *
- *
- * amqp-exchange:myExchange?exchangeType=topic&routingKey=myRoutingKey&exclusive=true
- *
- *
- * @param queueURI
- * @return
- */
- public final AMQPSettings fromURI(final String queueURI) {
- final Matcher matcher = URI_PATTERN.matcher(queueURI);
- if (!matcher.matches()) {
- throw new IllegalArgumentException("Queue URI doesn't matches the expected regexp");
- }
-
- // Set name of queue or exchange from group "name"
- LOGGER.info("Queue URI:{}", queueURI);
- queueOrExchangeName = matcher.group("name");
- eventName = queueURI;
- if (matcher.groupCount() > 1) {
- final String queryParams = matcher.group("params");
- if (StringUtils.isNotEmpty(queryParams)) {
- // Handle parameters
- Arrays.stream(queryParams.split("\\s*\\&\\s*"))
- .forEach(
- param -> {
- final String[] kv = param.split("\\s*=\\s*");
- if (kv.length == 2) {
- if (kv[0].equalsIgnoreCase(
- String.valueOf(PARAM_EXCHANGE_TYPE))) {
- String value = kv[1];
- if (StringUtils.isEmpty(value)) {
- throw new IllegalArgumentException(
- "The provided exchange type is empty");
- }
- exchangeType = value;
- }
- if (kv[0].equalsIgnoreCase(
- (String.valueOf(PARAM_ROUTING_KEY)))) {
- String value = kv[1];
- if (StringUtils.isEmpty(value)) {
- throw new IllegalArgumentException(
- "The provided routing key is empty");
- }
- routingKey = value;
- }
- if (kv[0].equalsIgnoreCase(
- (String.valueOf(PARAM_DURABLE)))) {
- durable = Boolean.parseBoolean(kv[1]);
- }
- if (kv[0].equalsIgnoreCase(
- (String.valueOf(PARAM_EXCLUSIVE)))) {
- exclusive = Boolean.parseBoolean(kv[1]);
- }
- if (kv[0].equalsIgnoreCase(
- (String.valueOf(PARAM_AUTO_DELETE)))) {
- autoDelete = Boolean.parseBoolean(kv[1]);
- }
- if (kv[0].equalsIgnoreCase(
- (String.valueOf(PARAM_DELIVERY_MODE)))) {
- setDeliveryMode(Integer.parseInt(kv[1]));
- }
- if (kv[0].equalsIgnoreCase(
- (String.valueOf(PARAM_MAX_PRIORITY)))) {
- arguments.put("x-max-priority", Integer.valueOf(kv[1]));
- }
- }
- });
- }
- }
- return this;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (!(obj instanceof AMQPSettings)) return false;
- AMQPSettings other = (AMQPSettings) obj;
- return Objects.equals(arguments, other.arguments)
- && autoDelete == other.autoDelete
- && Objects.equals(contentEncoding, other.contentEncoding)
- && Objects.equals(contentType, other.contentType)
- && deliveryMode == other.deliveryMode
- && durable == other.durable
- && Objects.equals(eventName, other.eventName)
- && Objects.equals(exchangeType, other.exchangeType)
- && exclusive == other.exclusive
- && Objects.equals(queueOrExchangeName, other.queueOrExchangeName)
- && Objects.equals(queueType, other.queueType)
- && Objects.equals(routingKey, other.routingKey)
- && sequentialProcessing == other.sequentialProcessing;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(
- arguments,
- autoDelete,
- contentEncoding,
- contentType,
- deliveryMode,
- durable,
- eventName,
- exchangeType,
- exclusive,
- queueOrExchangeName,
- queueType,
- routingKey,
- sequentialProcessing);
- }
-
- @Override
- public String toString() {
- return "AMQPSettings [queueOrExchangeName="
- + queueOrExchangeName
- + ", eventName="
- + eventName
- + ", exchangeType="
- + exchangeType
- + ", queueType="
- + queueType
- + ", routingKey="
- + routingKey
- + ", contentEncoding="
- + contentEncoding
- + ", contentType="
- + contentType
- + ", durable="
- + durable
- + ", exclusive="
- + exclusive
- + ", autoDelete="
- + autoDelete
- + ", sequentialProcessing="
- + sequentialProcessing
- + ", deliveryMode="
- + deliveryMode
- + ", arguments="
- + arguments
- + "]";
- }
-
- public String getEventName() {
- return eventName;
- }
-
- /** @return the queueType */
- public String getQueueType() {
- return queueType;
- }
-
- /** @return the sequentialProcessing */
- public boolean isSequentialProcessing() {
- return sequentialProcessing;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/ConnectionType.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/ConnectionType.java
deleted file mode 100644
index d1f06ff99..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/ConnectionType.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.util;
-
-public enum ConnectionType {
- PUBLISHER,
- SUBSCRIBER
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/RetryType.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/RetryType.java
deleted file mode 100644
index a8b072576..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/RetryType.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp.util;
-
-/** RetryType holds the retry type */
-public enum RetryType {
- REGULARINTERVALS,
- EXPONENTIALBACKOFF,
- INCREMENTALINTERVALS
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSAbstractQueue.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSAbstractQueue.java
deleted file mode 100644
index fcb89740c..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSAbstractQueue.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.nats;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.netflix.conductor.core.events.queue.Message;
-import com.netflix.conductor.core.events.queue.ObservableQueue;
-
-import io.nats.client.NUID;
-import rx.Observable;
-import rx.Scheduler;
-
-/** @author Oleksiy Lysak */
-public abstract class NATSAbstractQueue implements ObservableQueue {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(NATSAbstractQueue.class);
- protected LinkedBlockingQueue messages = new LinkedBlockingQueue<>();
- protected final Lock mu = new ReentrantLock();
- private final String queueType;
- private ScheduledExecutorService execs;
- private final Scheduler scheduler;
-
- protected final String queueURI;
- protected final String subject;
- protected String queue;
-
- // Indicates that observe was called (Event Handler) and we must to re-initiate subscription
- // upon reconnection
- private boolean observable;
- private boolean isOpened;
- private volatile boolean running;
-
- NATSAbstractQueue(String queueURI, String queueType, Scheduler scheduler) {
- this.queueURI = queueURI;
- this.queueType = queueType;
- this.scheduler = scheduler;
-
- // If queue specified (e.g. subject:queue) - split to subject & queue
- if (queueURI.contains(":")) {
- this.subject = queueURI.substring(0, queueURI.indexOf(':'));
- queue = queueURI.substring(queueURI.indexOf(':') + 1);
- } else {
- this.subject = queueURI;
- queue = null;
- }
- LOGGER.info(
- String.format(
- "Initialized with queueURI=%s, subject=%s, queue=%s",
- queueURI, subject, queue));
- }
-
- void onMessage(String subject, byte[] data) {
- String payload = new String(data);
- LOGGER.info(String.format("Received message for %s: %s", subject, payload));
-
- Message dstMsg = new Message();
- dstMsg.setId(NUID.nextGlobal());
- dstMsg.setPayload(payload);
-
- messages.add(dstMsg);
- }
-
- @Override
- public Observable observe() {
- LOGGER.info("Observe invoked for queueURI " + queueURI);
- observable = true;
-
- mu.lock();
- try {
- subscribe();
- } finally {
- mu.unlock();
- }
-
- Observable.OnSubscribe onSubscribe =
- subscriber -> {
- Observable interval =
- Observable.interval(100, TimeUnit.MILLISECONDS, scheduler);
- interval.flatMap(
- (Long x) -> {
- if (!isRunning()) {
- LOGGER.debug(
- "Component stopped, skip listening for messages from NATS Queue");
- return Observable.from(Collections.emptyList());
- } else {
- List available = new LinkedList<>();
- messages.drainTo(available);
-
- if (!available.isEmpty()) {
- AtomicInteger count = new AtomicInteger(0);
- StringBuilder buffer = new StringBuilder();
- available.forEach(
- msg -> {
- buffer.append(msg.getId())
- .append("=")
- .append(msg.getPayload());
- count.incrementAndGet();
-
- if (count.get() < available.size()) {
- buffer.append(",");
- }
- });
- LOGGER.info(
- String.format(
- "Batch from %s to conductor is %s",
- subject, buffer.toString()));
- }
-
- return Observable.from(available);
- }
- })
- .subscribe(subscriber::onNext, subscriber::onError);
- };
- return Observable.create(onSubscribe);
- }
-
- @Override
- public String getType() {
- return queueType;
- }
-
- @Override
- public String getName() {
- return queueURI;
- }
-
- @Override
- public String getURI() {
- return queueURI;
- }
-
- @Override
- public List ack(List messages) {
- return Collections.emptyList();
- }
-
- @Override
- public void setUnackTimeout(Message message, long unackTimeout) {}
-
- @Override
- public long size() {
- return messages.size();
- }
-
- @Override
- public void publish(List messages) {
- messages.forEach(
- message -> {
- try {
- String payload = message.getPayload();
- publish(subject, payload.getBytes());
- LOGGER.info(String.format("Published message to %s: %s", subject, payload));
- } catch (Exception ex) {
- LOGGER.error(
- "Failed to publish message "
- + message.getPayload()
- + " to "
- + subject,
- ex);
- throw new RuntimeException(ex);
- }
- });
- }
-
- @Override
- public boolean rePublishIfNoAck() {
- return true;
- }
-
- @Override
- public void close() {
- LOGGER.info("Closing connection for " + queueURI);
- mu.lock();
- try {
- if (execs != null) {
- execs.shutdownNow();
- execs = null;
- }
- closeSubs();
- closeConn();
- isOpened = false;
- } finally {
- mu.unlock();
- }
- }
-
- public void open() {
- // do nothing if not closed
- if (isOpened) {
- return;
- }
-
- mu.lock();
- try {
- try {
- connect();
-
- // Re-initiated subscription if existed
- if (observable) {
- subscribe();
- }
- } catch (Exception ignore) {
- }
-
- execs = Executors.newScheduledThreadPool(1);
- execs.scheduleAtFixedRate(this::monitor, 0, 500, TimeUnit.MILLISECONDS);
- isOpened = true;
- } finally {
- mu.unlock();
- }
- }
-
- private void monitor() {
- if (isConnected()) {
- return;
- }
-
- LOGGER.error("Monitor invoked for " + queueURI);
- mu.lock();
- try {
- closeSubs();
- closeConn();
-
- // Connect
- connect();
-
- // Re-initiated subscription if existed
- if (observable) {
- subscribe();
- }
- } catch (Exception ex) {
- LOGGER.error("Monitor failed with " + ex.getMessage() + " for " + queueURI, ex);
- } finally {
- mu.unlock();
- }
- }
-
- public boolean isClosed() {
- return !isOpened;
- }
-
- void ensureConnected() {
- if (!isConnected()) {
- throw new RuntimeException("No nats connection");
- }
- }
-
- @Override
- public void start() {
- LOGGER.info("Started listening to {}:{}", getClass().getSimpleName(), queueURI);
- running = true;
- }
-
- @Override
- public void stop() {
- LOGGER.info("Stopped listening to {}:{}", getClass().getSimpleName(), queueURI);
- running = false;
- }
-
- @Override
- public boolean isRunning() {
- return running;
- }
-
- abstract void connect();
-
- abstract boolean isConnected();
-
- abstract void publish(String subject, byte[] data) throws Exception;
-
- abstract void subscribe();
-
- abstract void closeSubs();
-
- abstract void closeConn();
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSObservableQueue.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSObservableQueue.java
deleted file mode 100644
index 27c13a0c9..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSObservableQueue.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.nats;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.nats.client.Connection;
-import io.nats.client.ConnectionFactory;
-import io.nats.client.Subscription;
-import rx.Scheduler;
-
-/** @author Oleksiy Lysak */
-public class NATSObservableQueue extends NATSAbstractQueue {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(NATSObservableQueue.class);
- private final ConnectionFactory fact;
- private Subscription subs;
- private Connection conn;
-
- public NATSObservableQueue(ConnectionFactory factory, String queueURI, Scheduler scheduler) {
- super(queueURI, "nats", scheduler);
- this.fact = factory;
- open();
- }
-
- @Override
- public boolean isConnected() {
- return (conn != null && conn.isConnected());
- }
-
- @Override
- public void connect() {
- try {
- Connection temp = fact.createConnection();
- LOGGER.info("Successfully connected for " + queueURI);
- temp.setReconnectedCallback(
- (event) -> LOGGER.warn("onReconnect. Reconnected back for " + queueURI));
- temp.setDisconnectedCallback(
- (event -> LOGGER.warn("onDisconnect. Disconnected for " + queueURI)));
- conn = temp;
- } catch (Exception e) {
- LOGGER.error("Unable to establish nats connection for " + queueURI, e);
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void subscribe() {
- // do nothing if already subscribed
- if (subs != null) {
- return;
- }
-
- try {
- ensureConnected();
- // Create subject/queue subscription if the queue has been provided
- if (StringUtils.isNotEmpty(queue)) {
- LOGGER.info(
- "No subscription. Creating a queue subscription. subject={}, queue={}",
- subject,
- queue);
- subs =
- conn.subscribe(
- subject, queue, msg -> onMessage(msg.getSubject(), msg.getData()));
- } else {
- LOGGER.info(
- "No subscription. Creating a pub/sub subscription. subject={}", subject);
- subs = conn.subscribe(subject, msg -> onMessage(msg.getSubject(), msg.getData()));
- }
- } catch (Exception ex) {
- LOGGER.error(
- "Subscription failed with " + ex.getMessage() + " for queueURI " + queueURI,
- ex);
- }
- }
-
- @Override
- public void publish(String subject, byte[] data) throws Exception {
- ensureConnected();
- conn.publish(subject, data);
- }
-
- @Override
- public void closeSubs() {
- if (subs != null) {
- try {
- subs.close();
- } catch (Exception ex) {
- LOGGER.error("closeSubs failed with " + ex.getMessage() + " for " + queueURI, ex);
- }
- subs = null;
- }
- }
-
- @Override
- public void closeConn() {
- if (conn != null) {
- try {
- conn.close();
- } catch (Exception ex) {
- LOGGER.error("closeConn failed with " + ex.getMessage() + " for " + queueURI, ex);
- }
- conn = null;
- }
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSStreamObservableQueue.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSStreamObservableQueue.java
deleted file mode 100644
index c3defb72b..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSStreamObservableQueue.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.nats;
-
-import java.util.UUID;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.nats.streaming.StreamingConnection;
-import io.nats.streaming.StreamingConnectionFactory;
-import io.nats.streaming.Subscription;
-import io.nats.streaming.SubscriptionOptions;
-import rx.Scheduler;
-
-/** @author Oleksiy Lysak */
-public class NATSStreamObservableQueue extends NATSAbstractQueue {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(NATSStreamObservableQueue.class);
- private final StreamingConnectionFactory fact;
- private StreamingConnection conn;
- private Subscription subs;
- private final String durableName;
-
- public NATSStreamObservableQueue(
- String clusterId,
- String natsUrl,
- String durableName,
- String queueURI,
- Scheduler scheduler) {
- super(queueURI, "nats_stream", scheduler);
- this.fact = new StreamingConnectionFactory();
- this.fact.setClusterId(clusterId);
- this.fact.setClientId(UUID.randomUUID().toString());
- this.fact.setNatsUrl(natsUrl);
- this.durableName = durableName;
- open();
- }
-
- @Override
- public boolean isConnected() {
- return (conn != null
- && conn.getNatsConnection() != null
- && conn.getNatsConnection().isConnected());
- }
-
- @Override
- public void connect() {
- try {
- StreamingConnection temp = fact.createConnection();
- LOGGER.info("Successfully connected for " + queueURI);
- temp.getNatsConnection()
- .setReconnectedCallback(
- (event) ->
- LOGGER.warn("onReconnect. Reconnected back for " + queueURI));
- temp.getNatsConnection()
- .setDisconnectedCallback(
- (event -> LOGGER.warn("onDisconnect. Disconnected for " + queueURI)));
- conn = temp;
- } catch (Exception e) {
- LOGGER.error("Unable to establish nats streaming connection for " + queueURI, e);
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void subscribe() {
- // do nothing if already subscribed
- if (subs != null) {
- return;
- }
-
- try {
- ensureConnected();
- SubscriptionOptions subscriptionOptions =
- new SubscriptionOptions.Builder().durableName(durableName).build();
- // Create subject/queue subscription if the queue has been provided
- if (StringUtils.isNotEmpty(queue)) {
- LOGGER.info(
- "No subscription. Creating a queue subscription. subject={}, queue={}",
- subject,
- queue);
- subs =
- conn.subscribe(
- subject,
- queue,
- msg -> onMessage(msg.getSubject(), msg.getData()),
- subscriptionOptions);
- } else {
- LOGGER.info(
- "No subscription. Creating a pub/sub subscription. subject={}", subject);
- subs =
- conn.subscribe(
- subject,
- msg -> onMessage(msg.getSubject(), msg.getData()),
- subscriptionOptions);
- }
- } catch (Exception ex) {
- LOGGER.error(
- "Subscription failed with " + ex.getMessage() + " for queueURI " + queueURI,
- ex);
- }
- }
-
- @Override
- public void publish(String subject, byte[] data) throws Exception {
- ensureConnected();
- conn.publish(subject, data);
- }
-
- @Override
- public void closeSubs() {
- if (subs != null) {
- try {
- subs.close(true);
- } catch (Exception ex) {
- LOGGER.error("closeSubs failed with " + ex.getMessage() + " for " + queueURI, ex);
- }
- subs = null;
- }
- }
-
- @Override
- public void closeConn() {
- if (conn != null) {
- try {
- conn.close();
- } catch (Exception ex) {
- LOGGER.error("closeConn failed with " + ex.getMessage() + " for " + queueURI, ex);
- }
- conn = null;
- }
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSConfiguration.java
deleted file mode 100644
index 19eb05f4f..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSConfiguration.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.nats.config;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.env.Environment;
-
-import com.netflix.conductor.core.events.EventQueueProvider;
-
-import rx.Scheduler;
-
-@Configuration
-@ConditionalOnProperty(name = "conductor.event-queues.nats.enabled", havingValue = "true")
-public class NATSConfiguration {
-
- @Bean
- public EventQueueProvider natsEventQueueProvider(Environment environment, Scheduler scheduler) {
- return new NATSEventQueueProvider(environment, scheduler);
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSEventQueueProvider.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSEventQueueProvider.java
deleted file mode 100644
index 5c5e7f971..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSEventQueueProvider.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.nats.config;
-
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.env.Environment;
-import org.springframework.lang.NonNull;
-
-import com.netflix.conductor.contribs.queue.nats.NATSObservableQueue;
-import com.netflix.conductor.core.events.EventQueueProvider;
-import com.netflix.conductor.core.events.queue.ObservableQueue;
-
-import io.nats.client.ConnectionFactory;
-import rx.Scheduler;
-
-/** @author Oleksiy Lysak */
-public class NATSEventQueueProvider implements EventQueueProvider {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(NATSEventQueueProvider.class);
-
- protected Map queues = new ConcurrentHashMap<>();
- private final ConnectionFactory factory;
- private final Scheduler scheduler;
-
- public NATSEventQueueProvider(Environment environment, Scheduler scheduler) {
- this.scheduler = scheduler;
- LOGGER.info("NATS Event Queue Provider init");
-
- // Init NATS API. Handle "io_nats" and "io.nats" ways to specify parameters
- Properties props = new Properties();
- Properties temp = new Properties();
- temp.putAll(System.getenv());
- temp.putAll(System.getProperties());
- temp.forEach(
- (k, v) -> {
- String key = k.toString();
- String val = v.toString();
-
- if (key.startsWith("io_nats")) {
- key = key.replace("_", ".");
- }
- props.put(key, environment.getProperty(key, val));
- });
-
- // Init NATS API
- factory = new ConnectionFactory(props);
- LOGGER.info("NATS Event Queue Provider initialized...");
- }
-
- @Override
- public String getQueueType() {
- return "nats";
- }
-
- @Override
- @NonNull
- public ObservableQueue getQueue(String queueURI) {
- NATSObservableQueue queue =
- queues.computeIfAbsent(
- queueURI, q -> new NATSObservableQueue(factory, queueURI, scheduler));
- if (queue.isClosed()) {
- queue.open();
- }
- return queue;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamConfiguration.java
deleted file mode 100644
index 3721e460f..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamConfiguration.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.nats.config;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import com.netflix.conductor.common.metadata.tasks.Task;
-import com.netflix.conductor.contribs.queue.nats.NATSStreamObservableQueue;
-import com.netflix.conductor.core.config.ConductorProperties;
-import com.netflix.conductor.core.events.EventQueueProvider;
-import com.netflix.conductor.core.events.queue.ObservableQueue;
-
-import rx.Scheduler;
-
-@Configuration
-@EnableConfigurationProperties(NATSStreamProperties.class)
-@ConditionalOnProperty(name = "conductor.event-queues.nats-stream.enabled", havingValue = "true")
-public class NATSStreamConfiguration {
-
- @Bean
- public EventQueueProvider natsEventQueueProvider(
- NATSStreamProperties properties, Scheduler scheduler) {
- return new NATSStreamEventQueueProvider(properties, scheduler);
- }
-
- @ConditionalOnProperty(name = "conductor.default-event-queue.type", havingValue = "nats_stream")
- @Bean
- public Map getQueues(
- ConductorProperties conductorProperties,
- NATSStreamProperties properties,
- Scheduler scheduler) {
- String stack = "";
- if (conductorProperties.getStack() != null && conductorProperties.getStack().length() > 0) {
- stack = conductorProperties.getStack() + "_";
- }
- Task.Status[] statuses = new Task.Status[] {Task.Status.COMPLETED, Task.Status.FAILED};
- Map queues = new HashMap<>();
- for (Task.Status status : statuses) {
- String queuePrefix =
- StringUtils.isBlank(properties.getListenerQueuePrefix())
- ? conductorProperties.getAppId() + "_nats_stream_notify_" + stack
- : properties.getListenerQueuePrefix();
-
- String queueName = queuePrefix + status.name();
-
- ObservableQueue queue =
- new NATSStreamObservableQueue(
- properties.getClusterId(),
- properties.getUrl(),
- properties.getDurableName(),
- queueName,
- scheduler);
- queues.put(status, queue);
- }
-
- return queues;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamEventQueueProvider.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamEventQueueProvider.java
deleted file mode 100644
index 133a79959..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamEventQueueProvider.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.nats.config;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.lang.NonNull;
-
-import com.netflix.conductor.contribs.queue.nats.NATSStreamObservableQueue;
-import com.netflix.conductor.core.events.EventQueueProvider;
-import com.netflix.conductor.core.events.queue.ObservableQueue;
-
-import rx.Scheduler;
-
-/** @author Oleksiy Lysak */
-public class NATSStreamEventQueueProvider implements EventQueueProvider {
-
- private static final Logger LOGGER =
- LoggerFactory.getLogger(NATSStreamEventQueueProvider.class);
- protected final Map queues = new ConcurrentHashMap<>();
- private final String durableName;
- private final String clusterId;
- private final String natsUrl;
- private final Scheduler scheduler;
-
- public NATSStreamEventQueueProvider(NATSStreamProperties properties, Scheduler scheduler) {
- LOGGER.info("NATS Stream Event Queue Provider init");
- this.scheduler = scheduler;
-
- // Get NATS Streaming options
- clusterId = properties.getClusterId();
- durableName = properties.getDurableName();
- natsUrl = properties.getUrl();
-
- LOGGER.info(
- "NATS Streaming clusterId="
- + clusterId
- + ", natsUrl="
- + natsUrl
- + ", durableName="
- + durableName);
- LOGGER.info("NATS Stream Event Queue Provider initialized...");
- }
-
- @Override
- public String getQueueType() {
- return "nats_stream";
- }
-
- @Override
- @NonNull
- public ObservableQueue getQueue(String queueURI) {
- NATSStreamObservableQueue queue =
- queues.computeIfAbsent(
- queueURI,
- q ->
- new NATSStreamObservableQueue(
- clusterId, natsUrl, durableName, queueURI, scheduler));
- if (queue.isClosed()) {
- queue.open();
- }
- return queue;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamProperties.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamProperties.java
deleted file mode 100644
index c949963df..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamProperties.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.nats.config;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import io.nats.client.Nats;
-
-@ConfigurationProperties("conductor.event-queues.nats-stream")
-public class NATSStreamProperties {
-
- /** The cluster id of the STAN session */
- private String clusterId = "test-cluster";
-
- /** The durable subscriber name for the subscription */
- private String durableName = null;
-
- /** The NATS connection url */
- private String url = Nats.DEFAULT_URL;
-
- /** The prefix to be used for the default listener queues */
- private String listenerQueuePrefix = "";
-
- public String getClusterId() {
- return clusterId;
- }
-
- public void setClusterId(String clusterId) {
- this.clusterId = clusterId;
- }
-
- public String getDurableName() {
- return durableName;
- }
-
- public void setDurableName(String durableName) {
- this.durableName = durableName;
- }
-
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public String getListenerQueuePrefix() {
- return listenerQueuePrefix;
- }
-
- public void setListenerQueuePrefix(String listenerQueuePrefix) {
- this.listenerQueuePrefix = listenerQueuePrefix;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java b/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java
deleted file mode 100644
index 4095af478..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.tasks.kafka;
-
-import java.time.Duration;
-import java.util.Objects;
-import java.util.Properties;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.kafka.clients.producer.KafkaProducer;
-import org.apache.kafka.clients.producer.Producer;
-import org.apache.kafka.clients.producer.ProducerConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.RemovalListener;
-
-@SuppressWarnings("rawtypes")
-@Component
-public class KafkaProducerManager {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(KafkaProducerManager.class);
-
- private final String requestTimeoutConfig;
- private final Cache kafkaProducerCache;
- private final String maxBlockMsConfig;
-
- private static final String STRING_SERIALIZER =
- "org.apache.kafka.common.serialization.StringSerializer";
- private static final RemovalListener LISTENER =
- notification -> {
- if (notification.getValue() != null) {
- notification.getValue().close();
- LOGGER.info("Closed producer for {}", notification.getKey());
- }
- };
-
- @Autowired
- public KafkaProducerManager(
- @Value("${conductor.tasks.kafka-publish.requestTimeout:100ms}") Duration requestTimeout,
- @Value("${conductor.tasks.kafka-publish.maxBlock:500ms}") Duration maxBlock,
- @Value("${conductor.tasks.kafka-publish.cacheSize:10}") int cacheSize,
- @Value("${conductor.tasks.kafka-publish.cacheTime:120000ms}") Duration cacheTime) {
- this.requestTimeoutConfig = String.valueOf(requestTimeout.toMillis());
- this.maxBlockMsConfig = String.valueOf(maxBlock.toMillis());
- this.kafkaProducerCache =
- CacheBuilder.newBuilder()
- .removalListener(LISTENER)
- .maximumSize(cacheSize)
- .expireAfterAccess(cacheTime.toMillis(), TimeUnit.MILLISECONDS)
- .build();
- }
-
- public Producer getProducer(KafkaPublishTask.Input input) {
- Properties configProperties = getProducerProperties(input);
- return getFromCache(configProperties, () -> new KafkaProducer(configProperties));
- }
-
- @VisibleForTesting
- Producer getFromCache(Properties configProperties, Callable createProducerCallable) {
- try {
- return kafkaProducerCache.get(configProperties, createProducerCallable);
- } catch (ExecutionException e) {
- throw new RuntimeException(e);
- }
- }
-
- @VisibleForTesting
- Properties getProducerProperties(KafkaPublishTask.Input input) {
-
- Properties configProperties = new Properties();
- configProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, input.getBootStrapServers());
-
- configProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, input.getKeySerializer());
-
- String requestTimeoutMs = requestTimeoutConfig;
-
- if (Objects.nonNull(input.getRequestTimeoutMs())) {
- requestTimeoutMs = String.valueOf(input.getRequestTimeoutMs());
- }
-
- String maxBlockMs = maxBlockMsConfig;
-
- if (Objects.nonNull(input.getMaxBlockMs())) {
- maxBlockMs = String.valueOf(input.getMaxBlockMs());
- }
-
- configProperties.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, requestTimeoutMs);
- configProperties.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, maxBlockMs);
- configProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, STRING_SERIALIZER);
- return configProperties;
- }
-}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java b/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java
deleted file mode 100644
index 8ec91a039..000000000
--- a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.tasks.kafka;
-
-import java.time.Instant;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.stream.Collectors;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.kafka.clients.producer.Producer;
-import org.apache.kafka.clients.producer.ProducerRecord;
-import org.apache.kafka.clients.producer.RecordMetadata;
-import org.apache.kafka.common.header.Header;
-import org.apache.kafka.common.header.internals.RecordHeader;
-import org.apache.kafka.common.serialization.IntegerSerializer;
-import org.apache.kafka.common.serialization.LongSerializer;
-import org.apache.kafka.common.serialization.StringSerializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import com.netflix.conductor.core.execution.WorkflowExecutor;
-import com.netflix.conductor.core.execution.tasks.WorkflowSystemTask;
-import com.netflix.conductor.core.utils.Utils;
-import com.netflix.conductor.model.TaskModel;
-import com.netflix.conductor.model.WorkflowModel;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.annotations.VisibleForTesting;
-
-import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_KAFKA_PUBLISH;
-
-@Component(TASK_TYPE_KAFKA_PUBLISH)
-public class KafkaPublishTask extends WorkflowSystemTask {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(KafkaPublishTask.class);
-
- static final String REQUEST_PARAMETER_NAME = "kafka_request";
- private static final String MISSING_REQUEST =
- "Missing Kafka request. Task input MUST have a '"
- + REQUEST_PARAMETER_NAME
- + "' key with KafkaTask.Input as value. See documentation for KafkaTask for required input parameters";
- private static final String MISSING_BOOT_STRAP_SERVERS = "No boot strap servers specified";
- private static final String MISSING_KAFKA_TOPIC =
- "Missing Kafka topic. See documentation for KafkaTask for required input parameters";
- private static final String MISSING_KAFKA_VALUE =
- "Missing Kafka value. See documentation for KafkaTask for required input parameters";
- private static final String FAILED_TO_INVOKE = "Failed to invoke kafka task due to: ";
-
- private final ObjectMapper objectMapper;
- private final String requestParameter;
- private final KafkaProducerManager producerManager;
-
- @Autowired
- public KafkaPublishTask(KafkaProducerManager clientManager, ObjectMapper objectMapper) {
- super(TASK_TYPE_KAFKA_PUBLISH);
- this.requestParameter = REQUEST_PARAMETER_NAME;
- this.producerManager = clientManager;
- this.objectMapper = objectMapper;
- LOGGER.info("KafkaTask initialized.");
- }
-
- @Override
- public void start(WorkflowModel workflow, TaskModel task, WorkflowExecutor executor) {
-
- long taskStartMillis = Instant.now().toEpochMilli();
- task.setWorkerId(Utils.getServerId());
- Object request = task.getInputData().get(requestParameter);
-
- if (Objects.isNull(request)) {
- markTaskAsFailed(task, MISSING_REQUEST);
- return;
- }
-
- Input input = objectMapper.convertValue(request, Input.class);
-
- if (StringUtils.isBlank(input.getBootStrapServers())) {
- markTaskAsFailed(task, MISSING_BOOT_STRAP_SERVERS);
- return;
- }
-
- if (StringUtils.isBlank(input.getTopic())) {
- markTaskAsFailed(task, MISSING_KAFKA_TOPIC);
- return;
- }
-
- if (Objects.isNull(input.getValue())) {
- markTaskAsFailed(task, MISSING_KAFKA_VALUE);
- return;
- }
-
- try {
- Future recordMetaDataFuture = kafkaPublish(input);
- try {
- recordMetaDataFuture.get();
- if (isAsyncComplete(task)) {
- task.setStatus(TaskModel.Status.IN_PROGRESS);
- } else {
- task.setStatus(TaskModel.Status.COMPLETED);
- }
- long timeTakenToCompleteTask = Instant.now().toEpochMilli() - taskStartMillis;
- LOGGER.debug("Published message {}, Time taken {}", input, timeTakenToCompleteTask);
-
- } catch (ExecutionException ec) {
- LOGGER.error(
- "Failed to invoke kafka task: {} - execution exception ",
- task.getTaskId(),
- ec);
- markTaskAsFailed(task, FAILED_TO_INVOKE + ec.getMessage());
- }
- } catch (Exception e) {
- LOGGER.error(
- "Failed to invoke kafka task:{} for input {} - unknown exception",
- task.getTaskId(),
- input,
- e);
- markTaskAsFailed(task, FAILED_TO_INVOKE + e.getMessage());
- }
- }
-
- private void markTaskAsFailed(TaskModel task, String reasonForIncompletion) {
- task.setReasonForIncompletion(reasonForIncompletion);
- task.setStatus(TaskModel.Status.FAILED);
- }
-
- /**
- * @param input Kafka Request
- * @return Future for execution.
- */
- @SuppressWarnings({"unchecked", "rawtypes"})
- private Future kafkaPublish(Input input) throws Exception {
-
- long startPublishingEpochMillis = Instant.now().toEpochMilli();
-
- Producer producer = producerManager.getProducer(input);
-
- long timeTakenToCreateProducer = Instant.now().toEpochMilli() - startPublishingEpochMillis;
-
- LOGGER.debug("Time taken getting producer {}", timeTakenToCreateProducer);
-
- Object key = getKey(input);
-
- Iterable headers =
- input.getHeaders().entrySet().stream()
- .map(
- header ->
- new RecordHeader(
- header.getKey(),
- String.valueOf(header.getValue()).getBytes()))
- .collect(Collectors.toList());
- ProducerRecord rec =
- new ProducerRecord(
- input.getTopic(),
- null,
- null,
- key,
- objectMapper.writeValueAsString(input.getValue()),
- headers);
-
- Future send = producer.send(rec);
-
- long timeTakenToPublish = Instant.now().toEpochMilli() - startPublishingEpochMillis;
-
- LOGGER.debug("Time taken publishing {}", timeTakenToPublish);
-
- return send;
- }
-
- @VisibleForTesting
- Object getKey(Input input) {
- String keySerializer = input.getKeySerializer();
-
- if (LongSerializer.class.getCanonicalName().equals(keySerializer)) {
- return Long.parseLong(String.valueOf(input.getKey()));
- } else if (IntegerSerializer.class.getCanonicalName().equals(keySerializer)) {
- return Integer.parseInt(String.valueOf(input.getKey()));
- } else {
- return String.valueOf(input.getKey());
- }
- }
-
- @Override
- public boolean execute(WorkflowModel workflow, TaskModel task, WorkflowExecutor executor) {
- return false;
- }
-
- @Override
- public void cancel(WorkflowModel workflow, TaskModel task, WorkflowExecutor executor) {
- task.setStatus(TaskModel.Status.CANCELED);
- }
-
- @Override
- public boolean isAsync() {
- return true;
- }
-
- public static class Input {
-
- public static final String STRING_SERIALIZER = StringSerializer.class.getCanonicalName();
- private Map headers = new HashMap<>();
- private String bootStrapServers;
- private Object key;
- private Object value;
- private Integer requestTimeoutMs;
- private Integer maxBlockMs;
- private String topic;
- private String keySerializer = STRING_SERIALIZER;
-
- public Map getHeaders() {
- return headers;
- }
-
- public void setHeaders(Map headers) {
- this.headers = headers;
- }
-
- public String getBootStrapServers() {
- return bootStrapServers;
- }
-
- public void setBootStrapServers(String bootStrapServers) {
- this.bootStrapServers = bootStrapServers;
- }
-
- public Object getKey() {
- return key;
- }
-
- public void setKey(Object key) {
- this.key = key;
- }
-
- public Object getValue() {
- return value;
- }
-
- public void setValue(Object value) {
- this.value = value;
- }
-
- public Integer getRequestTimeoutMs() {
- return requestTimeoutMs;
- }
-
- public void setRequestTimeoutMs(Integer requestTimeoutMs) {
- this.requestTimeoutMs = requestTimeoutMs;
- }
-
- public String getTopic() {
- return topic;
- }
-
- public void setTopic(String topic) {
- this.topic = topic;
- }
-
- public String getKeySerializer() {
- return keySerializer;
- }
-
- public void setKeySerializer(String keySerializer) {
- this.keySerializer = keySerializer;
- }
-
- public Integer getMaxBlockMs() {
- return maxBlockMs;
- }
-
- public void setMaxBlockMs(Integer maxBlockMs) {
- this.maxBlockMs = maxBlockMs;
- }
-
- @Override
- public String toString() {
- return "Input{"
- + "headers="
- + headers
- + ", bootStrapServers='"
- + bootStrapServers
- + '\''
- + ", key="
- + key
- + ", value="
- + value
- + ", requestTimeoutMs="
- + requestTimeoutMs
- + ", maxBlockMs="
- + maxBlockMs
- + ", topic='"
- + topic
- + '\''
- + ", keySerializer='"
- + keySerializer
- + '\''
- + '}';
- }
- }
-}
diff --git a/contribs/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/contribs/src/main/resources/META-INF/additional-spring-configuration-metadata.json
deleted file mode 100644
index 3156ecbef..000000000
--- a/contribs/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "properties": [
- {
- "name": "conductor.metrics-logger.reportPeriodSeconds",
- "type": "java.lang.Long",
- "description": "The interval (in seconds) at which the metrics will be reported into the log stream by the metrics-logger."
- },
- {
- "name": "conductor.tasks.http.readTimeout",
- "type": "java.lang.Integer",
- "description": "The read timeout of the underlying HttpClient used by the HTTP task."
- },
- {
- "name": "conductor.tasks.http.connectTimeout",
- "type": "java.lang.Integer",
- "description": "The connection timeout of the underlying HttpClient used by the HTTP task."
- },
- {
- "name": "conductor.tasks.kafka-publish.requestTimeoutMs",
- "type": "java.lang.String",
- "description": "The request.timeout.ms value that the kafka producer is configured with in the KAFKA_PUBLISH task."
- },
- {
- "name": "conductor.tasks.kafka-publish.maxBlockMs",
- "type": "java.lang.String",
- "description": "The max.block.ms value that the kafka producer is configured with in the KAFKA_PUBLISH task."
- },
- {
- "name": "conductor.tasks.kafka-publish.cacheSize",
- "type": "java.lang.Integer",
- "description": "The maximum number of entries permitted in the in-memory cache used by the KAFKA_PUBLISH task."
- },
- {
- "name": "conductor.tasks.kafka-publish.cacheTimeMs",
- "type": "java.lang.Integer",
- "description": "The duration after which a cached entry will be removed from the in-memory cache used by the KAFKA_PUBLISH task."
- },
- {
- "name": "conductor.workflow-status-listener.type",
- "type": "java.lang.String",
- "description": "The implementation of the workflow status listener to be used."
- },
- {
- "name": "conductor.workflow-execution-lock.type",
- "type": "java.lang.String",
- "description": "The implementation of the workflow execution lock to be used.",
- "defaultValue": "noop_lock"
- },
- {
- "name": "conductor.event-queues.sqs.enabled",
- "type": "java.lang.Boolean",
- "description": "Enable the use of AWS SQS implementation to provide queues for consuming events.",
- "sourceType": "com.netflix.conductor.contribs.queue.sqs.config.SQSEventQueueConfiguration"
- },
- {
- "name": "conductor.event-queues.amqp.enabled",
- "type": "java.lang.Boolean",
- "description": "Enable the use of RabbitMQ implementation to provide queues for consuming events.",
- "sourceType": "com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueConfiguration"
- },
- {
- "name": "conductor.event-queues.nats.enabled",
- "type": "java.lang.Boolean",
- "description": "Enable the use of NATS implementation to provide queues for consuming events.",
- "sourceType": "com.netflix.conductor.contribs.queue.nats.config.NATSConfiguration"
- },
- {
- "name": "conductor.event-queues.nats-stream.enabled",
- "type": "java.lang.Boolean",
- "description": "Enable the use of NATS Streaming implementation to provide queues for consuming events.",
- "sourceType": "com.netflix.conductor.contribs.queue.nats.config.NATSStreamConfiguration"
- },
- {
- "name": "conductor.default-event-queue.type",
- "type": "java.lang.String",
- "description": "The default event queue type to listen on for the WAIT task."
- }
- ],
- "hints": [
- {
- "name": "conductor.workflow-status-listener.type",
- "values": [
- {
- "value": "stub",
- "description": "Use the no-op implementation of the workflow status listener."
- },
- {
- "value": "archive",
- "description": "Use then archive implementation which immediately archives the workflow upon termination or completion as the workflow status listener."
- },
- {
- "value": "queue_publisher",
- "description": "Use the publisher implementation which publishes a message to the underlying queue implementation upon termination or completion as the workflow status listener."
- }
- ]
- },
- {
- "name": "conductor.default-event-queue.type",
- "values": [
- {
- "value": "sqs",
- "description": "Use AWS SQS as the event queue to listen on for the WAIT task."
- },
- {
- "value": "amqp",
- "description": "Use RabbitMQ as the event queue to listen on for the WAIT task."
- },
- {
- "value": "nats_stream",
- "description": "Use NATS Stream as the event queue to listen on for the WAIT task."
- }
- ]
- },
- {
- "name": "conductor.workflow-execution-lock.type",
- "values": [
- {
- "value": "noop_lock",
- "description": "Use the no-op implementation as the lock provider."
- },
- {
- "value": "local_only",
- "description": "Use the local in-memory cache based implementation as the lock provider."
- },
- {
- "value": "redis",
- "description": "Use the redis-lock implementation as the lock provider."
- },
- {
- "value": "zookeeper",
- "description": "Use the zookeeper-lock implementation as the lock provider."
- }
- ]
- }
- ]
-}
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/listener/ArchivingWorkflowStatusListenerTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/listener/ArchivingWorkflowStatusListenerTest.java
deleted file mode 100644
index 9a89e86de..000000000
--- a/contribs/src/test/java/com/netflix/conductor/contribs/listener/ArchivingWorkflowStatusListenerTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.listener;
-
-import java.util.UUID;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
-import com.netflix.conductor.contribs.listener.archive.ArchivingWorkflowStatusListener;
-import com.netflix.conductor.core.dal.ExecutionDAOFacade;
-import com.netflix.conductor.model.WorkflowModel;
-
-import static org.mockito.Mockito.*;
-
-/** @author pavel.halabala */
-public class ArchivingWorkflowStatusListenerTest {
-
- WorkflowModel workflow;
- ExecutionDAOFacade executionDAOFacade;
- ArchivingWorkflowStatusListener listener;
-
- @Before
- public void before() {
- workflow = new WorkflowModel();
- WorkflowDef def = new WorkflowDef();
- def.setName("name1");
- def.setVersion(1);
- workflow.setWorkflowDefinition(def);
- workflow.setWorkflowId(UUID.randomUUID().toString());
-
- executionDAOFacade = Mockito.mock(ExecutionDAOFacade.class);
- listener = new ArchivingWorkflowStatusListener(executionDAOFacade);
- }
-
- @Test
- public void testArchiveOnWorkflowCompleted() {
- listener.onWorkflowCompleted(workflow);
- verify(executionDAOFacade, times(1)).removeWorkflow(workflow.getWorkflowId(), true);
- verifyNoMoreInteractions(executionDAOFacade);
- }
-
- @Test
- public void testArchiveOnWorkflowTerminated() {
- listener.onWorkflowTerminated(workflow);
- verify(executionDAOFacade, times(1)).removeWorkflow(workflow.getWorkflowId(), true);
- verifyNoMoreInteractions(executionDAOFacade);
- }
-}
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfigurationTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfigurationTest.java
deleted file mode 100644
index 3fdd736f3..000000000
--- a/contribs/src/test/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfigurationTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.metrics;
-
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Import;
-import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import com.netflix.conductor.contribs.metrics.LoggingMetricsConfiguration.Slf4jReporterProvider;
-
-import com.codahale.metrics.MetricRegistry;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.verify;
-
-@RunWith(SpringRunner.class)
-@Import({LoggingMetricsConfiguration.class, MetricsRegistryConfiguration.class})
-@TestPropertySource(properties = {"conductor.metrics-logger.enabled=true"})
-public class LoggingMetricsConfigurationTest {
-
- @Autowired MetricRegistry metricRegistry;
-
- @Test
- public void testCollector() {
- Logger logger = spy(Logger.class);
- doReturn(true).when(logger).isInfoEnabled(any());
- Slf4jReporterProvider reporterProvider =
- new Slf4jReporterProvider(metricRegistry, logger, 1);
- metricRegistry.counter("test").inc();
-
- reporterProvider.getReporter();
- verify(logger, timeout(TimeUnit.SECONDS.toMillis(10))).isInfoEnabled(null);
- }
-}
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfigurationTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfigurationTest.java
deleted file mode 100644
index c87b75dd0..000000000
--- a/contribs/src/test/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfigurationTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2021 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.metrics;
-
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.TestConfiguration;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Import;
-import org.springframework.context.annotation.Primary;
-import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.Spectator;
-import com.netflix.spectator.micrometer.MicrometerRegistry;
-
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.prometheus.PrometheusConfig;
-import io.micrometer.prometheus.PrometheusMeterRegistry;
-
-import static org.junit.Assert.assertTrue;
-
-@RunWith(SpringRunner.class)
-@Import({PrometheusMetricsConfiguration.class})
-@TestPropertySource(properties = {"conductor.metrics-prometheus.enabled=true"})
-public class PrometheusMetricsConfigurationTest {
-
- @SuppressWarnings("unchecked")
- @Test
- public void testCollector() throws IllegalAccessException {
- final Optional registries =
- Arrays.stream(Spectator.globalRegistry().getClass().getDeclaredFields())
- .filter(f -> f.getName().equals("registries"))
- .findFirst();
- assertTrue(registries.isPresent());
- registries.get().setAccessible(true);
-
- List meters = (List) registries.get().get(Spectator.globalRegistry());
- assertTrue(meters.size() > 0);
- Optional microMeterReg =
- meters.stream()
- .filter(r -> r.getClass().equals(MicrometerRegistry.class))
- .findFirst();
- assertTrue(microMeterReg.isPresent());
- }
-
- @TestConfiguration
- public static class TestConfig {
-
- /**
- * This bean will be injected in PrometheusMetricsConfiguration, which wraps it with a
- * MicrometerRegistry, and appends it to the global registry.
- *
- * @return a Prometheus registry instance
- */
- @Bean
- @Primary
- public MeterRegistry meterRegistry() {
- return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
- }
- }
-}
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPEventQueueProviderTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPEventQueueProviderTest.java
deleted file mode 100644
index 38e949121..000000000
--- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPEventQueueProviderTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp;
-
-import java.time.Duration;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties;
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProvider;
-import com.netflix.conductor.contribs.queue.amqp.util.AMQPConstants;
-import com.netflix.conductor.core.events.queue.ObservableQueue;
-
-import com.rabbitmq.client.AMQP.PROTOCOL;
-import com.rabbitmq.client.ConnectionFactory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class AMQPEventQueueProviderTest {
-
- private AMQPEventQueueProperties properties;
-
- @Before
- public void setUp() {
- properties = mock(AMQPEventQueueProperties.class);
- when(properties.getBatchSize()).thenReturn(1);
- when(properties.getPollTimeDuration()).thenReturn(Duration.ofMillis(100));
- when(properties.getHosts()).thenReturn(ConnectionFactory.DEFAULT_HOST);
- when(properties.getUsername()).thenReturn(ConnectionFactory.DEFAULT_USER);
- when(properties.getPassword()).thenReturn(ConnectionFactory.DEFAULT_PASS);
- when(properties.getVirtualHost()).thenReturn(ConnectionFactory.DEFAULT_VHOST);
- when(properties.getPort()).thenReturn(PROTOCOL.PORT);
- when(properties.getConnectionTimeoutInMilliSecs()).thenReturn(60000);
- when(properties.isUseNio()).thenReturn(false);
- when(properties.isDurable()).thenReturn(true);
- when(properties.isExclusive()).thenReturn(false);
- when(properties.isAutoDelete()).thenReturn(false);
- when(properties.getContentType()).thenReturn("application/json");
- when(properties.getContentEncoding()).thenReturn("UTF-8");
- when(properties.getExchangeType()).thenReturn("topic");
- when(properties.getDeliveryMode()).thenReturn(2);
- when(properties.isUseExchange()).thenReturn(true);
- }
-
- @Test
- public void testAMQPEventQueueProvider_defaultconfig_exchange() {
- String exchangestring =
- "amqp_exchange:myExchangeName?exchangeType=topic&routingKey=test&deliveryMode=2";
- AMQPEventQueueProvider eventqProvider =
- new AMQPEventQueueProvider(properties, "amqp_exchange", true);
- ObservableQueue queue = eventqProvider.getQueue(exchangestring);
- assertNotNull(queue);
- assertEquals(exchangestring, queue.getName());
- assertEquals(AMQPConstants.AMQP_EXCHANGE_TYPE, queue.getType());
- }
-
- @Test
- public void testAMQPEventQueueProvider_defaultconfig_queue() {
- String exchangestring =
- "amqp_queue:myQueueName?deliveryMode=2&durable=false&autoDelete=true&exclusive=true";
- AMQPEventQueueProvider eventqProvider =
- new AMQPEventQueueProvider(properties, "amqp_queue", false);
- ObservableQueue queue = eventqProvider.getQueue(exchangestring);
- assertNotNull(queue);
- assertEquals(exchangestring, queue.getName());
- assertEquals(AMQPConstants.AMQP_QUEUE_TYPE, queue.getType());
- }
-}
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueueTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueueTest.java
deleted file mode 100644
index 86b3ac596..000000000
--- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueueTest.java
+++ /dev/null
@@ -1,895 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp;
-
-import java.io.IOException;
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Random;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.mockito.internal.stubbing.answers.DoesNothing;
-import org.mockito.stubbing.OngoingStubbing;
-
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties;
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPRetryPattern;
-import com.netflix.conductor.contribs.queue.amqp.util.AMQPConstants;
-import com.netflix.conductor.contribs.queue.amqp.util.AMQPSettings;
-import com.netflix.conductor.contribs.queue.amqp.util.RetryType;
-import com.netflix.conductor.core.events.queue.Message;
-
-import com.rabbitmq.client.AMQP;
-import com.rabbitmq.client.AMQP.PROTOCOL;
-import com.rabbitmq.client.AMQP.Queue.DeclareOk;
-import com.rabbitmq.client.Address;
-import com.rabbitmq.client.Channel;
-import com.rabbitmq.client.Connection;
-import com.rabbitmq.client.ConnectionFactory;
-import com.rabbitmq.client.Consumer;
-import com.rabbitmq.client.Envelope;
-import com.rabbitmq.client.GetResponse;
-import com.rabbitmq.client.impl.AMQImpl;
-import rx.Observable;
-import rx.observers.Subscribers;
-import rx.observers.TestSubscriber;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.anyMap;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.atLeast;
-import static org.mockito.Mockito.atLeastOnce;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-@SuppressWarnings({"rawtypes", "unchecked"})
-public class AMQPObservableQueueTest {
-
- final int batchSize = 10;
- final int pollTimeMs = 500;
-
- Address[] addresses;
- AMQPEventQueueProperties properties;
-
- @Before
- public void setUp() {
- properties = mock(AMQPEventQueueProperties.class);
- when(properties.getBatchSize()).thenReturn(1);
- when(properties.getPollTimeDuration()).thenReturn(Duration.ofMillis(100));
- when(properties.getHosts()).thenReturn(ConnectionFactory.DEFAULT_HOST);
- when(properties.getUsername()).thenReturn(ConnectionFactory.DEFAULT_USER);
- when(properties.getPassword()).thenReturn(ConnectionFactory.DEFAULT_PASS);
- when(properties.getVirtualHost()).thenReturn(ConnectionFactory.DEFAULT_VHOST);
- when(properties.getPort()).thenReturn(PROTOCOL.PORT);
- when(properties.getConnectionTimeoutInMilliSecs()).thenReturn(60000);
- when(properties.isUseNio()).thenReturn(false);
- when(properties.isDurable()).thenReturn(true);
- when(properties.isExclusive()).thenReturn(false);
- when(properties.isAutoDelete()).thenReturn(false);
- when(properties.getContentType()).thenReturn("application/json");
- when(properties.getContentEncoding()).thenReturn("UTF-8");
- when(properties.getExchangeType()).thenReturn("topic");
- when(properties.getDeliveryMode()).thenReturn(2);
- when(properties.isUseExchange()).thenReturn(true);
- addresses = new Address[] {new Address("localhost", PROTOCOL.PORT)};
- AMQPConnection.setAMQPConnection(null);
- }
-
- List buildQueue(final Random random, final int bound) {
- final LinkedList queue = new LinkedList();
- for (int i = 0; i < bound; i++) {
- AMQP.BasicProperties props = mock(AMQP.BasicProperties.class);
- when(props.getMessageId()).thenReturn(UUID.randomUUID().toString());
- Envelope envelope = mock(Envelope.class);
- when(envelope.getDeliveryTag()).thenReturn(random.nextLong());
- GetResponse response = mock(GetResponse.class);
- when(response.getProps()).thenReturn(props);
- when(response.getEnvelope()).thenReturn(envelope);
- when(response.getBody()).thenReturn("{}".getBytes());
- when(response.getMessageCount()).thenReturn(bound - i);
- queue.add(response);
- }
- return queue;
- }
-
- Channel mockBaseChannel() throws IOException, TimeoutException {
- Channel channel = mock(Channel.class);
- when(channel.isOpen()).thenReturn(Boolean.TRUE);
- /*
- * doAnswer(invocation -> { when(channel.isOpen()).thenReturn(Boolean.FALSE);
- * return DoesNothing.doesNothing(); }).when(channel).close();
- */
- return channel;
- }
-
- Channel mockChannelForQueue(
- Channel channel,
- boolean isWorking,
- boolean exists,
- String name,
- List queue)
- throws IOException {
- // queueDeclarePassive
- final AMQImpl.Queue.DeclareOk queueDeclareOK =
- new AMQImpl.Queue.DeclareOk(name, queue.size(), 1);
- if (exists) {
- when(channel.queueDeclarePassive(eq(name))).thenReturn(queueDeclareOK);
- } else {
- when(channel.queueDeclarePassive(eq(name)))
- .thenThrow(new IOException("Queue " + name + " exists"));
- }
- // queueDeclare
- OngoingStubbing declareOkOngoingStubbing =
- when(channel.queueDeclare(
- eq(name), anyBoolean(), anyBoolean(), anyBoolean(), anyMap()))
- .thenReturn(queueDeclareOK);
- if (!isWorking) {
- declareOkOngoingStubbing.thenThrow(
- new IOException("Cannot declare queue " + name),
- new RuntimeException("Not working"));
- }
- // messageCount
- when(channel.messageCount(eq(name))).thenReturn((long) queue.size());
- // basicGet
- OngoingStubbing getResponseOngoingStubbing =
- Mockito.when(channel.basicConsume(eq(name), anyBoolean(), any(Consumer.class)))
- .thenReturn(name);
- if (!isWorking) {
- getResponseOngoingStubbing.thenThrow(
- new IOException("Not working"), new RuntimeException("Not working"));
- }
- // basicPublish
- if (isWorking) {
- doNothing()
- .when(channel)
- .basicPublish(
- eq(StringUtils.EMPTY),
- eq(name),
- any(AMQP.BasicProperties.class),
- any(byte[].class));
- } else {
- doThrow(new IOException("Not working"))
- .when(channel)
- .basicPublish(
- eq(StringUtils.EMPTY),
- eq(name),
- any(AMQP.BasicProperties.class),
- any(byte[].class));
- }
- return channel;
- }
-
- Channel mockChannelForExchange(
- Channel channel,
- boolean isWorking,
- boolean exists,
- String queueName,
- String name,
- String type,
- String routingKey,
- List queue)
- throws IOException {
- // exchangeDeclarePassive
- final AMQImpl.Exchange.DeclareOk exchangeDeclareOK = new AMQImpl.Exchange.DeclareOk();
- if (exists) {
- when(channel.exchangeDeclarePassive(eq(name))).thenReturn(exchangeDeclareOK);
- } else {
- when(channel.exchangeDeclarePassive(eq(name)))
- .thenThrow(new IOException("Exchange " + name + " exists"));
- }
- // exchangeDeclare
- OngoingStubbing declareOkOngoingStubbing =
- when(channel.exchangeDeclare(
- eq(name), eq(type), anyBoolean(), anyBoolean(), anyMap()))
- .thenReturn(exchangeDeclareOK);
- if (!isWorking) {
- declareOkOngoingStubbing.thenThrow(
- new IOException("Cannot declare exchange " + name + " of type " + type),
- new RuntimeException("Not working"));
- }
- // queueDeclarePassive
- final AMQImpl.Queue.DeclareOk queueDeclareOK =
- new AMQImpl.Queue.DeclareOk(queueName, queue.size(), 1);
- if (exists) {
- when(channel.queueDeclarePassive(eq(queueName))).thenReturn(queueDeclareOK);
- } else {
- when(channel.queueDeclarePassive(eq(queueName)))
- .thenThrow(new IOException("Queue " + queueName + " exists"));
- }
- // queueDeclare
- when(channel.queueDeclare(
- eq(queueName), anyBoolean(), anyBoolean(), anyBoolean(), anyMap()))
- .thenReturn(queueDeclareOK);
- // queueBind
- when(channel.queueBind(eq(queueName), eq(name), eq(routingKey)))
- .thenReturn(new AMQImpl.Queue.BindOk());
- // messageCount
- when(channel.messageCount(eq(name))).thenReturn((long) queue.size());
- // basicGet
-
- OngoingStubbing getResponseOngoingStubbing =
- Mockito.when(channel.basicConsume(eq(queueName), anyBoolean(), any(Consumer.class)))
- .thenReturn(queueName);
-
- if (!isWorking) {
- getResponseOngoingStubbing.thenThrow(
- new IOException("Not working"), new RuntimeException("Not working"));
- }
- // basicPublish
- if (isWorking) {
- doNothing()
- .when(channel)
- .basicPublish(
- eq(name),
- eq(routingKey),
- any(AMQP.BasicProperties.class),
- any(byte[].class));
- } else {
- doThrow(new IOException("Not working"))
- .when(channel)
- .basicPublish(
- eq(name),
- eq(routingKey),
- any(AMQP.BasicProperties.class),
- any(byte[].class));
- }
- return channel;
- }
-
- Connection mockGoodConnection(Channel channel) throws IOException {
- Connection connection = mock(Connection.class);
- when(connection.createChannel()).thenReturn(channel);
- when(connection.isOpen()).thenReturn(Boolean.TRUE);
- /*
- * doAnswer(invocation -> { when(connection.isOpen()).thenReturn(Boolean.FALSE);
- * return DoesNothing.doesNothing(); }).when(connection).close();
- */ return connection;
- }
-
- Connection mockBadConnection() throws IOException {
- Connection connection = mock(Connection.class);
- when(connection.createChannel()).thenThrow(new IOException("Can't create channel"));
- when(connection.isOpen()).thenReturn(Boolean.TRUE);
- doThrow(new IOException("Can't close connection")).when(connection).close();
- return connection;
- }
-
- ConnectionFactory mockConnectionFactory(Connection connection)
- throws IOException, TimeoutException {
- ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
- when(connectionFactory.newConnection(eq(addresses), Mockito.anyString()))
- .thenReturn(connection);
- return connectionFactory;
- }
-
- void runObserve(
- Channel channel,
- AMQPObservableQueue observableQueue,
- String queueName,
- boolean useWorkingChannel,
- int batchSize)
- throws IOException {
-
- final List found = new ArrayList<>(batchSize);
- TestSubscriber subscriber = TestSubscriber.create(Subscribers.create(found::add));
- rx.Observable observable =
- observableQueue.observe().take(pollTimeMs * 2, TimeUnit.MILLISECONDS);
- assertNotNull(observable);
- observable.subscribe(subscriber);
- subscriber.awaitTerminalEvent();
- subscriber.assertNoErrors();
- subscriber.assertCompleted();
- if (useWorkingChannel) {
- verify(channel, atLeast(1))
- .basicConsume(eq(queueName), anyBoolean(), any(Consumer.class));
- doNothing().when(channel).basicAck(anyLong(), eq(false));
- doAnswer(DoesNothing.doesNothing()).when(channel).basicAck(anyLong(), eq(false));
- observableQueue.ack(Collections.synchronizedList(found));
- } else {
- assertNotNull(found);
- assertTrue(found.isEmpty());
- }
- observableQueue.close();
- }
-
- @Test
- public void
- testGetMessagesFromExistingExchangeWithDurableExclusiveAutoDeleteQueueConfiguration()
- throws IOException, TimeoutException {
- // Mock channel and connection
- Channel channel = mockBaseChannel();
- Connection connection = mockGoodConnection(channel);
- testGetMessagesFromExchangeAndCustomConfigurationFromURI(
- channel, connection, true, true, true, true, true);
- }
-
- @Test
- public void testPublishMessagesToNotExistingExchangeAndDefaultConfiguration()
- throws IOException, TimeoutException {
- // Mock channel and connection
- Channel channel = mockBaseChannel();
- Connection connection = mockGoodConnection(channel);
- testPublishMessagesToExchangeAndDefaultConfiguration(channel, connection, false, true);
- }
-
- @Test
- public void testAck() throws IOException, TimeoutException {
- // Mock channel and connection
- Channel channel = mockBaseChannel();
- Connection connection = mockGoodConnection(channel);
- final Random random = new Random();
-
- final String name = RandomStringUtils.randomAlphabetic(30),
- type = "topic",
- routingKey = RandomStringUtils.randomAlphabetic(30);
- AMQPRetryPattern retrySettings = null;
- final AMQPSettings settings =
- new AMQPSettings(properties)
- .fromURI(
- "amqp_exchange:"
- + name
- + "?exchangeType="
- + type
- + "&routingKey="
- + routingKey);
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(connection),
- addresses,
- true,
- settings,
- retrySettings,
- batchSize,
- pollTimeMs);
- List messages = new LinkedList<>();
- Message msg = new Message();
- msg.setId("0e3eef8f-ebb1-4244-9665-759ab5bdf433");
- msg.setPayload("Payload");
- msg.setReceipt("1");
- messages.add(msg);
- List deliveredTags = observableQueue.ack(messages);
- assertNotNull(deliveredTags);
- }
-
- private void testGetMessagesFromExchangeAndDefaultConfiguration(
- Channel channel, Connection connection, boolean exists, boolean useWorkingChannel)
- throws IOException, TimeoutException {
-
- final Random random = new Random();
-
- final String name = RandomStringUtils.randomAlphabetic(30),
- type = "topic",
- routingKey = RandomStringUtils.randomAlphabetic(30);
- final String queueName = String.format("bound_to_%s", name);
-
- final AMQPSettings settings =
- new AMQPSettings(properties)
- .fromURI(
- "amqp_exchange:"
- + name
- + "?exchangeType="
- + type
- + "&routingKey="
- + routingKey);
- assertTrue(settings.isDurable());
- assertFalse(settings.isExclusive());
- assertFalse(settings.autoDelete());
- assertEquals(2, settings.getDeliveryMode());
- assertEquals(name, settings.getQueueOrExchangeName());
- assertEquals(type, settings.getExchangeType());
- assertEquals(routingKey, settings.getRoutingKey());
-
- List queue = buildQueue(random, batchSize);
- channel =
- mockChannelForExchange(
- channel,
- useWorkingChannel,
- exists,
- queueName,
- name,
- type,
- routingKey,
- queue);
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(connection),
- addresses,
- true,
- settings,
- retrySettings,
- batchSize,
- pollTimeMs);
-
- assertArrayEquals(addresses, observableQueue.getAddresses());
- assertEquals(AMQPConstants.AMQP_EXCHANGE_TYPE, observableQueue.getType());
- assertEquals(
- AMQPConstants.AMQP_EXCHANGE_TYPE
- + ":"
- + name
- + "?exchangeType="
- + type
- + "&routingKey="
- + routingKey,
- observableQueue.getName());
- assertEquals(name, observableQueue.getURI());
- assertEquals(batchSize, observableQueue.getBatchSize());
- assertEquals(pollTimeMs, observableQueue.getPollTimeInMS());
- assertEquals(queue.size(), observableQueue.size());
-
- runObserve(channel, observableQueue, queueName, useWorkingChannel, batchSize);
-
- if (useWorkingChannel) {
- verify(channel, atLeastOnce())
- .exchangeDeclare(
- eq(name),
- eq(type),
- eq(settings.isDurable()),
- eq(settings.autoDelete()),
- eq(Collections.emptyMap()));
- verify(channel, atLeastOnce())
- .queueDeclare(
- eq(queueName),
- eq(settings.isDurable()),
- eq(settings.isExclusive()),
- eq(settings.autoDelete()),
- anyMap());
-
- verify(channel, atLeastOnce()).queueBind(eq(queueName), eq(name), eq(routingKey));
- }
- }
-
- private void testGetMessagesFromExchangeAndCustomConfigurationFromURI(
- Channel channel,
- Connection connection,
- boolean exists,
- boolean useWorkingChannel,
- boolean durable,
- boolean exclusive,
- boolean autoDelete)
- throws IOException, TimeoutException {
-
- final Random random = new Random();
-
- final String name = RandomStringUtils.randomAlphabetic(30),
- type = "topic",
- routingKey = RandomStringUtils.randomAlphabetic(30);
- final String queueName = String.format("bound_to_%s", name);
-
- final AMQPSettings settings =
- new AMQPSettings(properties)
- .fromURI(
- "amqp_exchange:"
- + name
- + "?exchangeType="
- + type
- + "&routingKey="
- + routingKey
- + "&deliveryMode=2"
- + "&durable="
- + durable
- + "&exclusive="
- + exclusive
- + "&autoDelete="
- + autoDelete);
- assertEquals(durable, settings.isDurable());
- assertEquals(exclusive, settings.isExclusive());
- assertEquals(autoDelete, settings.autoDelete());
- assertEquals(2, settings.getDeliveryMode());
- assertEquals(name, settings.getQueueOrExchangeName());
- assertEquals(type, settings.getExchangeType());
- assertEquals(routingKey, settings.getRoutingKey());
-
- List queue = buildQueue(random, batchSize);
- channel =
- mockChannelForExchange(
- channel,
- useWorkingChannel,
- exists,
- queueName,
- name,
- type,
- routingKey,
- queue);
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(connection),
- addresses,
- true,
- settings,
- retrySettings,
- batchSize,
- pollTimeMs);
-
- assertArrayEquals(addresses, observableQueue.getAddresses());
- assertEquals(AMQPConstants.AMQP_EXCHANGE_TYPE, observableQueue.getType());
- assertEquals(
- AMQPConstants.AMQP_EXCHANGE_TYPE
- + ":"
- + name
- + "?exchangeType="
- + type
- + "&routingKey="
- + routingKey
- + "&deliveryMode=2"
- + "&durable="
- + durable
- + "&exclusive="
- + exclusive
- + "&autoDelete="
- + autoDelete,
- observableQueue.getName());
- assertEquals(name, observableQueue.getURI());
- assertEquals(batchSize, observableQueue.getBatchSize());
- assertEquals(pollTimeMs, observableQueue.getPollTimeInMS());
- assertEquals(queue.size(), observableQueue.size());
-
- runObserve(channel, observableQueue, queueName, useWorkingChannel, batchSize);
-
- if (useWorkingChannel) {
- verify(channel, atLeastOnce())
- .exchangeDeclare(
- eq(name),
- eq(type),
- eq(settings.isDurable()),
- eq(settings.autoDelete()),
- eq(Collections.emptyMap()));
- verify(channel, atLeastOnce())
- .queueDeclare(
- eq(queueName),
- eq(settings.isDurable()),
- eq(settings.isExclusive()),
- eq(settings.autoDelete()),
- anyMap());
-
- verify(channel, atLeastOnce()).queueBind(eq(queueName), eq(name), eq(routingKey));
- }
- }
-
- private void testPublishMessagesToExchangeAndDefaultConfiguration(
- Channel channel, Connection connection, boolean exists, boolean useWorkingChannel)
- throws IOException, TimeoutException {
- final Random random = new Random();
-
- final String name = RandomStringUtils.randomAlphabetic(30),
- type = "topic",
- queueName = RandomStringUtils.randomAlphabetic(30),
- routingKey = RandomStringUtils.randomAlphabetic(30);
-
- final AMQPSettings settings =
- new AMQPSettings(properties)
- .fromURI(
- "amqp_exchange:"
- + name
- + "?exchangeType="
- + type
- + "&routingKey="
- + routingKey
- + "&deliveryMode=2&durable=true&exclusive=false&autoDelete=true");
- assertTrue(settings.isDurable());
- assertFalse(settings.isExclusive());
- assertTrue(settings.autoDelete());
- assertEquals(2, settings.getDeliveryMode());
- assertEquals(name, settings.getQueueOrExchangeName());
- assertEquals(type, settings.getExchangeType());
- assertEquals(routingKey, settings.getRoutingKey());
-
- List queue = buildQueue(random, batchSize);
- channel =
- mockChannelForExchange(
- channel,
- useWorkingChannel,
- exists,
- queueName,
- name,
- type,
- routingKey,
- queue);
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(connection),
- addresses,
- true,
- settings,
- retrySettings,
- batchSize,
- pollTimeMs);
-
- assertArrayEquals(addresses, observableQueue.getAddresses());
- assertEquals(AMQPConstants.AMQP_EXCHANGE_TYPE, observableQueue.getType());
- assertEquals(
- AMQPConstants.AMQP_EXCHANGE_TYPE
- + ":"
- + name
- + "?exchangeType="
- + type
- + "&routingKey="
- + routingKey
- + "&deliveryMode=2&durable=true&exclusive=false&autoDelete=true",
- observableQueue.getName());
- assertEquals(name, observableQueue.getURI());
- assertEquals(batchSize, observableQueue.getBatchSize());
- assertEquals(pollTimeMs, observableQueue.getPollTimeInMS());
- assertEquals(queue.size(), observableQueue.size());
-
- List messages = new LinkedList<>();
- Observable.range(0, batchSize)
- .forEach((Integer x) -> messages.add(new Message("" + x, "payload: " + x, null)));
- assertEquals(batchSize, messages.size());
- observableQueue.publish(messages);
-
- if (useWorkingChannel) {
- verify(channel, times(batchSize))
- .basicPublish(
- eq(name),
- eq(routingKey),
- any(AMQP.BasicProperties.class),
- any(byte[].class));
- }
- }
-
- @Test
- public void testGetMessagesFromExistingQueueAndDefaultConfiguration()
- throws IOException, TimeoutException {
- // Mock channel and connection
- Channel channel = mockBaseChannel();
- Connection connection = mockGoodConnection(channel);
- testGetMessagesFromQueueAndDefaultConfiguration(channel, connection, true, true);
- }
-
- @Test
- public void testGetMessagesFromNotExistingQueueAndDefaultConfiguration()
- throws IOException, TimeoutException {
- // Mock channel and connection
- Channel channel = mockBaseChannel();
- Connection connection = mockGoodConnection(channel);
- testGetMessagesFromQueueAndDefaultConfiguration(channel, connection, false, true);
- }
-
- @Test
- public void testGetMessagesFromQueueWithBadChannel() throws IOException, TimeoutException {
- // Mock channel and connection
- Channel channel = mockBaseChannel();
- Connection connection = mockGoodConnection(channel);
- testGetMessagesFromQueueAndDefaultConfiguration(channel, connection, true, false);
- }
-
- @Test(expected = RuntimeException.class)
- public void testPublishMessagesToQueueWithBadChannel() throws IOException, TimeoutException {
- // Mock channel and connection
- Channel channel = mockBaseChannel();
- Connection connection = mockGoodConnection(channel);
- testPublishMessagesToQueueAndDefaultConfiguration(channel, connection, true, false);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testAMQPObservalbleQueue_empty() throws IOException, TimeoutException {
- AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:test");
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- null, addresses, false, settings, retrySettings, batchSize, pollTimeMs);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testAMQPObservalbleQueue_addressEmpty() throws IOException, TimeoutException {
- AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:test");
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(mockGoodConnection(mockBaseChannel())),
- null,
- false,
- settings,
- retrySettings,
- batchSize,
- pollTimeMs);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testAMQPObservalbleQueue_settingsEmpty() throws IOException, TimeoutException {
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(mockGoodConnection(mockBaseChannel())),
- addresses,
- false,
- null,
- retrySettings,
- batchSize,
- pollTimeMs);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testAMQPObservalbleQueue_batchsizezero() throws IOException, TimeoutException {
- AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:test");
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(mockGoodConnection(mockBaseChannel())),
- addresses,
- false,
- settings,
- retrySettings,
- 0,
- pollTimeMs);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testAMQPObservalbleQueue_polltimezero() throws IOException, TimeoutException {
- AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:test");
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(mockGoodConnection(mockBaseChannel())),
- addresses,
- false,
- settings,
- retrySettings,
- batchSize,
- 0);
- }
-
- @Test
- public void testclosetExistingQueueAndDefaultConfiguration()
- throws IOException, TimeoutException {
- // Mock channel and connection
- Channel channel = mockBaseChannel();
- Connection connection = mockGoodConnection(channel);
- testGetMessagesFromQueueAndDefaultConfiguration_close(channel, connection, false, true);
- }
-
- private void testGetMessagesFromQueueAndDefaultConfiguration(
- Channel channel, Connection connection, boolean queueExists, boolean useWorkingChannel)
- throws IOException, TimeoutException {
- final Random random = new Random();
-
- final String queueName = RandomStringUtils.randomAlphabetic(30);
- AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:" + queueName);
-
- List queue = buildQueue(random, batchSize);
- channel = mockChannelForQueue(channel, useWorkingChannel, queueExists, queueName, queue);
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(connection),
- addresses,
- false,
- settings,
- retrySettings,
- batchSize,
- pollTimeMs);
-
- assertArrayEquals(addresses, observableQueue.getAddresses());
- assertEquals(AMQPConstants.AMQP_QUEUE_TYPE, observableQueue.getType());
- assertEquals(AMQPConstants.AMQP_QUEUE_TYPE + ":" + queueName, observableQueue.getName());
- assertEquals(queueName, observableQueue.getURI());
- assertEquals(batchSize, observableQueue.getBatchSize());
- assertEquals(pollTimeMs, observableQueue.getPollTimeInMS());
- assertEquals(queue.size(), observableQueue.size());
-
- runObserve(channel, observableQueue, queueName, useWorkingChannel, batchSize);
- }
-
- private void testGetMessagesFromQueueAndDefaultConfiguration_close(
- Channel channel, Connection connection, boolean queueExists, boolean useWorkingChannel)
- throws IOException, TimeoutException {
- final Random random = new Random();
-
- final String queueName = RandomStringUtils.randomAlphabetic(30);
- AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:" + queueName);
-
- List queue = buildQueue(random, batchSize);
- channel = mockChannelForQueue(channel, useWorkingChannel, queueExists, queueName, queue);
- AMQPRetryPattern retrySettings = null;
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(connection),
- addresses,
- false,
- settings,
- retrySettings,
- batchSize,
- pollTimeMs);
- observableQueue.close();
- assertArrayEquals(addresses, observableQueue.getAddresses());
- assertEquals(AMQPConstants.AMQP_QUEUE_TYPE, observableQueue.getType());
- assertEquals(AMQPConstants.AMQP_QUEUE_TYPE + ":" + queueName, observableQueue.getName());
- assertEquals(queueName, observableQueue.getURI());
- assertEquals(batchSize, observableQueue.getBatchSize());
- assertEquals(pollTimeMs, observableQueue.getPollTimeInMS());
- assertEquals(queue.size(), observableQueue.size());
- }
-
- private void testPublishMessagesToQueueAndDefaultConfiguration(
- Channel channel, Connection connection, boolean queueExists, boolean useWorkingChannel)
- throws IOException, TimeoutException {
- final Random random = new Random();
-
- final String queueName = RandomStringUtils.randomAlphabetic(30);
- final AMQPSettings settings =
- new AMQPSettings(properties)
- .fromURI(
- "amqp_queue:"
- + queueName
- + "?deliveryMode=2&durable=true&exclusive=false&autoDelete=true");
- assertTrue(settings.isDurable());
- assertFalse(settings.isExclusive());
- assertTrue(settings.autoDelete());
- assertEquals(2, settings.getDeliveryMode());
-
- List queue = buildQueue(random, batchSize);
- channel = mockChannelForQueue(channel, useWorkingChannel, queueExists, queueName, queue);
- AMQPRetryPattern retrySettings = new AMQPRetryPattern(3, 5, RetryType.REGULARINTERVALS);
- AMQPObservableQueue observableQueue =
- new AMQPObservableQueue(
- mockConnectionFactory(connection),
- addresses,
- false,
- settings,
- retrySettings,
- batchSize,
- pollTimeMs);
-
- assertArrayEquals(addresses, observableQueue.getAddresses());
- assertEquals(AMQPConstants.AMQP_QUEUE_TYPE, observableQueue.getType());
- assertEquals(
- AMQPConstants.AMQP_QUEUE_TYPE
- + ":"
- + queueName
- + "?deliveryMode=2&durable=true&exclusive=false&autoDelete=true",
- observableQueue.getName());
- assertEquals(queueName, observableQueue.getURI());
- assertEquals(batchSize, observableQueue.getBatchSize());
- assertEquals(pollTimeMs, observableQueue.getPollTimeInMS());
- assertEquals(queue.size(), observableQueue.size());
-
- List messages = new LinkedList<>();
- Observable.range(0, batchSize)
- .forEach((Integer x) -> messages.add(new Message("" + x, "payload: " + x, null)));
- assertEquals(batchSize, messages.size());
- observableQueue.publish(messages);
-
- if (useWorkingChannel) {
- verify(channel, times(batchSize))
- .basicPublish(
- eq(StringUtils.EMPTY),
- eq(queueName),
- any(AMQP.BasicProperties.class),
- any(byte[].class));
- }
- }
-}
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPSettingsTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPSettingsTest.java
deleted file mode 100644
index 91afc6e50..000000000
--- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPSettingsTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.queue.amqp;
-
-import java.time.Duration;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties;
-import com.netflix.conductor.contribs.queue.amqp.util.AMQPSettings;
-
-import com.rabbitmq.client.AMQP.PROTOCOL;
-import com.rabbitmq.client.ConnectionFactory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class AMQPSettingsTest {
-
- private AMQPEventQueueProperties properties;
-
- @Before
- public void setUp() {
- properties = mock(AMQPEventQueueProperties.class);
- when(properties.getBatchSize()).thenReturn(1);
- when(properties.getPollTimeDuration()).thenReturn(Duration.ofMillis(100));
- when(properties.getHosts()).thenReturn(ConnectionFactory.DEFAULT_HOST);
- when(properties.getUsername()).thenReturn(ConnectionFactory.DEFAULT_USER);
- when(properties.getPassword()).thenReturn(ConnectionFactory.DEFAULT_PASS);
- when(properties.getVirtualHost()).thenReturn(ConnectionFactory.DEFAULT_VHOST);
- when(properties.getPort()).thenReturn(PROTOCOL.PORT);
- when(properties.getConnectionTimeoutInMilliSecs()).thenReturn(60000);
- when(properties.isUseNio()).thenReturn(false);
- when(properties.isDurable()).thenReturn(true);
- when(properties.isExclusive()).thenReturn(false);
- when(properties.isAutoDelete()).thenReturn(false);
- when(properties.getContentType()).thenReturn("application/json");
- when(properties.getContentEncoding()).thenReturn("UTF-8");
- when(properties.getExchangeType()).thenReturn("topic");
- when(properties.getDeliveryMode()).thenReturn(2);
- when(properties.isUseExchange()).thenReturn(true);
- }
-
- @Test
- public void testAMQPSettings_exchange_fromuri_defaultconfig() {
- String exchangestring =
- "amqp_exchange:myExchangeName?exchangeType=topic&routingKey=test&deliveryMode=2";
- AMQPSettings settings = new AMQPSettings(properties);
- settings.fromURI(exchangestring);
- assertEquals("topic", settings.getExchangeType());
- assertEquals("test", settings.getRoutingKey());
- assertEquals("myExchangeName", settings.getQueueOrExchangeName());
- }
-
- @Test
- public void testAMQPSettings_queue_fromuri_defaultconfig() {
- String exchangestring =
- "amqp_queue:myQueueName?deliveryMode=2&durable=false&autoDelete=true&exclusive=true";
- AMQPSettings settings = new AMQPSettings(properties);
- settings.fromURI(exchangestring);
- assertFalse(settings.isDurable());
- assertTrue(settings.isExclusive());
- assertTrue(settings.autoDelete());
- assertEquals(2, settings.getDeliveryMode());
- assertEquals("myQueueName", settings.getQueueOrExchangeName());
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testAMQPSettings_exchange_fromuri_wrongdeliverymode() {
- String exchangestring =
- "amqp_exchange:myExchangeName?exchangeType=topic&routingKey=test&deliveryMode=3";
- AMQPSettings settings = new AMQPSettings(properties);
- settings.fromURI(exchangestring);
- }
-}
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManagerTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManagerTest.java
deleted file mode 100644
index 338a8b862..000000000
--- a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManagerTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.tasks.kafka;
-
-import java.time.Duration;
-import java.util.Properties;
-
-import org.apache.kafka.clients.producer.Producer;
-import org.apache.kafka.clients.producer.ProducerConfig;
-import org.apache.kafka.common.serialization.LongSerializer;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-public class KafkaProducerManagerTest {
-
- @Test
- public void testRequestTimeoutSetFromDefault() {
- KafkaProducerManager manager =
- new KafkaProducerManager(
- Duration.ofMillis(100),
- Duration.ofMillis(500),
- 10,
- Duration.ofMillis(120000));
- KafkaPublishTask.Input input = getInput();
- Properties props = manager.getProducerProperties(input);
- assertEquals(props.getProperty(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG), "100");
- }
-
- @Test
- public void testRequestTimeoutSetFromInput() {
- KafkaProducerManager manager =
- new KafkaProducerManager(
- Duration.ofMillis(100),
- Duration.ofMillis(500),
- 10,
- Duration.ofMillis(120000));
- KafkaPublishTask.Input input = getInput();
- input.setRequestTimeoutMs(200);
- Properties props = manager.getProducerProperties(input);
- assertEquals(props.getProperty(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG), "200");
- }
-
- @Test
- public void testRequestTimeoutSetFromConfig() {
- KafkaProducerManager manager =
- new KafkaProducerManager(
- Duration.ofMillis(150),
- Duration.ofMillis(500),
- 10,
- Duration.ofMillis(120000));
- KafkaPublishTask.Input input = getInput();
- Properties props = manager.getProducerProperties(input);
- assertEquals(props.getProperty(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG), "150");
- }
-
- @SuppressWarnings("rawtypes")
- @Test(expected = RuntimeException.class)
- public void testExecutionException() {
- KafkaProducerManager manager =
- new KafkaProducerManager(
- Duration.ofMillis(150),
- Duration.ofMillis(500),
- 10,
- Duration.ofMillis(120000));
- KafkaPublishTask.Input input = getInput();
- Producer producer = manager.getProducer(input);
- assertNotNull(producer);
- }
-
- @SuppressWarnings("rawtypes")
- @Test
- public void testCacheInvalidation() {
- KafkaProducerManager manager =
- new KafkaProducerManager(
- Duration.ofMillis(150), Duration.ofMillis(500), 0, Duration.ofMillis(0));
- KafkaPublishTask.Input input = getInput();
- input.setBootStrapServers("");
- Properties props = manager.getProducerProperties(input);
- Producer producerMock = mock(Producer.class);
- Producer producer = manager.getFromCache(props, () -> producerMock);
- assertNotNull(producer);
- verify(producerMock, times(1)).close();
- }
-
- @Test
- public void testMaxBlockMsFromConfig() {
- KafkaProducerManager manager =
- new KafkaProducerManager(
- Duration.ofMillis(150),
- Duration.ofMillis(500),
- 10,
- Duration.ofMillis(120000));
- KafkaPublishTask.Input input = getInput();
- Properties props = manager.getProducerProperties(input);
- assertEquals(props.getProperty(ProducerConfig.MAX_BLOCK_MS_CONFIG), "500");
- }
-
- @Test
- public void testMaxBlockMsFromInput() {
- KafkaProducerManager manager =
- new KafkaProducerManager(
- Duration.ofMillis(150),
- Duration.ofMillis(500),
- 10,
- Duration.ofMillis(120000));
- KafkaPublishTask.Input input = getInput();
- input.setMaxBlockMs(600);
- Properties props = manager.getProducerProperties(input);
- assertEquals(props.getProperty(ProducerConfig.MAX_BLOCK_MS_CONFIG), "600");
- }
-
- private KafkaPublishTask.Input getInput() {
- KafkaPublishTask.Input input = new KafkaPublishTask.Input();
- input.setTopic("testTopic");
- input.setValue("TestMessage");
- input.setKeySerializer(LongSerializer.class.getCanonicalName());
- input.setBootStrapServers("servers");
- return input;
- }
-}
diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTaskTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTaskTest.java
deleted file mode 100644
index a6e096120..000000000
--- a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTaskTest.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright 2022 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.contribs.tasks.kafka;
-
-import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-import org.apache.kafka.clients.producer.Producer;
-import org.apache.kafka.common.serialization.IntegerSerializer;
-import org.apache.kafka.common.serialization.LongSerializer;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import com.netflix.conductor.common.config.TestObjectMapperConfiguration;
-import com.netflix.conductor.core.execution.WorkflowExecutor;
-import com.netflix.conductor.model.TaskModel;
-import com.netflix.conductor.model.WorkflowModel;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@SuppressWarnings({"unchecked", "rawtypes"})
-@ContextConfiguration(classes = {TestObjectMapperConfiguration.class})
-@RunWith(SpringRunner.class)
-public class KafkaPublishTaskTest {
-
- @Autowired private ObjectMapper objectMapper;
-
- @Test
- public void missingRequest_Fail() {
- KafkaPublishTask kafkaPublishTask =
- new KafkaPublishTask(getKafkaProducerManager(), objectMapper);
- TaskModel task = new TaskModel();
- kafkaPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class));
- assertEquals(TaskModel.Status.FAILED, task.getStatus());
- }
-
- @Test
- public void missingValue_Fail() {
-
- TaskModel task = new TaskModel();
- KafkaPublishTask.Input input = new KafkaPublishTask.Input();
- input.setBootStrapServers("localhost:9092");
- input.setTopic("testTopic");
-
- task.getInputData().put(KafkaPublishTask.REQUEST_PARAMETER_NAME, input);
-
- KafkaPublishTask kPublishTask =
- new KafkaPublishTask(getKafkaProducerManager(), objectMapper);
- kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class));
- assertEquals(TaskModel.Status.FAILED, task.getStatus());
- }
-
- @Test
- public void missingBootStrapServers_Fail() {
-
- TaskModel task = new TaskModel();
- KafkaPublishTask.Input input = new KafkaPublishTask.Input();
-
- Map value = new HashMap<>();
- input.setValue(value);
- input.setTopic("testTopic");
-
- task.getInputData().put(KafkaPublishTask.REQUEST_PARAMETER_NAME, input);
-
- KafkaPublishTask kPublishTask =
- new KafkaPublishTask(getKafkaProducerManager(), objectMapper);
- kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class));
- assertEquals(TaskModel.Status.FAILED, task.getStatus());
- }
-
- @Test
- public void kafkaPublishExecutionException_Fail()
- throws ExecutionException, InterruptedException {
-
- TaskModel task = getTask();
-
- KafkaProducerManager producerManager = mock(KafkaProducerManager.class);
- KafkaPublishTask kafkaPublishTask = new KafkaPublishTask(producerManager, objectMapper);
-
- Producer producer = mock(Producer.class);
-
- when(producerManager.getProducer(any())).thenReturn(producer);
- Future publishingFuture = mock(Future.class);
- when(producer.send(any())).thenReturn(publishingFuture);
-
- ExecutionException executionException = mock(ExecutionException.class);
-
- when(executionException.getMessage()).thenReturn("Execution exception");
- when(publishingFuture.get()).thenThrow(executionException);
-
- kafkaPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class));
- assertEquals(TaskModel.Status.FAILED, task.getStatus());
- assertEquals(
- "Failed to invoke kafka task due to: Execution exception",
- task.getReasonForIncompletion());
- }
-
- @Test
- public void kafkaPublishUnknownException_Fail() {
-
- TaskModel task = getTask();
-
- KafkaProducerManager producerManager = mock(KafkaProducerManager.class);
- KafkaPublishTask kPublishTask = new KafkaPublishTask(producerManager, objectMapper);
-
- Producer producer = mock(Producer.class);
-
- when(producerManager.getProducer(any())).thenReturn(producer);
- when(producer.send(any())).thenThrow(new RuntimeException("Unknown exception"));
-
- kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class));
- assertEquals(TaskModel.Status.FAILED, task.getStatus());
- assertEquals(
- "Failed to invoke kafka task due to: Unknown exception",
- task.getReasonForIncompletion());
- }
-
- @Test
- public void kafkaPublishSuccess_Completed() {
-
- TaskModel task = getTask();
-
- KafkaProducerManager producerManager = mock(KafkaProducerManager.class);
- KafkaPublishTask kPublishTask = new KafkaPublishTask(producerManager, objectMapper);
-
- Producer producer = mock(Producer.class);
-
- when(producerManager.getProducer(any())).thenReturn(producer);
- when(producer.send(any())).thenReturn(mock(Future.class));
-
- kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class));
- assertEquals(TaskModel.Status.COMPLETED, task.getStatus());
- }
-
- @Test
- public void kafkaPublishSuccess_AsyncComplete() {
-
- TaskModel task = getTask();
- task.getInputData().put("asyncComplete", true);
-
- KafkaProducerManager producerManager = mock(KafkaProducerManager.class);
- KafkaPublishTask kPublishTask = new KafkaPublishTask(producerManager, objectMapper);
-
- Producer producer = mock(Producer.class);
-
- when(producerManager.getProducer(any())).thenReturn(producer);
- when(producer.send(any())).thenReturn(mock(Future.class));
-
- kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class));
- assertEquals(TaskModel.Status.IN_PROGRESS, task.getStatus());
- }
-
- private TaskModel getTask() {
- TaskModel task = new TaskModel();
- KafkaPublishTask.Input input = new KafkaPublishTask.Input();
- input.setBootStrapServers("localhost:9092");
-
- Map value = new HashMap<>();
-
- value.put("input_key1", "value1");
- value.put("input_key2", 45.3d);
-
- input.setValue(value);
- input.setTopic("testTopic");
- task.getInputData().put(KafkaPublishTask.REQUEST_PARAMETER_NAME, input);
- return task;
- }
-
- @Test
- public void integerSerializer_integerObject() {
- KafkaPublishTask kPublishTask =
- new KafkaPublishTask(getKafkaProducerManager(), objectMapper);
- KafkaPublishTask.Input input = new KafkaPublishTask.Input();
- input.setKeySerializer(IntegerSerializer.class.getCanonicalName());
- input.setKey(String.valueOf(Integer.MAX_VALUE));
- assertEquals(kPublishTask.getKey(input), Integer.MAX_VALUE);
- }
-
- @Test
- public void longSerializer_longObject() {
- KafkaPublishTask kPublishTask =
- new KafkaPublishTask(getKafkaProducerManager(), objectMapper);
- KafkaPublishTask.Input input = new KafkaPublishTask.Input();
- input.setKeySerializer(LongSerializer.class.getCanonicalName());
- input.setKey(String.valueOf(Long.MAX_VALUE));
- assertEquals(kPublishTask.getKey(input), Long.MAX_VALUE);
- }
-
- @Test
- public void noSerializer_StringObject() {
- KafkaPublishTask kPublishTask =
- new KafkaPublishTask(getKafkaProducerManager(), objectMapper);
- KafkaPublishTask.Input input = new KafkaPublishTask.Input();
- input.setKey("testStringKey");
- assertEquals(kPublishTask.getKey(input), "testStringKey");
- }
-
- private KafkaProducerManager getKafkaProducerManager() {
- return new KafkaProducerManager(
- Duration.ofMillis(100), Duration.ofMillis(500), 120000, Duration.ofMillis(10));
- }
-}
diff --git a/core/build.gradle b/core/build.gradle
index 1347aa5e3..53c7c7ca8 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -16,6 +16,7 @@ dependencies {
implementation project(':conductor-common')
compileOnly 'org.springframework.boot:spring-boot-starter'
compileOnly 'org.springframework.boot:spring-boot-starter-validation'
+ compileOnly 'org.springframework.retry:spring-retry'
implementation "com.fasterxml.jackson.core:jackson-annotations"
implementation "com.fasterxml.jackson.core:jackson-databind"
@@ -34,12 +35,12 @@ dependencies {
implementation "io.reactivex:rxjava:${revRxJava}"
- implementation "com.google.guava:guava:${revGuava}"
-
implementation "com.netflix.spectator:spectator-api:${revSpectator}"
implementation "org.apache.bval:bval-jsr:${revBval}"
+ implementation "com.github.ben-manes.caffeine:caffeine"
+
// JAXB is not bundled with Java 11, dependencies added explicitly
// These are needed by Apache BVAL
implementation "jakarta.xml.bind:jakarta.xml.bind-api:${revJAXB}"
@@ -49,15 +50,10 @@ dependencies {
testImplementation "org.glassfish.jaxb:jaxb-runtime:${revJAXB}"
testImplementation 'org.springframework.boot:spring-boot-starter-validation'
+ testImplementation 'org.springframework.retry:spring-retry'
testImplementation project(':conductor-common').sourceSets.test.output
testImplementation "org.codehaus.groovy:groovy-all:${revGroovy}"
testImplementation "org.spockframework:spock-core:${revSpock}"
testImplementation "org.spockframework:spock-spring:${revSpock}"
}
-
-test {
- testLogging {
- exceptionFormat = 'full'
- }
-}
diff --git a/core/dependencies.lock b/core/dependencies.lock
index f3b5cd440..bdf032d67 100644
--- a/core/dependencies.lock
+++ b/core/dependencies.lock
@@ -1,21 +1,39 @@
{
"annotationProcessor": {
"org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
}
},
"compileClasspath": {
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.13.2.2"
+ "locked": "2.11.4"
},
- "com.google.guava:guava": {
- "locked": "30.0-jre"
+ "com.fasterxml:classmate": {
+ "locked": "1.5.1",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8"
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
},
"com.google.protobuf:protobuf-java": {
"locked": "3.13.0"
@@ -39,22 +57,58 @@
"locked": "1.2.2"
},
"jakarta.activation:jakarta.activation-api": {
- "locked": "2.0.0"
+ "locked": "2.0.0",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.validation:jakarta.validation-api": {
+ "locked": "2.0.2",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
},
"jakarta.xml.bind:jakarta.xml.bind-api": {
"locked": "2.3.3"
},
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
"org.apache.bval:bval-jsr": {
"locked": "2.0.5"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
"locked": "2.17.1"
@@ -65,52 +119,174 @@
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "org.glassfish:jakarta.el": {
+ "locked": "3.0.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.hibernate.validator:hibernate-validator": {
+ "locked": "6.1.7.Final",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.jboss.logging:jboss-logging": {
+ "locked": "3.4.2.Final",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-validation": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.retry:spring-retry": {
+ "locked": "1.2.5.RELEASE"
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.retry:spring-retry",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
},
"runtimeClasspath": {
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2.2"
+ ]
},
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8"
},
- "com.google.guava:guava": {
- "locked": "30.0-jre"
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.13.0"
+ ]
},
"com.jayway.jsonpath:json-path": {
"locked": "2.4.0"
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -128,77 +304,139 @@
"locked": "1.2.2"
},
"jakarta.activation:jakarta.activation-api": {
- "locked": "2.0.0"
+ "locked": "2.0.0",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
},
"jakarta.xml.bind:jakarta.xml.bind-api": {
"locked": "2.3.3"
},
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
"org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
+ "locked": "2.0.5",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.5"
+ ]
},
"org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
+ "locked": "3.10",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.12.0"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl"
+ ]
}
},
"testCompileClasspath": {
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.13.2.2"
+ "locked": "2.11.4"
},
- "com.google.guava:guava": {
- "locked": "30.0-jre"
+ "com.fasterxml:classmate": {
+ "locked": "1.5.1",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8"
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
},
"com.google.protobuf:protobuf-java": {
"locked": "3.13.0"
},
"com.jayway.jsonpath:json-path": {
- "locked": "2.4.0"
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -209,103 +447,697 @@
"com.spotify:completable-futures": {
"locked": "0.3.3"
},
+ "com.sun.istack:istack-commons-runtime": {
+ "locked": "3.0.11",
+ "transitive": [
+ "org.glassfish.jaxb:jaxb-runtime"
+ ]
+ },
+ "com.thoughtworks.qdox:qdox": {
+ "locked": "1.12.1",
+ "transitive": [
+ "org.codehaus.groovy:groovy-docgenerator"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-cli:commons-cli": {
+ "locked": "1.4",
+ "transitive": [
+ "org.codehaus.groovy:groovy-cli-commons"
+ ]
+ },
"commons-io:commons-io": {
"locked": "2.7"
},
+ "info.picocli:picocli": {
+ "locked": "4.3.2",
+ "transitive": [
+ "org.codehaus.groovy:groovy-cli-picocli"
+ ]
+ },
"io.reactivex:rxjava": {
"locked": "1.2.2"
},
"jakarta.activation:jakarta.activation-api": {
- "locked": "2.0.0"
+ "locked": "2.0.0",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.validation:jakarta.validation-api": {
+ "locked": "2.0.2",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
},
"jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3"
+ "locked": "2.3.3",
+ "transitive": [
+ "org.glassfish.jaxb:jaxb-runtime",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "jline:jline": {
+ "locked": "2.14.6",
+ "transitive": [
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
},
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test",
+ "org.junit.vintage:junit-vintage-engine",
+ "org.spockframework:spock-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.ant:ant": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.apache.ant:ant-launcher": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.apache.ant:ant"
+ ]
},
"org.apache.bval:bval-jsr": {
"locked": "2.0.5"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.12.0"
+ "locked": "3.10"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.17.1"
+ "locked": "2.17.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
"locked": "2.17.1"
},
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "org.codehaus.groovy:groovy": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-ant",
+ "org.codehaus.groovy:groovy-cli-commons",
+ "org.codehaus.groovy:groovy-cli-picocli",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-datetime",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-groovysh",
+ "org.codehaus.groovy:groovy-jmx",
+ "org.codehaus.groovy:groovy-json",
+ "org.codehaus.groovy:groovy-jsr223",
+ "org.codehaus.groovy:groovy-macro",
+ "org.codehaus.groovy:groovy-nio",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.codehaus.groovy:groovy-sql",
+ "org.codehaus.groovy:groovy-swing",
+ "org.codehaus.groovy:groovy-templates",
+ "org.codehaus.groovy:groovy-test",
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.codehaus.groovy:groovy-testng",
+ "org.codehaus.groovy:groovy-xml",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
"org.codehaus.groovy:groovy-all": {
"locked": "2.5.13"
},
+ "org.codehaus.groovy:groovy-ant": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-cli-commons": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-cli-picocli": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
+ "org.codehaus.groovy:groovy-console": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
+ "org.codehaus.groovy:groovy-datetime": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-docgenerator": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-groovydoc": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.codehaus.groovy:groovy-groovysh": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-jmx": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-json": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-jsr223": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-macro": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-nio": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-servlet": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-sql": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-swing": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console"
+ ]
+ },
+ "org.codehaus.groovy:groovy-templates": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-test": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-test-junit5": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-testng": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-xml": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.codehaus.groovy:groovy-templates",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
"org.glassfish.jaxb:jaxb-runtime": {
"locked": "2.3.3"
},
+ "org.glassfish.jaxb:txw2": {
+ "locked": "2.3.4",
+ "transitive": [
+ "org.glassfish.jaxb:jaxb-runtime"
+ ]
+ },
+ "org.glassfish:jakarta.el": {
+ "locked": "3.0.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.hamcrest:hamcrest-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest-core": {
+ "locked": "2.2",
+ "transitive": [
+ "junit:junit"
+ ]
+ },
+ "org.hibernate.validator:hibernate-validator": {
+ "locked": "6.1.7.Final",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.jboss.logging:jboss-logging": {
+ "locked": "3.4.2.Final",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-params"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.platform:junit-platform-launcher",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-launcher": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.platform:junit-platform-launcher",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
"org.spockframework:spock-core": {
- "locked": "1.3-groovy-2.5"
+ "locked": "1.3-groovy-2.5",
+ "transitive": [
+ "org.spockframework:spock-spring"
+ ]
},
"org.spockframework:spock-spring": {
"locked": "1.3-groovy-2.5"
},
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
},
"org.springframework.boot:spring-boot-starter-validation": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework.retry:spring-retry": {
+ "locked": "1.2.5.RELEASE"
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.retry:spring-retry",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
},
"testRuntimeClasspath": {
+ "com.beust:jcommander": {
+ "locked": "1.72",
+ "transitive": [
+ "org.testng:testng"
+ ]
+ },
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.13.2"
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind"
+ ]
},
"com.fasterxml.jackson.core:jackson-core": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
+ "com.fasterxml.jackson.core:jackson-databind",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2"
+ ]
},
"com.fasterxml.jackson.core:jackson-databind": {
- "firstLevelTransitive": [
+ "locked": "2.11.4",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.13.2.2"
+ ]
},
- "com.github.rholder:guava-retrying": {
- "firstLevelTransitive": [
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.0"
+ "com.fasterxml:classmate": {
+ "locked": "1.5.1",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
},
- "com.google.guava:guava": {
- "locked": "30.0-jre"
+ "com.github.ben-manes.caffeine:caffeine": {
+ "locked": "2.8.8"
+ },
+ "com.google.errorprone:error_prone_annotations": {
+ "locked": "2.4.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
},
"com.google.protobuf:protobuf-java": {
- "firstLevelTransitive": [
+ "locked": "3.13.0",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.13.0"
+ ]
},
"com.jayway.jsonpath:json-path": {
- "locked": "2.4.0"
+ "locked": "2.4.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
},
"com.netflix.conductor:conductor-annotations": {
- "firstLevelTransitive": [
+ "project": true,
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "project": true
+ ]
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -316,88 +1148,696 @@
"com.spotify:completable-futures": {
"locked": "0.3.3"
},
+ "com.sun.activation:jakarta.activation": {
+ "locked": "1.2.2",
+ "transitive": [
+ "org.glassfish.jaxb:jaxb-runtime"
+ ]
+ },
+ "com.sun.istack:istack-commons-runtime": {
+ "locked": "3.0.11",
+ "transitive": [
+ "org.glassfish.jaxb:jaxb-runtime"
+ ]
+ },
+ "com.thoughtworks.qdox:qdox": {
+ "locked": "1.12.1",
+ "transitive": [
+ "org.codehaus.groovy:groovy-docgenerator"
+ ]
+ },
+ "com.vaadin.external.google:android-json": {
+ "locked": "0.0.20131108.vaadin1",
+ "transitive": [
+ "org.skyscreamer:jsonassert"
+ ]
+ },
+ "commons-cli:commons-cli": {
+ "locked": "1.4",
+ "transitive": [
+ "org.codehaus.groovy:groovy-cli-commons"
+ ]
+ },
"commons-io:commons-io": {
"locked": "2.7"
},
+ "info.picocli:picocli": {
+ "locked": "4.3.2",
+ "transitive": [
+ "org.codehaus.groovy:groovy-cli-picocli"
+ ]
+ },
"io.reactivex:rxjava": {
"locked": "1.2.2"
},
"jakarta.activation:jakarta.activation-api": {
- "locked": "2.0.0"
+ "locked": "2.0.0",
+ "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api"
+ ]
+ },
+ "jakarta.annotation:jakarta.annotation-api": {
+ "locked": "1.3.5",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
+ },
+ "jakarta.validation:jakarta.validation-api": {
+ "locked": "2.0.2",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
},
"jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3"
+ "locked": "2.3.3",
+ "transitive": [
+ "org.glassfish.jaxb:jaxb-runtime",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "jline:jline": {
+ "locked": "2.14.6",
+ "transitive": [
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
},
"junit:junit": {
- "locked": "4.13.2"
+ "locked": "4.13.2",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test",
+ "org.junit.vintage:junit-vintage-engine",
+ "org.spockframework:spock-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.bytebuddy:byte-buddy-agent": {
+ "locked": "1.10.22",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "net.minidev:accessors-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "net.minidev:json-smart"
+ ]
+ },
+ "net.minidev:json-smart": {
+ "locked": "2.3.1",
+ "transitive": [
+ "com.jayway.jsonpath:json-path"
+ ]
+ },
+ "org.apache.ant:ant": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.apache.ant:ant-junit",
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.apache.ant:ant-antlr": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.apache.ant:ant-junit": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.apache.ant:ant-launcher": {
+ "locked": "1.9.15",
+ "transitive": [
+ "org.apache.ant:ant",
+ "org.codehaus.groovy:groovy-ant"
+ ]
},
"org.apache.bval:bval-jsr": {
- "firstLevelTransitive": [
+ "locked": "2.0.5",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.0.5"
+ ]
},
"org.apache.commons:commons-lang3": {
- "firstLevelTransitive": [
+ "locked": "3.10",
+ "transitive": [
"com.netflix.conductor:conductor-common"
- ],
- "locked": "3.12.0"
+ ]
},
"org.apache.logging.log4j:log4j-api": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-core",
+ "org.apache.logging.log4j:log4j-jul",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web"
+ ]
},
"org.apache.logging.log4j:log4j-core": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.apache.logging.log4j:log4j-web",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-jul": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
- "com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ "com.netflix.conductor:conductor-common",
+ "org.springframework.boot:spring-boot-starter-log4j2"
+ ]
},
"org.apache.logging.log4j:log4j-web": {
- "firstLevelTransitive": [
+ "locked": "2.17.1",
+ "transitive": [
"com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ],
- "locked": "2.17.1"
+ ]
+ },
+ "org.apiguardian:apiguardian-api": {
+ "locked": "1.1.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.assertj:assertj-core": {
+ "locked": "3.16.1",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.checkerframework:checker-qual": {
+ "locked": "3.8.0",
+ "transitive": [
+ "com.github.ben-manes.caffeine:caffeine"
+ ]
+ },
+ "org.codehaus.groovy:groovy": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-ant",
+ "org.codehaus.groovy:groovy-cli-commons",
+ "org.codehaus.groovy:groovy-cli-picocli",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-datetime",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-groovysh",
+ "org.codehaus.groovy:groovy-jmx",
+ "org.codehaus.groovy:groovy-json",
+ "org.codehaus.groovy:groovy-jsr223",
+ "org.codehaus.groovy:groovy-macro",
+ "org.codehaus.groovy:groovy-nio",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.codehaus.groovy:groovy-sql",
+ "org.codehaus.groovy:groovy-swing",
+ "org.codehaus.groovy:groovy-templates",
+ "org.codehaus.groovy:groovy-test",
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.codehaus.groovy:groovy-testng",
+ "org.codehaus.groovy:groovy-xml",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
},
"org.codehaus.groovy:groovy-all": {
"locked": "2.5.13"
},
+ "org.codehaus.groovy:groovy-ant": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-cli-commons": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-cli-picocli": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
+ "org.codehaus.groovy:groovy-console": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-groovysh"
+ ]
+ },
+ "org.codehaus.groovy:groovy-datetime": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-docgenerator": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-groovydoc"
+ ]
+ },
+ "org.codehaus.groovy:groovy-groovydoc": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-ant"
+ ]
+ },
+ "org.codehaus.groovy:groovy-groovysh": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-jmx": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-json": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-jsr223": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-macro": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-nio": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-servlet": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-sql": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-swing": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console"
+ ]
+ },
+ "org.codehaus.groovy:groovy-templates": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-console",
+ "org.codehaus.groovy:groovy-docgenerator",
+ "org.codehaus.groovy:groovy-groovydoc",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-test": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
+ "org.codehaus.groovy:groovy-test-junit5": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-testng": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all"
+ ]
+ },
+ "org.codehaus.groovy:groovy-xml": {
+ "locked": "2.5.14",
+ "transitive": [
+ "org.codehaus.groovy:groovy-all",
+ "org.codehaus.groovy:groovy-servlet",
+ "org.codehaus.groovy:groovy-templates",
+ "org.spockframework:spock-core",
+ "org.spockframework:spock-spring"
+ ]
+ },
"org.glassfish.jaxb:jaxb-runtime": {
"locked": "2.3.3"
},
+ "org.glassfish.jaxb:txw2": {
+ "locked": "2.3.4",
+ "transitive": [
+ "org.glassfish.jaxb:jaxb-runtime"
+ ]
+ },
+ "org.glassfish:jakarta.el": {
+ "locked": "3.0.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.hamcrest:hamcrest": {
+ "locked": "2.2",
+ "transitive": [
+ "org.hamcrest:hamcrest-core",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.hamcrest:hamcrest-core": {
+ "locked": "2.2",
+ "transitive": [
+ "junit:junit"
+ ]
+ },
+ "org.hibernate.validator:hibernate-validator": {
+ "locked": "6.1.7.Final",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
+ "org.jboss.logging:jboss-logging": {
+ "locked": "3.4.2.Final",
+ "transitive": [
+ "org.hibernate.validator:hibernate-validator"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-api": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.mockito:mockito-junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5",
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.jupiter:junit-jupiter-params": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter"
+ ]
+ },
+ "org.junit.platform:junit-platform-commons": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-engine": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.platform:junit-platform-launcher",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.junit.platform:junit-platform-launcher": {
+ "locked": "1.6.3",
+ "transitive": [
+ "org.codehaus.groovy:groovy-test-junit5"
+ ]
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.junit:junit-bom": {
+ "locked": "5.6.3",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter",
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.jupiter:junit-jupiter-engine",
+ "org.junit.jupiter:junit-jupiter-params",
+ "org.junit.platform:junit-platform-commons",
+ "org.junit.platform:junit-platform-engine",
+ "org.junit.platform:junit-platform-launcher",
+ "org.junit.vintage:junit-vintage-engine"
+ ]
+ },
+ "org.mockito:mockito-core": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.mockito:mockito-junit-jupiter",
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.mockito:mockito-junit-jupiter": {
+ "locked": "3.3.3",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.objenesis:objenesis": {
+ "locked": "2.6",
+ "transitive": [
+ "org.mockito:mockito-core"
+ ]
+ },
+ "org.opentest4j:opentest4j": {
+ "locked": "1.2.0",
+ "transitive": [
+ "org.junit.jupiter:junit-jupiter-api",
+ "org.junit.platform:junit-platform-engine"
+ ]
+ },
+ "org.ow2.asm:asm": {
+ "locked": "5.0.4",
+ "transitive": [
+ "net.minidev:accessors-smart"
+ ]
+ },
+ "org.skyscreamer:jsonassert": {
+ "locked": "1.5.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.slf4j:jul-to-slf4j": {
+ "locked": "1.7.30",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-log4j2",
+ "org.springframework.boot:spring-boot-starter-logging"
+ ]
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.30",
+ "transitive": [
+ "com.jayway.jsonpath:json-path",
+ "com.netflix.spectator:spectator-api",
+ "org.apache.logging.log4j:log4j-slf4j-impl",
+ "org.slf4j:jul-to-slf4j"
+ ]
+ },
"org.spockframework:spock-core": {
- "locked": "1.3-groovy-2.5"
+ "locked": "1.3-groovy-2.5",
+ "transitive": [
+ "org.spockframework:spock-spring"
+ ]
},
"org.spockframework:spock-spring": {
"locked": "1.3-groovy-2.5"
},
+ "org.springframework.boot:spring-boot": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-autoconfigure",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-starter-validation"
+ ]
+ },
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-starter-logging": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
},
"org.springframework.boot:spring-boot-starter-validation": {
- "locked": "2.6.6"
+ "locked": "2.3.12.RELEASE"
+ },
+ "org.springframework.boot:spring-boot-test": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.boot:spring-boot-test-autoconfigure"
+ ]
+ },
+ "org.springframework.boot:spring-boot-test-autoconfigure": {
+ "locked": "2.3.12.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.springframework.retry:spring-retry": {
+ "locked": "1.2.5.RELEASE"
+ },
+ "org.springframework:spring-aop": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-beans": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-aop",
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-context": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot"
+ ]
+ },
+ "org.springframework:spring-core": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot",
+ "org.springframework.boot:spring-boot-starter",
+ "org.springframework.boot:spring-boot-starter-test",
+ "org.springframework.retry:spring-retry",
+ "org.springframework:spring-aop",
+ "org.springframework:spring-beans",
+ "org.springframework:spring-context",
+ "org.springframework:spring-expression",
+ "org.springframework:spring-test"
+ ]
+ },
+ "org.springframework:spring-expression": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-context"
+ ]
+ },
+ "org.springframework:spring-jcl": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework:spring-core"
+ ]
+ },
+ "org.springframework:spring-test": {
+ "locked": "5.2.15.RELEASE",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.testng:testng": {
+ "locked": "6.13.1",
+ "transitive": [
+ "org.codehaus.groovy:groovy-testng"
+ ]
+ },
+ "org.xmlunit:xmlunit-core": {
+ "locked": "2.7.0",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter-test"
+ ]
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "1.26",
+ "transitive": [
+ "org.springframework.boot:spring-boot-starter"
+ ]
}
}
}
\ No newline at end of file
diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ExecuteFunction.java b/core/src/main/java/com/netflix/conductor/annotations/VisibleForTesting.java
similarity index 59%
rename from mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ExecuteFunction.java
rename to core/src/main/java/com/netflix/conductor/annotations/VisibleForTesting.java
index e94d878f4..492931128 100644
--- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ExecuteFunction.java
+++ b/core/src/main/java/com/netflix/conductor/annotations/VisibleForTesting.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -10,17 +10,15 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.mysql.util;
+package com.netflix.conductor.annotations;
-import java.sql.SQLException;
+import java.lang.annotation.*;
/**
- * Functional interface for {@link Query} executions with no expected result.
- *
- * @author mustafa
+ * Annotates a program element that exists, or is more widely visible than otherwise necessary, only
+ * for use in test code.
*/
-@FunctionalInterface
-public interface ExecuteFunction {
-
- void apply(Query query) throws SQLException;
-}
+@Retention(RetentionPolicy.CLASS)
+@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
+@Documented
+public @interface VisibleForTesting {}
diff --git a/core/src/main/java/com/netflix/conductor/core/WorkflowContext.java b/core/src/main/java/com/netflix/conductor/core/WorkflowContext.java
index 2f996a47a..d870761c5 100644
--- a/core/src/main/java/com/netflix/conductor/core/WorkflowContext.java
+++ b/core/src/main/java/com/netflix/conductor/core/WorkflowContext.java
@@ -44,12 +44,16 @@ public static void unset() {
THREAD_LOCAL.remove();
}
- /** @return the clientApp */
+ /**
+ * @return the clientApp
+ */
public String getClientApp() {
return clientApp;
}
- /** @return the username */
+ /**
+ * @return the username
+ */
public String getUserName() {
return userName;
}
diff --git a/core/src/main/java/com/netflix/conductor/core/config/ConductorCoreConfiguration.java b/core/src/main/java/com/netflix/conductor/core/config/ConductorCoreConfiguration.java
index 100cab754..eedef68f1 100644
--- a/core/src/main/java/com/netflix/conductor/core/config/ConductorCoreConfiguration.java
+++ b/core/src/main/java/com/netflix/conductor/core/config/ConductorCoreConfiguration.java
@@ -14,12 +14,14 @@
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.stream.Collectors;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -27,6 +29,10 @@
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.retry.RetryContext;
+import org.springframework.retry.backoff.NoBackOffPolicy;
+import org.springframework.retry.policy.SimpleRetryPolicy;
+import org.springframework.retry.support.RetryTemplate;
import com.netflix.conductor.common.metadata.tasks.TaskType;
import com.netflix.conductor.common.utils.ExternalPayloadStorage;
@@ -37,12 +43,11 @@
import com.netflix.conductor.core.listener.WorkflowStatusListenerStub;
import com.netflix.conductor.core.storage.DummyPayloadStorage;
import com.netflix.conductor.core.sync.Lock;
-import com.netflix.conductor.core.sync.NoopLock;
-
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.netflix.conductor.core.sync.noop.NoopLock;
import static com.netflix.conductor.core.events.EventQueues.EVENT_QUEUE_PROVIDERS_QUALIFIER;
import static com.netflix.conductor.core.execution.tasks.SystemTaskRegistry.ASYNC_SYSTEM_TASKS_QUALIFIER;
+import static com.netflix.conductor.core.utils.Utils.isTransientException;
import static java.util.function.Function.identity;
@@ -83,9 +88,9 @@ public WorkflowStatusListener workflowStatusListener() {
@Bean
public ExecutorService executorService(ConductorProperties conductorProperties) {
ThreadFactory threadFactory =
- new ThreadFactoryBuilder()
- .setNameFormat("conductor-worker-%d")
- .setDaemon(true)
+ new BasicThreadFactory.Builder()
+ .namingPattern("conductor-worker-%d")
+ .daemon(true)
.build();
return Executors.newFixedThreadPool(
conductorProperties.getExecutorServiceMaxThreadCount(), threadFactory);
@@ -112,4 +117,27 @@ public Map getEventQueueProviders(
return eventQueueProviders.stream()
.collect(Collectors.toMap(EventQueueProvider::getQueueType, identity()));
}
+
+ @Bean
+ public RetryTemplate onTransientErrorRetryTemplate() {
+ SimpleRetryPolicy retryPolicy = new CustomRetryPolicy();
+ retryPolicy.setMaxAttempts(3);
+
+ RetryTemplate retryTemplate = new RetryTemplate();
+ retryTemplate.setRetryPolicy(retryPolicy);
+ retryTemplate.setBackOffPolicy(new NoBackOffPolicy());
+ return retryTemplate;
+ }
+
+ public static class CustomRetryPolicy extends SimpleRetryPolicy {
+
+ @Override
+ public boolean canRetry(final RetryContext context) {
+ final Optional lastThrowable =
+ Optional.ofNullable(context.getLastThrowable());
+ return lastThrowable
+ .map(throwable -> super.canRetry(context) && isTransientException(throwable))
+ .orElseGet(() -> super.canRetry(context));
+ }
+ }
}
diff --git a/core/src/main/java/com/netflix/conductor/core/config/ConductorProperties.java b/core/src/main/java/com/netflix/conductor/core/config/ConductorProperties.java
index ecdc6a375..b223008a1 100644
--- a/core/src/main/java/com/netflix/conductor/core/config/ConductorProperties.java
+++ b/core/src/main/java/com/netflix/conductor/core/config/ConductorProperties.java
@@ -510,7 +510,9 @@ public void setMaxWorkflowVariablesPayloadSizeThreshold(
this.maxWorkflowVariablesPayloadSizeThreshold = maxWorkflowVariablesPayloadSizeThreshold;
}
- /** @return Returns all the configurations in a map. */
+ /**
+ * @return Returns all the configurations in a map.
+ */
public Map getAll() {
Map map = new HashMap<>();
Properties props = System.getProperties();
diff --git a/core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java b/core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java
index f5a453b03..364406e10 100644
--- a/core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java
+++ b/core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java
@@ -16,6 +16,7 @@
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@@ -24,7 +25,6 @@
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
import rx.Scheduler;
import rx.schedulers.Schedulers;
@@ -43,8 +43,8 @@ public class SchedulerConfiguration implements SchedulingConfigurer {
@Bean
public Scheduler scheduler(ConductorProperties properties) {
ThreadFactory threadFactory =
- new ThreadFactoryBuilder()
- .setNameFormat("event-queue-poll-scheduler-thread-%d")
+ new BasicThreadFactory.Builder()
+ .namingPattern("event-queue-poll-scheduler-thread-%d")
.build();
Executor executorService =
Executors.newFixedThreadPool(
@@ -60,7 +60,7 @@ public Executor sweeperExecutor(ConductorProperties properties) {
"conductor.app.sweeper-thread-count must be greater than 0.");
}
ThreadFactory threadFactory =
- new ThreadFactoryBuilder().setNameFormat("sweeper-thread-%d").build();
+ new BasicThreadFactory.Builder().namingPattern("sweeper-thread-%d").build();
return Executors.newFixedThreadPool(properties.getSweeperThreadCount(), threadFactory);
}
diff --git a/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java b/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java
index bf635be40..5b905a285 100644
--- a/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java
+++ b/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java
@@ -449,7 +449,9 @@ public List getTasksForWorkflow(String workflowId) {
public TaskModel getTaskModel(String taskId) {
TaskModel taskModel = getTaskFromDatastore(taskId);
- populateTaskData(taskModel);
+ if (taskModel != null) {
+ populateTaskData(taskModel);
+ }
return taskModel;
}
diff --git a/core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java b/core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java
index c9422cd8c..19767c478 100644
--- a/core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java
+++ b/core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java
@@ -22,9 +22,12 @@
import java.util.concurrent.ThreadFactory;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.retry.support.RetryTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
@@ -32,11 +35,9 @@
import com.netflix.conductor.common.metadata.events.EventExecution.Status;
import com.netflix.conductor.common.metadata.events.EventHandler;
import com.netflix.conductor.common.metadata.events.EventHandler.Action;
-import com.netflix.conductor.common.utils.RetryUtil;
import com.netflix.conductor.core.config.ConductorProperties;
import com.netflix.conductor.core.events.queue.Message;
import com.netflix.conductor.core.events.queue.ObservableQueue;
-import com.netflix.conductor.core.exception.ApplicationException;
import com.netflix.conductor.core.execution.evaluators.Evaluator;
import com.netflix.conductor.core.utils.JsonUtils;
import com.netflix.conductor.metrics.Monitors;
@@ -44,9 +45,10 @@
import com.netflix.conductor.service.MetadataService;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.spotify.futures.CompletableFutures;
+import static com.netflix.conductor.core.utils.Utils.isTransientException;
+
/**
* Event Processor is used to dispatch actions configured in the event handlers, based on incoming
* events to the event queues.
@@ -61,7 +63,6 @@
public class DefaultEventProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultEventProcessor.class);
- private static final int RETRY_COUNT = 3;
private final MetadataService metadataService;
private final ExecutionService executionService;
@@ -72,6 +73,7 @@ public class DefaultEventProcessor {
private final JsonUtils jsonUtils;
private final boolean isEventMessageIndexingEnabled;
private final Map evaluators;
+ private final RetryTemplate retryTemplate;
public DefaultEventProcessor(
ExecutionService executionService,
@@ -80,7 +82,8 @@ public DefaultEventProcessor(
JsonUtils jsonUtils,
ConductorProperties properties,
ObjectMapper objectMapper,
- Map evaluators) {
+ Map evaluators,
+ @Qualifier("onTransientErrorRetryTemplate") RetryTemplate retryTemplate) {
this.executionService = executionService;
this.metadataService = metadataService;
this.actionProcessor = actionProcessor;
@@ -94,12 +97,15 @@ public DefaultEventProcessor(
+ "processing, set conductor.default-event-processor.enabled=false.");
}
ThreadFactory threadFactory =
- new ThreadFactoryBuilder().setNameFormat("event-action-executor-thread-%d").build();
+ new BasicThreadFactory.Builder()
+ .namingPattern("event-action-executor-thread-%d")
+ .build();
eventActionExecutorService =
Executors.newFixedThreadPool(
properties.getEventProcessorThreadCount(), threadFactory);
this.isEventMessageIndexingEnabled = properties.isEventMessageIndexingEnabled();
+ this.retryTemplate = retryTemplate;
LOGGER.info("Event Processing is ENABLED");
}
@@ -254,30 +260,21 @@ protected CompletableFuture> executeActionsForEventHandler(
*/
protected EventExecution execute(EventExecution eventExecution, Action action, Object payload) {
try {
- String methodName = "executeEventAction";
- String description =
- String.format(
- "Executing action: %s for event: %s with messageId: %s with payload: %s",
- action.getAction(),
- eventExecution.getId(),
- eventExecution.getMessageId(),
- payload);
- LOGGER.debug(description);
+ LOGGER.debug(
+ "Executing action: {} for event: {} with messageId: {} with payload: {}",
+ action.getAction(),
+ eventExecution.getId(),
+ eventExecution.getMessageId(),
+ payload);
Map output =
- new RetryUtil>()
- .retryOnException(
- () ->
- actionProcessor.execute(
- action,
- payload,
- eventExecution.getEvent(),
- eventExecution.getMessageId()),
- this::isTransientException,
- null,
- RETRY_COUNT,
- description,
- methodName);
+ retryTemplate.execute(
+ context ->
+ actionProcessor.execute(
+ action,
+ payload,
+ eventExecution.getEvent(),
+ eventExecution.getMessageId()));
if (output != null) {
eventExecution.getOutput().putAll(output);
}
@@ -293,7 +290,7 @@ protected EventExecution execute(EventExecution eventExecution, Action action, O
eventExecution.getEvent(),
eventExecution.getMessageId(),
e);
- if (!isTransientException(e.getCause())) {
+ if (!isTransientException(e)) {
// not a transient error, fail the event execution
eventExecution.setStatus(Status.FAILED);
eventExecution.getOutput().put("exception", e.getMessage());
@@ -307,24 +304,6 @@ protected EventExecution execute(EventExecution eventExecution, Action action, O
return eventExecution;
}
- /**
- * Used to determine if the exception is thrown due to a transient failure and the operation is
- * expected to succeed upon retrying.
- *
- * @param throwableException the exception that is thrown
- * @return true - if the exception is a transient failure false - if the exception is
- * non-transient
- */
- protected boolean isTransientException(Throwable throwableException) {
- if (throwableException != null) {
- return !((throwableException instanceof UnsupportedOperationException)
- || (throwableException instanceof ApplicationException
- && ((ApplicationException) throwableException).getCode()
- != ApplicationException.Code.BACKEND_ERROR));
- }
- return true;
- }
-
private Object getPayloadObject(String payload) {
Object payloadObject = null;
if (payload != null) {
diff --git a/core/src/main/java/com/netflix/conductor/core/events/queue/Message.java b/core/src/main/java/com/netflix/conductor/core/events/queue/Message.java
index 7db1ac56d..b7d33961f 100644
--- a/core/src/main/java/com/netflix/conductor/core/events/queue/Message.java
+++ b/core/src/main/java/com/netflix/conductor/core/events/queue/Message.java
@@ -36,32 +36,44 @@ public Message(String id, String payload, String receipt, int priority) {
this.priority = priority;
}
- /** @return the payload */
+ /**
+ * @return the payload
+ */
public String getPayload() {
return payload;
}
- /** @param payload the payload to set */
+ /**
+ * @param payload the payload to set
+ */
public void setPayload(String payload) {
this.payload = payload;
}
- /** @return the id */
+ /**
+ * @return the id
+ */
public String getId() {
return id;
}
- /** @param id the id to set */
+ /**
+ * @param id the id to set
+ */
public void setId(String id) {
this.id = id;
}
- /** @return Receipt attached to the message */
+ /**
+ * @return Receipt attached to the message
+ */
public String getReceipt() {
return receipt;
}
- /** @param receipt Receipt attached to the message */
+ /**
+ * @param receipt Receipt attached to the message
+ */
public void setReceipt(String receipt) {
this.receipt = receipt;
}
diff --git a/core/src/main/java/com/netflix/conductor/core/events/queue/ObservableQueue.java b/core/src/main/java/com/netflix/conductor/core/events/queue/ObservableQueue.java
index 897090ba7..718cded76 100644
--- a/core/src/main/java/com/netflix/conductor/core/events/queue/ObservableQueue.java
+++ b/core/src/main/java/com/netflix/conductor/core/events/queue/ObservableQueue.java
@@ -20,16 +20,24 @@
public interface ObservableQueue extends Lifecycle {
- /** @return An observable for the given queue */
+ /**
+ * @return An observable for the given queue
+ */
Observable observe();
- /** @return Type of the queue */
+ /**
+ * @return Type of the queue
+ */
String getType();
- /** @return Name of the queue */
+ /**
+ * @return Name of the queue
+ */
String getName();
- /** @return URI identifier for the queue. */
+ /**
+ * @return URI identifier for the queue.
+ */
String getURI();
/**
@@ -38,7 +46,9 @@ public interface ObservableQueue extends Lifecycle {
*/
List ack(List messages);
- /** @param messages Messages to be published */
+ /**
+ * @param messages Messages to be published
+ */
void publish(List messages);
/**
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java b/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java
index 493570b04..4a480a07f 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java
@@ -24,6 +24,7 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.TaskDef;
import com.netflix.conductor.common.metadata.tasks.TaskType;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
@@ -43,8 +44,6 @@
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
-import com.google.common.annotations.VisibleForTesting;
-
import static com.netflix.conductor.common.metadata.tasks.TaskType.TERMINATE;
import static com.netflix.conductor.model.TaskModel.Status.*;
@@ -58,8 +57,7 @@ public class DeciderService {
private static final Logger LOGGER = LoggerFactory.getLogger(DeciderService.class);
- @VisibleForTesting static final String MAX_TASK_LIMIT = "conductor.app.max-task-limit";
-
+ private final IDGenerator idGenerator;
private final ParametersUtils parametersUtils;
private final ExternalPayloadStorageUtils externalPayloadStorageUtils;
private final MetadataDAO metadataDAO;
@@ -81,6 +79,7 @@ public class DeciderService {
&& task.getStatus().isSuccessful());
public DeciderService(
+ IDGenerator idGenerator,
ParametersUtils parametersUtils,
MetadataDAO metadataDAO,
ExternalPayloadStorageUtils externalPayloadStorageUtils,
@@ -88,6 +87,7 @@ public DeciderService(
@Qualifier("taskMappersByTaskType") Map taskMappers,
@Value("${conductor.app.taskPendingTimeThreshold:60m}")
Duration taskPendingTimeThreshold) {
+ this.idGenerator = idGenerator;
this.metadataDAO = metadataDAO;
this.parametersUtils = parametersUtils;
this.taskMappers = taskMappers;
@@ -569,7 +569,7 @@ Optional retry(
rescheduled.setCallbackAfterSeconds(startDelay);
rescheduled.setRetryCount(task.getRetryCount() + 1);
rescheduled.setRetried(false);
- rescheduled.setTaskId(IDGenerator.generate());
+ rescheduled.setTaskId(idGenerator.generate());
rescheduled.setRetriedTaskId(task.getTaskId());
rescheduled.setStatus(SCHEDULED);
rescheduled.setPollCount(0);
@@ -832,7 +832,7 @@ public List getTasksToBeScheduled(
.map(TaskModel::getReferenceTaskName)
.collect(Collectors.toList());
- String taskId = IDGenerator.generate();
+ String taskId = idGenerator.generate();
TaskMapperContext taskMapperContext =
TaskMapperContext.newBuilder()
.withWorkflowModel(workflow)
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java b/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java
index 1fd88f909..be4912296 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java
@@ -22,13 +22,13 @@
import org.springframework.stereotype.Component;
import com.netflix.conductor.annotations.Trace;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.*;
import com.netflix.conductor.common.metadata.workflow.RerunWorkflowRequest;
import com.netflix.conductor.common.metadata.workflow.SkipTaskRequest;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
import com.netflix.conductor.common.metadata.workflow.WorkflowTask;
import com.netflix.conductor.common.run.Workflow;
-import com.netflix.conductor.common.utils.RetryUtil;
import com.netflix.conductor.common.utils.TaskUtils;
import com.netflix.conductor.core.WorkflowContext;
import com.netflix.conductor.core.config.ConductorProperties;
@@ -44,6 +44,7 @@
import com.netflix.conductor.core.utils.IDGenerator;
import com.netflix.conductor.core.utils.ParametersUtils;
import com.netflix.conductor.core.utils.QueueUtils;
+import com.netflix.conductor.core.utils.Utils;
import com.netflix.conductor.dao.MetadataDAO;
import com.netflix.conductor.dao.QueueDAO;
import com.netflix.conductor.metrics.Monitors;
@@ -51,9 +52,6 @@
import com.netflix.conductor.model.WorkflowModel;
import com.netflix.conductor.service.ExecutionLockService;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-
import static com.netflix.conductor.core.exception.ApplicationException.Code.*;
import static com.netflix.conductor.core.utils.Utils.DECIDER_QUEUE;
import static com.netflix.conductor.model.TaskModel.Status.*;
@@ -73,6 +71,7 @@ public class WorkflowExecutor {
private final MetadataMapperService metadataMapperService;
private final ExecutionDAOFacade executionDAOFacade;
private final ParametersUtils parametersUtils;
+ private final IDGenerator idGenerator;
private final WorkflowStatusListener workflowStatusListener;
private final SystemTaskRegistry systemTaskRegistry;
@@ -104,7 +103,8 @@ public WorkflowExecutor(
ConductorProperties properties,
ExecutionLockService executionLockService,
SystemTaskRegistry systemTaskRegistry,
- ParametersUtils parametersUtils) {
+ ParametersUtils parametersUtils,
+ IDGenerator idGenerator) {
this.deciderService = deciderService;
this.metadataDAO = metadataDAO;
this.queueDAO = queueDAO;
@@ -115,10 +115,13 @@ public WorkflowExecutor(
this.workflowStatusListener = workflowStatusListener;
this.executionLockService = executionLockService;
this.parametersUtils = parametersUtils;
+ this.idGenerator = idGenerator;
this.systemTaskRegistry = systemTaskRegistry;
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -129,7 +132,9 @@ public String startWorkflow(
name, version, correlationId, input, externalInputPayloadStoragePath, null);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -147,7 +152,9 @@ public String startWorkflow(
null);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -166,7 +173,9 @@ public String startWorkflow(
event);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -188,7 +197,9 @@ public String startWorkflow(
null);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -208,7 +219,9 @@ public String startWorkflow(
taskToDomain);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -231,7 +244,9 @@ public String startWorkflow(
taskToDomain);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -253,7 +268,9 @@ public String startWorkflow(
null);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
WorkflowDef workflowDefinition,
Map workflowInput,
@@ -271,7 +288,9 @@ public String startWorkflow(
taskToDomain);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
WorkflowDef workflowDefinition,
Map workflowInput,
@@ -292,7 +311,9 @@ public String startWorkflow(
taskToDomain);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -316,7 +337,9 @@ public String startWorkflow(
taskToDomain);
}
- /** @throws ApplicationException */
+ /**
+ * @throws ApplicationException
+ */
public String startWorkflow(
String name,
Integer version,
@@ -343,7 +366,9 @@ public String startWorkflow(
taskToDomain);
}
- /** @throws ApplicationException if validation fails */
+ /**
+ * @throws ApplicationException if validation fails
+ */
public String startWorkflow(
WorkflowDef workflowDefinition,
Map workflowInput,
@@ -361,7 +386,7 @@ public String startWorkflow(
validateWorkflow(workflowDefinition, workflowInput, externalInputPayloadStoragePath);
// A random UUID is assigned to the work flow instance
- String workflowId = IDGenerator.generate();
+ String workflowId = idGenerator.generate();
// Persist the Workflow
WorkflowModel workflow = new WorkflowModel();
@@ -487,8 +512,7 @@ public void resetCallbacksForWorkflow(String workflowId) {
}
public String rerun(RerunWorkflowRequest request) {
- Preconditions.checkNotNull(
- request.getReRunFromWorkflowId(), "reRunFromWorkflowId is missing");
+ Utils.checkNotNull(request.getReRunFromWorkflowId(), "reRunFromWorkflowId is missing");
if (!rerunWF(
request.getReRunFromWorkflowId(),
request.getReRunFromTaskId(),
@@ -756,7 +780,7 @@ private WorkflowModel findLastFailedSubWorkflowIfAny(
*/
private TaskModel taskToBeRescheduled(WorkflowModel workflow, TaskModel task) {
TaskModel taskToBeRetried = task.copy();
- taskToBeRetried.setTaskId(IDGenerator.generate());
+ taskToBeRetried.setTaskId(idGenerator.generate());
taskToBeRetried.setRetriedTaskId(task.getTaskId());
taskToBeRetried.setStatus(SCHEDULED);
taskToBeRetried.setRetryCount(task.getRetryCount() + 1);
@@ -1160,33 +1184,15 @@ public void updateTask(TaskResult taskResult) {
case IN_PROGRESS:
case SCHEDULED:
try {
- String postponeTaskMessageDesc =
- "Postponing Task message in queue for taskId: " + task.getTaskId();
- String postponeTaskMessageOperation = "postponeTaskMessage";
-
- new RetryUtil<>()
- .retryOnException(
- () -> {
- // postpone based on callbackAfterSeconds
- long callBack = taskResult.getCallbackAfterSeconds();
- queueDAO.postpone(
- taskQueueName,
- task.getTaskId(),
- task.getWorkflowPriority(),
- callBack);
- LOGGER.debug(
- "Task: {} postponed in taskQueue: {} since the task status is {} with callbackAfterSeconds: {}",
- task,
- taskQueueName,
- task.getStatus().name(),
- callBack);
- return null;
- },
- null,
- null,
- 2,
- postponeTaskMessageDesc,
- postponeTaskMessageOperation);
+ long callBack = taskResult.getCallbackAfterSeconds();
+ queueDAO.postpone(
+ taskQueueName, task.getTaskId(), task.getWorkflowPriority(), callBack);
+ LOGGER.debug(
+ "Task: {} postponed in taskQueue: {} since the task status is {} with callbackAfterSeconds: {}",
+ task,
+ taskQueueName,
+ task.getStatus().name(),
+ callBack);
} catch (Exception e) {
// Throw exceptions on queue postpone, this would impact task execution
String errorMsg =
@@ -1205,20 +1211,7 @@ public void updateTask(TaskResult taskResult) {
// Throw an ApplicationException if below operations fail to avoid workflow inconsistencies.
try {
- String updateTaskDesc = "Updating Task with taskId: " + task.getTaskId();
- String updateTaskOperation = "updateTask";
-
- new RetryUtil<>()
- .retryOnException(
- () -> {
- executionDAOFacade.updateTask(task);
- return null;
- },
- null,
- null,
- 2,
- updateTaskDesc,
- updateTaskOperation);
+ executionDAOFacade.updateTask(task);
} catch (Exception e) {
String errorMsg =
String.format(
@@ -1309,10 +1302,11 @@ public boolean decide(String workflowId) {
List tasksToBeScheduled = outcome.tasksToBeScheduled;
setTaskDomains(tasksToBeScheduled, workflow);
List tasksToBeUpdated = outcome.tasksToBeUpdated;
- boolean stateChanged = false;
tasksToBeScheduled = dedupAndAddTasks(workflow, tasksToBeScheduled);
+ boolean stateChanged = scheduleTask(workflow, tasksToBeScheduled); // start
+
for (TaskModel task : outcome.tasksToBeScheduled) {
if (systemTaskRegistry.isSystemTask(task.getTaskType())
&& NON_TERMINAL_TASK.test(task)) {
@@ -1331,12 +1325,9 @@ public boolean decide(String workflowId) {
executionDAOFacade.updateWorkflow(workflow);
}
- stateChanged = scheduleTask(workflow, tasksToBeScheduled) || stateChanged;
-
if (stateChanged) {
decide(workflowId);
}
-
} catch (TerminateWorkflowException twe) {
LOGGER.info("Execution terminated of workflow: {}", workflowId, twe);
terminate(workflow, twe);
@@ -1467,7 +1458,9 @@ List dedupAndAddTasks(WorkflowModel workflow, List tasks)
return dedupedTasks;
}
- /** @throws ApplicationException if the workflow cannot be paused */
+ /**
+ * @throws ApplicationException if the workflow cannot be paused
+ */
public void pauseWorkflow(String workflowId) {
try {
executionLockService.acquireLock(workflowId, 60000);
@@ -1575,7 +1568,7 @@ public void skipTaskFromWorkflow(
// Now create a "SKIPPED" task for this workflow
TaskModel taskToBeSkipped = new TaskModel();
- taskToBeSkipped.setTaskId(IDGenerator.generate());
+ taskToBeSkipped.setTaskId(idGenerator.generate());
taskToBeSkipped.setReferenceTaskName(taskReferenceName);
taskToBeSkipped.setWorkflowInstanceId(workflowId);
taskToBeSkipped.setWorkflowPriority(workflow.getPriority());
@@ -1690,7 +1683,6 @@ private long getTaskDuration(long s, TaskModel task) {
@VisibleForTesting
boolean scheduleTask(WorkflowModel workflow, List tasks) {
- List createdTasks;
List tasksToBeQueued;
boolean startedSystemTasks = false;
@@ -1828,6 +1820,13 @@ private boolean rerunWF(
// Get the workflow
WorkflowModel workflow = executionDAOFacade.getWorkflowModel(workflowId, true);
+ if (!workflow.getStatus().isTerminal()) {
+ String errorMsg =
+ String.format(
+ "Workflow: %s is not in terminal state, unable to rerun.", workflow);
+ LOGGER.error(errorMsg);
+ throw new ApplicationException(CONFLICT, errorMsg);
+ }
updateAndPushParents(workflow, "reran");
// If the task Id is null it implies that the entire workflow has to be rerun
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapper.java
index b2fd2fed1..45b2add89 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapper.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapper.java
@@ -24,6 +24,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.TaskType;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
import com.netflix.conductor.common.metadata.workflow.WorkflowTask;
@@ -32,8 +33,6 @@
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
-import com.google.common.annotations.VisibleForTesting;
-
/**
* An implementation of {@link TaskMapper} to map a {@link WorkflowTask} of type {@link
* TaskType#DECISION} to a List {@link TaskModel} starting with Task of type {@link
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapper.java
index 1691e69df..51609b919 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapper.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapper.java
@@ -12,8 +12,6 @@
*/
package com.netflix.conductor.core.execution.mapper;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Optional;
@@ -26,7 +24,6 @@
import com.netflix.conductor.common.metadata.tasks.TaskType;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
import com.netflix.conductor.common.metadata.workflow.WorkflowTask;
-import com.netflix.conductor.common.utils.TaskUtils;
import com.netflix.conductor.dao.MetadataDAO;
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
@@ -63,7 +60,6 @@ public TaskType getTaskType() {
*/
@Override
public List getMappedTasks(TaskMapperContext taskMapperContext) {
-
LOGGER.debug("TaskMapperContext {} in DoWhileTaskMapper", taskMapperContext);
WorkflowTask workflowTask = taskMapperContext.getWorkflowTask();
@@ -72,11 +68,9 @@ public List getMappedTasks(TaskMapperContext taskMapperContext) {
TaskModel task = workflowModel.getTaskByRefName(workflowTask.getTaskReferenceName());
if (task != null && task.getStatus().isTerminal()) {
// Since loopTask is already completed no need to schedule task again.
- return Collections.emptyList();
+ return List.of();
}
- List tasksToBeScheduled = new ArrayList<>();
- int retryCount = taskMapperContext.getRetryCount();
TaskDef taskDefinition =
Optional.ofNullable(taskMapperContext.getTaskDefinition())
.orElseGet(
@@ -86,28 +80,14 @@ public List getMappedTasks(TaskMapperContext taskMapperContext) {
workflowTask.getName()))
.orElseGet(TaskDef::new));
- TaskModel loopTask = taskMapperContext.createTaskModel();
- loopTask.setTaskType(TaskType.TASK_TYPE_DO_WHILE);
- loopTask.setIteration(1);
- loopTask.setStatus(TaskModel.Status.IN_PROGRESS);
- loopTask.setRateLimitPerFrequency(taskDefinition.getRateLimitPerFrequency());
- loopTask.setRateLimitFrequencyInSeconds(taskDefinition.getRateLimitFrequencyInSeconds());
-
- tasksToBeScheduled.add(loopTask);
- List loopOverTasks = workflowTask.getLoopOver();
- List tasks2 =
- taskMapperContext
- .getDeciderService()
- .getTasksToBeScheduled(workflowModel, loopOverTasks.get(0), retryCount);
- tasks2.forEach(
- t -> {
- t.setReferenceTaskName(
- TaskUtils.appendIteration(
- t.getReferenceTaskName(), loopTask.getIteration()));
- t.setIteration(loopTask.getIteration());
- });
- tasksToBeScheduled.addAll(tasks2);
+ TaskModel doWhileTask = taskMapperContext.createTaskModel();
+ doWhileTask.setTaskType(TaskType.TASK_TYPE_DO_WHILE);
+ doWhileTask.setStatus(TaskModel.Status.IN_PROGRESS);
+ doWhileTask.setStartTime(System.currentTimeMillis());
+ doWhileTask.setRateLimitPerFrequency(taskDefinition.getRateLimitPerFrequency());
+ doWhileTask.setRateLimitFrequencyInSeconds(taskDefinition.getRateLimitFrequencyInSeconds());
+ doWhileTask.setRetryCount(taskMapperContext.getRetryCount());
- return tasksToBeScheduled;
+ return List.of(doWhileTask);
}
}
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapper.java
index 5d92add45..506fbbdc6 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapper.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapper.java
@@ -22,6 +22,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.TaskDef;
import com.netflix.conductor.common.metadata.tasks.TaskType;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
@@ -32,8 +33,6 @@
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
-import com.google.common.annotations.VisibleForTesting;
-
/**
* An implementation of {@link TaskMapper} to map a {@link WorkflowTask} of type {@link
* TaskType#DYNAMIC} to a {@link TaskModel} based on definition derived from the dynamic task name
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java
index 5734dba5e..0a013b3b9 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java
@@ -28,6 +28,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.TaskType;
import com.netflix.conductor.common.metadata.workflow.DynamicForkJoinTaskList;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
@@ -41,7 +42,6 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.annotations.VisibleForTesting;
/**
* An implementation of {@link TaskMapper} to map a {@link WorkflowTask} of type {@link
@@ -54,6 +54,7 @@ public class ForkJoinDynamicTaskMapper implements TaskMapper {
public static final Logger LOGGER = LoggerFactory.getLogger(ForkJoinDynamicTaskMapper.class);
+ private final IDGenerator idGenerator;
private final ParametersUtils parametersUtils;
private final ObjectMapper objectMapper;
private final MetadataDAO metadataDAO;
@@ -62,7 +63,11 @@ public class ForkJoinDynamicTaskMapper implements TaskMapper {
@Autowired
public ForkJoinDynamicTaskMapper(
- ParametersUtils parametersUtils, ObjectMapper objectMapper, MetadataDAO metadataDAO) {
+ IDGenerator idGenerator,
+ ParametersUtils parametersUtils,
+ ObjectMapper objectMapper,
+ MetadataDAO metadataDAO) {
+ this.idGenerator = idGenerator;
this.parametersUtils = parametersUtils;
this.objectMapper = objectMapper;
this.metadataDAO = metadataDAO;
@@ -226,11 +231,8 @@ public List getMappedTasks(TaskMapperContext taskMapperContext)
* This method creates a FORK task and adds the list of dynamic fork tasks keyed by
* "forkedTaskDefs" and their names keyed by "forkedTasks" into {@link TaskModel#getInputData()}
*
- * @param workflowTask A {@link WorkflowTask} representing {@link TaskType#FORK_JOIN_DYNAMIC}
- * @param workflowModel: A instance of the {@link WorkflowModel} which represents the workflow
- * being executed.
- * @param taskId: The string representation of {@link java.util.UUID} which will be set as the
- * taskId.
+ * @param taskMapperContext: The {@link TaskMapperContext} which wraps workflowTask, workflowDef
+ * and workflowModel
* @param dynForkTasks: The list of dynamic forked tasks, the reference names of these tasks
* will be added to the forkDynamicTask
* @return A new instance of {@link TaskModel} representing a {@link TaskType#TASK_TYPE_FORK}
@@ -284,7 +286,7 @@ TaskModel createJoinTask(
joinTask.setScheduledTime(System.currentTimeMillis());
joinTask.setStartTime(System.currentTimeMillis());
joinTask.setInputData(joinInput);
- joinTask.setTaskId(IDGenerator.generate());
+ joinTask.setTaskId(idGenerator.generate());
joinTask.setStatus(TaskModel.Status.IN_PROGRESS);
joinTask.setWorkflowTask(joinWorkflowTask);
joinTask.setWorkflowPriority(workflowModel.getPriority());
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapper.java
index 64a77df1d..167cd3aef 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapper.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapper.java
@@ -18,6 +18,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.TaskType;
import com.netflix.conductor.common.metadata.workflow.SubWorkflowParams;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
@@ -28,8 +29,6 @@
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
-import com.google.common.annotations.VisibleForTesting;
-
import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_SUB_WORKFLOW;
@Component
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/DoWhile.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/DoWhile.java
index 58366fdcf..af9bedc76 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/DoWhile.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/DoWhile.java
@@ -21,6 +21,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.TaskDef;
import com.netflix.conductor.common.utils.TaskUtils;
import com.netflix.conductor.core.events.ScriptEvaluator;
@@ -30,8 +31,6 @@
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
-import com.google.common.annotations.VisibleForTesting;
-
import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_DO_WHILE;
@Component(TASK_TYPE_DO_WHILE)
@@ -53,38 +52,49 @@ public void cancel(WorkflowModel workflow, TaskModel task, WorkflowExecutor exec
@Override
public boolean execute(
- WorkflowModel workflow, TaskModel task, WorkflowExecutor workflowExecutor) {
+ WorkflowModel workflow, TaskModel doWhileTaskModel, WorkflowExecutor workflowExecutor) {
boolean allDone = true;
boolean hasFailures = false;
StringBuilder failureReason = new StringBuilder();
Map output = new HashMap<>();
- task.getOutputData().put("iteration", task.getIteration());
/*
* Get the latest set of tasks (the ones that have the highest retry count). We don't want to evaluate any tasks
* that have already failed if there is a more current one (a later retry count).
*/
Map relevantTasks = new LinkedHashMap<>();
- TaskModel relevantTask = null;
+ TaskModel relevantTask;
for (TaskModel t : workflow.getTasks()) {
- if (task.getWorkflowTask()
+ if (doWhileTaskModel
+ .getWorkflowTask()
.has(TaskUtils.removeIterationFromTaskRefName(t.getReferenceTaskName()))
- && !task.getReferenceTaskName().equals(t.getReferenceTaskName())
- && task.getIteration() == t.getIteration()) {
+ && !doWhileTaskModel.getReferenceTaskName().equals(t.getReferenceTaskName())
+ && doWhileTaskModel.getIteration() == t.getIteration()) {
relevantTask = relevantTasks.get(t.getReferenceTaskName());
if (relevantTask == null || t.getRetryCount() > relevantTask.getRetryCount()) {
relevantTasks.put(t.getReferenceTaskName(), t);
}
}
}
- Collection loopOver = relevantTasks.values();
+ Collection loopOverTasks = relevantTasks.values();
LOGGER.debug(
"Workflow {} waiting for tasks {} to complete iteration {}",
workflow.getWorkflowId(),
- loopOver.stream().map(TaskModel::getReferenceTaskName).collect(Collectors.toList()),
- task.getIteration());
- for (TaskModel loopOverTask : loopOver) {
+ loopOverTasks.stream()
+ .map(TaskModel::getReferenceTaskName)
+ .collect(Collectors.toList()),
+ doWhileTaskModel.getIteration());
+
+ // if the loopOver collection is empty, no tasks inside the loop have been scheduled.
+ // so schedule it and exit the method.
+ if (loopOverTasks.isEmpty()) {
+ doWhileTaskModel.setIteration(1);
+ doWhileTaskModel.addOutput("iteration", doWhileTaskModel.getIteration());
+ return scheduleNextIteration(doWhileTaskModel, workflow, workflowExecutor);
+ }
+
+ for (TaskModel loopOverTask : loopOverTasks) {
TaskModel.Status taskStatus = loopOverTask.getStatus();
hasFailures = !taskStatus.isSuccessful();
if (hasFailures) {
@@ -98,43 +108,53 @@ public boolean execute(
break;
}
}
- task.getOutputData().put(String.valueOf(task.getIteration()), output);
+ doWhileTaskModel
+ .getOutputData()
+ .put(String.valueOf(doWhileTaskModel.getIteration()), output);
if (hasFailures) {
LOGGER.debug(
- "taskid {} failed in {} iteration", task.getTaskId(), task.getIteration() + 1);
- return updateLoopTask(task, TaskModel.Status.FAILED, failureReason.toString());
+ "Task {} failed in {} iteration",
+ doWhileTaskModel.getTaskId(),
+ doWhileTaskModel.getIteration() + 1);
+ return updateLoopTask(
+ doWhileTaskModel, TaskModel.Status.FAILED, failureReason.toString());
} else if (!allDone) {
return false;
}
boolean shouldContinue;
try {
- shouldContinue = getEvaluatedCondition(workflow, task, workflowExecutor);
- LOGGER.debug("taskid {} condition evaluated to {}", task.getTaskId(), shouldContinue);
+ shouldContinue = getEvaluatedCondition(workflow, doWhileTaskModel, workflowExecutor);
+ LOGGER.debug(
+ "Task {} condition evaluated to {}",
+ doWhileTaskModel.getTaskId(),
+ shouldContinue);
if (shouldContinue) {
- task.setIteration(task.getIteration() + 1);
- return scheduleNextIteration(task, workflow, workflowExecutor);
+ doWhileTaskModel.setIteration(doWhileTaskModel.getIteration() + 1);
+ doWhileTaskModel.getOutputData().put("iteration", doWhileTaskModel.getIteration());
+ return scheduleNextIteration(doWhileTaskModel, workflow, workflowExecutor);
} else {
LOGGER.debug(
- "taskid {} took {} iterations to complete",
- task.getTaskId(),
- task.getIteration() + 1);
- return markLoopTaskSuccess(task);
+ "Task {} took {} iterations to complete",
+ doWhileTaskModel.getTaskId(),
+ doWhileTaskModel.getIteration() + 1);
+ return markLoopTaskSuccess(doWhileTaskModel);
}
} catch (ScriptException e) {
String message =
String.format(
"Unable to evaluate condition %s , exception %s",
- task.getWorkflowTask().getLoopCondition(), e.getMessage());
+ doWhileTaskModel.getWorkflowTask().getLoopCondition(), e.getMessage());
LOGGER.error(message);
- LOGGER.error("Marking task {} failed with error.", task.getTaskId());
- return updateLoopTask(task, TaskModel.Status.FAILED_WITH_TERMINAL_ERROR, message);
+ LOGGER.error("Marking task {} failed with error.", doWhileTaskModel.getTaskId());
+ return updateLoopTask(
+ doWhileTaskModel, TaskModel.Status.FAILED_WITH_TERMINAL_ERROR, message);
}
}
boolean scheduleNextIteration(
TaskModel task, WorkflowModel workflow, WorkflowExecutor workflowExecutor) {
LOGGER.debug(
- "Scheduling loop tasks for taskid {} as condition {} evaluated to true",
+ "Scheduling loop tasks for task {} as condition {} evaluated to true",
task.getTaskId(),
task.getWorkflowTask().getLoopCondition());
workflowExecutor.scheduleNextIteration(task, workflow);
@@ -150,7 +170,7 @@ boolean updateLoopTask(TaskModel task, TaskModel.Status status, String failureRe
boolean markLoopTaskSuccess(TaskModel task) {
LOGGER.debug(
- "taskid {} took {} iterations to complete",
+ "task {} took {} iterations to complete",
task.getTaskId(),
task.getIteration() + 1);
task.setStatus(TaskModel.Status.COMPLETED);
@@ -198,7 +218,7 @@ boolean getEvaluatedCondition(
boolean shouldContinue = false;
if (condition != null) {
LOGGER.debug("Condition: {} is being evaluated", condition);
- // Evaluate the expression by using the Nashhorn based script evaluator
+ // Evaluate the expression by using the Nashorn based script evaluator
shouldContinue = ScriptEvaluator.evalBool(condition, taskInput);
}
return shouldContinue;
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/Event.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/Event.java
index 0dec908c8..5e9a9aef4 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/Event.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/Event.java
@@ -20,6 +20,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.core.events.EventQueues;
import com.netflix.conductor.core.events.queue.Message;
import com.netflix.conductor.core.events.queue.ObservableQueue;
@@ -31,7 +32,6 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.annotations.VisibleForTesting;
import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_EVENT;
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/ExecutionConfig.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/ExecutionConfig.java
index 890a33ebf..7115dfd1d 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/ExecutionConfig.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/ExecutionConfig.java
@@ -15,9 +15,9 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import com.netflix.conductor.core.utils.SemaphoreUtil;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.netflix.conductor.core.utils.SemaphoreUtil;
class ExecutionConfig {
@@ -29,7 +29,7 @@ class ExecutionConfig {
this.executorService =
Executors.newFixedThreadPool(
threadCount,
- new ThreadFactoryBuilder().setNameFormat(threadNameFormat).build());
+ new BasicThreadFactory.Builder().namingPattern(threadNameFormat).build());
this.semaphoreUtil = new SemaphoreUtil(threadCount);
}
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/IsolatedTaskQueueProducer.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/IsolatedTaskQueueProducer.java
index e357a80e2..5a5ac33a8 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/IsolatedTaskQueueProducer.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/IsolatedTaskQueueProducer.java
@@ -29,12 +29,11 @@
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.TaskDef;
import com.netflix.conductor.core.utils.QueueUtils;
import com.netflix.conductor.service.MetadataService;
-import com.google.common.annotations.VisibleForTesting;
-
import static com.netflix.conductor.core.execution.tasks.SystemTaskRegistry.ASYNC_SYSTEM_TASKS_QUALIFIER;
@Component
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorker.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorker.java
index 04ac69d55..29bf6bb2a 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorker.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorker.java
@@ -25,6 +25,7 @@
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.core.LifecycleAwareComponent;
import com.netflix.conductor.core.config.ConductorProperties;
import com.netflix.conductor.core.execution.AsyncSystemTaskExecutor;
@@ -34,8 +35,6 @@
import com.netflix.conductor.metrics.Monitors;
import com.netflix.conductor.service.ExecutionService;
-import com.google.common.annotations.VisibleForTesting;
-
/** The worker that polls and executes an async system task. */
@Component
@ConditionalOnProperty(
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorkerCoordinator.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorkerCoordinator.java
index 6992727a1..b1a9ed988 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorkerCoordinator.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorkerCoordinator.java
@@ -23,11 +23,10 @@
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.core.config.ConductorProperties;
import com.netflix.conductor.core.utils.QueueUtils;
-import com.google.common.annotations.VisibleForTesting;
-
import static com.netflix.conductor.core.execution.tasks.SystemTaskRegistry.ASYNC_SYSTEM_TASKS_QUALIFIER;
@Component
diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/WorkflowSystemTask.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/WorkflowSystemTask.java
index b23b77c6e..e8db7c6d8 100644
--- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/WorkflowSystemTask.java
+++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/WorkflowSystemTask.java
@@ -65,7 +65,9 @@ public boolean execute(
*/
public void cancel(WorkflowModel workflow, TaskModel task, WorkflowExecutor workflowExecutor) {}
- /** @return True if the task is supposed to be started asynchronously using internal queues. */
+ /**
+ * @return True if the task is supposed to be started asynchronously using internal queues.
+ */
public boolean isAsync() {
return false;
}
@@ -86,7 +88,9 @@ public boolean isAsyncComplete(TaskModel task) {
}
}
- /** @return name of the system task */
+ /**
+ * @return name of the system task
+ */
public String getTaskType() {
return taskType;
}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAO.java b/core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAO.java
similarity index 98%
rename from contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAO.java
rename to core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAO.java
index 4b5f22c6b..4a7f427cb 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAO.java
+++ b/core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAO.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.dao.index;
+package com.netflix.conductor.core.index;
import java.util.Collections;
import java.util.List;
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAOConfiguration.java b/core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAOConfiguration.java
similarity index 95%
rename from contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAOConfiguration.java
rename to core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAOConfiguration.java
index b9feec8de..0e9e2466b 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAOConfiguration.java
+++ b/core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAOConfiguration.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.dao.index;
+package com.netflix.conductor.core.index;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
diff --git a/core/src/main/java/com/netflix/conductor/core/metadata/MetadataMapperService.java b/core/src/main/java/com/netflix/conductor/core/metadata/MetadataMapperService.java
index bd761c3b2..b5d3fd400 100644
--- a/core/src/main/java/com/netflix/conductor/core/metadata/MetadataMapperService.java
+++ b/core/src/main/java/com/netflix/conductor/core/metadata/MetadataMapperService.java
@@ -21,6 +21,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.metadata.tasks.TaskType;
import com.netflix.conductor.common.metadata.workflow.SubWorkflowParams;
import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
@@ -28,14 +29,12 @@
import com.netflix.conductor.core.WorkflowContext;
import com.netflix.conductor.core.exception.ApplicationException;
import com.netflix.conductor.core.exception.TerminateWorkflowException;
+import com.netflix.conductor.core.utils.Utils;
import com.netflix.conductor.dao.MetadataDAO;
import com.netflix.conductor.metrics.Monitors;
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-
/**
* Populates metadata definitions within workflow objects. Benefits of loading and populating
* metadata definitions upfront could be:
@@ -79,7 +78,7 @@ public WorkflowDef lookupForWorkflowDefinition(String name, Integer version) {
@VisibleForTesting
Optional lookupWorkflowDefinition(String workflowName, int workflowVersion) {
- Preconditions.checkArgument(
+ Utils.checkArgument(
StringUtils.isNotBlank(workflowName),
"Workflow name must be specified when searching for a definition");
return metadataDAO.getWorkflowDef(workflowName, workflowVersion);
@@ -87,14 +86,14 @@ Optional lookupWorkflowDefinition(String workflowName, int workflow
@VisibleForTesting
Optional lookupLatestWorkflowDefinition(String workflowName) {
- Preconditions.checkArgument(
+ Utils.checkArgument(
StringUtils.isNotBlank(workflowName),
"Workflow name must be specified when searching for a definition");
return metadataDAO.getLatestWorkflowDef(workflowName);
}
public WorkflowModel populateWorkflowWithDefinitions(WorkflowModel workflow) {
- Preconditions.checkNotNull(workflow, "workflow cannot be null");
+ Utils.checkNotNull(workflow, "workflow cannot be null");
WorkflowDef workflowDefinition =
Optional.ofNullable(workflow.getWorkflowDefinition())
.orElseGet(
@@ -114,14 +113,14 @@ public WorkflowModel populateWorkflowWithDefinitions(WorkflowModel workflow) {
}
public WorkflowDef populateTaskDefinitions(WorkflowDef workflowDefinition) {
- Preconditions.checkNotNull(workflowDefinition, "workflowDefinition cannot be null");
+ Utils.checkNotNull(workflowDefinition, "workflowDefinition cannot be null");
workflowDefinition.collectTasks().forEach(this::populateWorkflowTaskWithDefinition);
checkNotEmptyDefinitions(workflowDefinition);
return workflowDefinition;
}
private void populateWorkflowTaskWithDefinition(WorkflowTask workflowTask) {
- Preconditions.checkNotNull(workflowTask, "WorkflowTask cannot be null");
+ Utils.checkNotNull(workflowTask, "WorkflowTask cannot be null");
if (shouldPopulateTaskDefinition(workflowTask)) {
workflowTask.setTaskDefinition(metadataDAO.getTaskDef(workflowTask.getName()));
}
@@ -131,7 +130,7 @@ private void populateWorkflowTaskWithDefinition(WorkflowTask workflowTask) {
}
private void populateVersionForSubWorkflow(WorkflowTask workflowTask) {
- Preconditions.checkNotNull(workflowTask, "WorkflowTask cannot be null");
+ Utils.checkNotNull(workflowTask, "WorkflowTask cannot be null");
SubWorkflowParams subworkflowParams = workflowTask.getSubWorkflowParam();
if (subworkflowParams.getVersion() == null) {
String subWorkflowName = subworkflowParams.getName();
@@ -153,7 +152,7 @@ private void populateVersionForSubWorkflow(WorkflowTask workflowTask) {
}
private void checkNotEmptyDefinitions(WorkflowDef workflowDefinition) {
- Preconditions.checkNotNull(workflowDefinition, "WorkflowDefinition cannot be null");
+ Utils.checkNotNull(workflowDefinition, "WorkflowDefinition cannot be null");
// Obtain the names of the tasks with missing definitions
Set missingTaskDefinitionNames =
@@ -179,15 +178,15 @@ private void checkNotEmptyDefinitions(WorkflowDef workflowDefinition) {
}
public TaskModel populateTaskWithDefinition(TaskModel task) {
- Preconditions.checkNotNull(task, "Task cannot be null");
+ Utils.checkNotNull(task, "Task cannot be null");
populateWorkflowTaskWithDefinition(task.getWorkflowTask());
return task;
}
@VisibleForTesting
boolean shouldPopulateTaskDefinition(WorkflowTask workflowTask) {
- Preconditions.checkNotNull(workflowTask, "WorkflowTask cannot be null");
- Preconditions.checkNotNull(workflowTask.getType(), "WorkflowTask type cannot be null");
+ Utils.checkNotNull(workflowTask, "WorkflowTask cannot be null");
+ Utils.checkNotNull(workflowTask.getType(), "WorkflowTask type cannot be null");
return workflowTask.getTaskDefinition() == null
&& StringUtils.isNotBlank(workflowTask.getName());
}
diff --git a/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowRepairService.java b/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowRepairService.java
index 5ac05e24f..769fe8ddb 100644
--- a/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowRepairService.java
+++ b/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowRepairService.java
@@ -21,6 +21,7 @@
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.core.config.ConductorProperties;
import com.netflix.conductor.core.execution.tasks.SystemTaskRegistry;
import com.netflix.conductor.core.execution.tasks.WorkflowSystemTask;
@@ -32,8 +33,6 @@
import com.netflix.conductor.model.TaskModel;
import com.netflix.conductor.model.WorkflowModel;
-import com.google.common.annotations.VisibleForTesting;
-
/**
* A helper service that tries to keep ExecutionDAO and QueueDAO in sync, based on the task or
* workflow state.
diff --git a/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowSweeper.java b/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowSweeper.java
index e21894da1..2d3c1eaa5 100644
--- a/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowSweeper.java
+++ b/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowSweeper.java
@@ -76,11 +76,7 @@ public void sweep(String workflowId) {
boolean done = workflowExecutor.decide(workflowId);
if (done) {
queueDAO.remove(DECIDER_QUEUE, workflowId);
- } else {
- queueDAO.setUnackTimeout(
- DECIDER_QUEUE,
- workflowId,
- properties.getWorkflowOffsetTimeout().toMillis());
+ return;
}
} catch (ApplicationException e) {
if (e.getCode() == ApplicationException.Code.NOT_FOUND) {
@@ -89,12 +85,13 @@ public void sweep(String workflowId) {
"Workflow NOT found for id:{}. Removed it from decider queue",
workflowId,
e);
+ return;
}
} catch (Exception e) {
- queueDAO.setUnackTimeout(
- DECIDER_QUEUE, workflowId, properties.getWorkflowOffsetTimeout().toMillis());
Monitors.error(CLASS_NAME, "sweep");
LOGGER.error("Error running sweep for " + workflowId, e);
}
+ queueDAO.setUnackTimeout(
+ DECIDER_QUEUE, workflowId, properties.getWorkflowOffsetTimeout().toMillis());
}
}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLock.java b/core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLock.java
similarity index 87%
rename from contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLock.java
rename to core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLock.java
index 36cb86ecc..ec5f6eec0 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLock.java
+++ b/core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLock.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.lock;
+package com.netflix.conductor.core.sync.local;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
@@ -23,12 +23,12 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.core.sync.Lock;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
+import com.github.benmanes.caffeine.cache.CacheLoader;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.LoadingCache;
public class LocalOnlyLock implements Lock {
@@ -44,7 +44,7 @@ public Semaphore load(String key) {
private static final ConcurrentHashMap> SCHEDULEDFUTURES =
new ConcurrentHashMap<>();
private static final LoadingCache LOCKIDTOSEMAPHOREMAP =
- CacheBuilder.newBuilder().build(LOADER);
+ Caffeine.newBuilder().build(LOADER);
private static final ThreadGroup THREAD_GROUP = new ThreadGroup("LocalOnlyLock-scheduler");
private static final ThreadFactory THREAD_FACTORY =
runnable -> new Thread(THREAD_GROUP, runnable);
@@ -54,14 +54,14 @@ public Semaphore load(String key) {
@Override
public void acquireLock(String lockId) {
LOGGER.trace("Locking {}", lockId);
- LOCKIDTOSEMAPHOREMAP.getUnchecked(lockId).acquireUninterruptibly();
+ LOCKIDTOSEMAPHOREMAP.get(lockId).acquireUninterruptibly();
}
@Override
public boolean acquireLock(String lockId, long timeToTry, TimeUnit unit) {
try {
LOGGER.trace("Locking {} with timeout {} {}", lockId, timeToTry, unit);
- return LOCKIDTOSEMAPHOREMAP.getUnchecked(lockId).tryAcquire(timeToTry, unit);
+ return LOCKIDTOSEMAPHOREMAP.get(lockId).tryAcquire(timeToTry, unit);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException(e);
@@ -100,9 +100,9 @@ public void releaseLock(String lockId) {
// The check is here to prevent semaphore getting above 1
// e.g. in case when lease runs out but release is also called
synchronized (LOCKIDTOSEMAPHOREMAP) {
- if (LOCKIDTOSEMAPHOREMAP.getUnchecked(lockId).availablePermits() == 0) {
+ if (LOCKIDTOSEMAPHOREMAP.get(lockId).availablePermits() == 0) {
LOGGER.trace("Releasing {}", lockId);
- LOCKIDTOSEMAPHOREMAP.getUnchecked(lockId).release();
+ LOCKIDTOSEMAPHOREMAP.get(lockId).release();
removeLeaseExpirationJob(lockId);
}
}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLockConfiguration.java b/core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLockConfiguration.java
similarity index 95%
rename from contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLockConfiguration.java
rename to core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLockConfiguration.java
index 431dc0de5..41a025406 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLockConfiguration.java
+++ b/core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLockConfiguration.java
@@ -10,7 +10,7 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.lock;
+package com.netflix.conductor.core.sync.local;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
diff --git a/core/src/main/java/com/netflix/conductor/core/sync/NoopLock.java b/core/src/main/java/com/netflix/conductor/core/sync/noop/NoopLock.java
similarity index 92%
rename from core/src/main/java/com/netflix/conductor/core/sync/NoopLock.java
rename to core/src/main/java/com/netflix/conductor/core/sync/noop/NoopLock.java
index 912a23c42..5d492da1e 100644
--- a/core/src/main/java/com/netflix/conductor/core/sync/NoopLock.java
+++ b/core/src/main/java/com/netflix/conductor/core/sync/noop/NoopLock.java
@@ -10,10 +10,12 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.core.sync;
+package com.netflix.conductor.core.sync.noop;
import java.util.concurrent.TimeUnit;
+import com.netflix.conductor.core.sync.Lock;
+
public class NoopLock implements Lock {
@Override
diff --git a/core/src/main/java/com/netflix/conductor/core/utils/ExternalPayloadStorageUtils.java b/core/src/main/java/com/netflix/conductor/core/utils/ExternalPayloadStorageUtils.java
index 1c1227912..eb6e86265 100644
--- a/core/src/main/java/com/netflix/conductor/core/utils/ExternalPayloadStorageUtils.java
+++ b/core/src/main/java/com/netflix/conductor/core/utils/ExternalPayloadStorageUtils.java
@@ -25,6 +25,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
+import com.netflix.conductor.annotations.VisibleForTesting;
import com.netflix.conductor.common.run.ExternalStorageLocation;
import com.netflix.conductor.common.utils.ExternalPayloadStorage;
import com.netflix.conductor.common.utils.ExternalPayloadStorage.PayloadType;
@@ -36,7 +37,6 @@
import com.netflix.conductor.model.WorkflowModel;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.annotations.VisibleForTesting;
/** Provides utility functions to upload and download payloads to {@link ExternalPayloadStorage} */
@Component
diff --git a/core/src/main/java/com/netflix/conductor/core/utils/IDGenerator.java b/core/src/main/java/com/netflix/conductor/core/utils/IDGenerator.java
index bc09f1011..813d63aa9 100644
--- a/core/src/main/java/com/netflix/conductor/core/utils/IDGenerator.java
+++ b/core/src/main/java/com/netflix/conductor/core/utils/IDGenerator.java
@@ -14,9 +14,27 @@
import java.util.UUID;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConditionalOnProperty(
+ name = "conductor.id.generator",
+ havingValue = "default",
+ matchIfMissing = true)
+/**
+ * ID Generator used by Conductor Note on overriding the ID Generator: The default ID generator uses
+ * UUID v4 as the ID format. By overriding this class it is possible to use different scheme for ID
+ * generation. However, this is not normal and should only be done after very careful consideration.
+ *
+ * Please note, if you use Cassandra persistence, the schema uses UUID as the column type and the
+ * IDs have to be valid UUIDs supported by Cassandra.
+ */
public class IDGenerator {
- public static String generate() {
+ public IDGenerator() {}
+
+ public String generate() {
return UUID.randomUUID().toString();
}
}
diff --git a/core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java b/core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java
index b7397807d..e76344ff8 100644
--- a/core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java
+++ b/core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java
@@ -34,7 +34,6 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.Preconditions;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
@@ -125,6 +124,7 @@ public Map getTaskInputV2(
"reasonForIncompletion", task.getReasonForIncompletion());
taskParams.put("callbackAfterSeconds", task.getCallbackAfterSeconds());
taskParams.put("workerId", task.getWorkerId());
+ taskParams.put("iteration", task.getIteration());
inputMap.put(
task.isLoopOverTask()
? TaskUtils.removeIterationFromTaskRefName(
@@ -286,7 +286,7 @@ private Map getTaskInputV1(
(paramName, value) -> {
String paramPath = "" + value;
String[] paramPathComponents = paramPath.split("\\.");
- Preconditions.checkArgument(
+ Utils.checkArgument(
paramPathComponents.length == 3,
"Invalid input expression for "
+ paramName
diff --git a/core/src/main/java/com/netflix/conductor/core/utils/QueueUtils.java b/core/src/main/java/com/netflix/conductor/core/utils/QueueUtils.java
index b381ec468..bca477390 100644
--- a/core/src/main/java/com/netflix/conductor/core/utils/QueueUtils.java
+++ b/core/src/main/java/com/netflix/conductor/core/utils/QueueUtils.java
@@ -40,14 +40,13 @@ public static String getQueueName(Task task) {
}
/**
- * @param taskType
- * @param domain
- * @param isolationGroup
- * @param executionNameSpace
- * @return //domain:taskType@eexecutionNameSpace-isolationGroup
+ * Creates a queue name string using taskType
, domain
,
+ * isolationGroupId
and executionNamespace
.
+ *
+ * @return domain:taskType@eexecutionNameSpace-isolationGroupId.
*/
public static String getQueueName(
- String taskType, String domain, String isolationGroup, String executionNameSpace) {
+ String taskType, String domain, String isolationGroupId, String executionNamespace) {
String queueName;
if (domain == null) {
@@ -56,12 +55,12 @@ public static String getQueueName(
queueName = domain + DOMAIN_SEPARATOR + taskType;
}
- if (executionNameSpace != null) {
- queueName = queueName + EXECUTION_NAME_SPACE_SEPARATOR + executionNameSpace;
+ if (executionNamespace != null) {
+ queueName = queueName + EXECUTION_NAME_SPACE_SEPARATOR + executionNamespace;
}
- if (isolationGroup != null) {
- queueName = queueName + ISOLATION_SEPARATOR + isolationGroup;
+ if (isolationGroupId != null) {
+ queueName = queueName + ISOLATION_SEPARATOR + isolationGroupId;
}
return queueName;
}
diff --git a/core/src/main/java/com/netflix/conductor/core/utils/Utils.java b/core/src/main/java/com/netflix/conductor/core/utils/Utils.java
index 013f7dc95..537d1137a 100644
--- a/core/src/main/java/com/netflix/conductor/core/utils/Utils.java
+++ b/core/src/main/java/com/netflix/conductor/core/utils/Utils.java
@@ -14,18 +14,12 @@
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import org.apache.commons.lang3.StringUtils;
import com.netflix.conductor.core.exception.ApplicationException;
-import com.google.common.base.Preconditions;
-
public class Utils {
public static final String DECIDER_QUEUE = "_deciderQueue";
@@ -66,7 +60,7 @@ public static List convertStringToList(String inputStr) {
*/
public static void checkArgument(boolean condition, String errorMessage) {
if (!condition) {
- throw new ApplicationException(ApplicationException.Code.INVALID_INPUT, errorMessage);
+ throw new IllegalArgumentException(errorMessage);
}
}
@@ -104,9 +98,7 @@ public static void checkNotNullOrEmpty(Map, ?> map, String errorMessage) {
* @throws ApplicationException if input string is not valid
*/
public static void checkNotNullOrEmpty(String input, String errorMessage) {
- try {
- Preconditions.checkArgument(StringUtils.isNotBlank(input), errorMessage);
- } catch (IllegalArgumentException exception) {
+ if (StringUtils.isEmpty(input)) {
throw new ApplicationException(ApplicationException.Code.INVALID_INPUT, errorMessage);
}
}
@@ -119,10 +111,26 @@ public static void checkNotNullOrEmpty(String input, String errorMessage) {
* @throws ApplicationException if input object is not valid
*/
public static void checkNotNull(Object object, String errorMessage) {
- try {
- Preconditions.checkNotNull(object, errorMessage);
- } catch (NullPointerException exception) {
- throw new ApplicationException(ApplicationException.Code.INVALID_INPUT, errorMessage);
+ if (object == null) {
+ throw new NullPointerException(errorMessage);
+ }
+ }
+
+ /**
+ * Used to determine if the exception is thrown due to a transient failure and the operation is
+ * expected to succeed upon retrying.
+ *
+ * @param throwable the exception that is thrown
+ * @return true - if the exception is a transient failure
+ * false - if the exception is non-transient
+ */
+ public static boolean isTransientException(Throwable throwable) {
+ if (throwable != null) {
+ return !((throwable instanceof UnsupportedOperationException)
+ || (throwable instanceof ApplicationException
+ && ((ApplicationException) throwable).getCode()
+ != ApplicationException.Code.BACKEND_ERROR));
}
+ return true;
}
}
diff --git a/core/src/main/java/com/netflix/conductor/dao/EventHandlerDAO.java b/core/src/main/java/com/netflix/conductor/dao/EventHandlerDAO.java
index fa32024db..6c9dc47a9 100644
--- a/core/src/main/java/com/netflix/conductor/dao/EventHandlerDAO.java
+++ b/core/src/main/java/com/netflix/conductor/dao/EventHandlerDAO.java
@@ -26,13 +26,19 @@ public interface EventHandlerDAO {
*/
void addEventHandler(EventHandler eventHandler);
- /** @param eventHandler Event handler to be updated. */
+ /**
+ * @param eventHandler Event handler to be updated.
+ */
void updateEventHandler(EventHandler eventHandler);
- /** @param name Removes the event handler from the system */
+ /**
+ * @param name Removes the event handler from the system
+ */
void removeEventHandler(String name);
- /** @return All the event handlers registered in the system */
+ /**
+ * @return All the event handlers registered in the system
+ */
List getAllEventHandlers();
/**
diff --git a/core/src/main/java/com/netflix/conductor/dao/ExecutionDAO.java b/core/src/main/java/com/netflix/conductor/dao/ExecutionDAO.java
index 967551e6b..8e33cac29 100644
--- a/core/src/main/java/com/netflix/conductor/dao/ExecutionDAO.java
+++ b/core/src/main/java/com/netflix/conductor/dao/ExecutionDAO.java
@@ -47,7 +47,9 @@ public interface ExecutionDAO {
*/
List createTasks(List tasks);
- /** @param task Task to be updated */
+ /**
+ * @param task Task to be updated
+ */
void updateTask(TaskModel task);
/**
@@ -202,9 +204,13 @@ List getWorkflowsByCorrelationId(
*/
boolean addEventExecution(EventExecution eventExecution);
- /** @param eventExecution Event execution to be updated */
+ /**
+ * @param eventExecution Event execution to be updated
+ */
void updateEventExecution(EventExecution eventExecution);
- /** @param eventExecution Event execution to be removed */
+ /**
+ * @param eventExecution Event execution to be removed
+ */
void removeEventExecution(EventExecution eventExecution);
}
diff --git a/core/src/main/java/com/netflix/conductor/dao/IndexDAO.java b/core/src/main/java/com/netflix/conductor/dao/IndexDAO.java
index 876f0d8dc..490758d15 100644
--- a/core/src/main/java/com/netflix/conductor/dao/IndexDAO.java
+++ b/core/src/main/java/com/netflix/conductor/dao/IndexDAO.java
@@ -43,7 +43,9 @@ public interface IndexDAO {
*/
CompletableFuture asyncIndexWorkflow(WorkflowSummary workflow);
- /** @param task Task to be indexed */
+ /**
+ * @param task Task to be indexed
+ */
void indexTask(TaskSummary task);
/**
@@ -118,7 +120,9 @@ CompletableFuture asyncUpdateWorkflow(
*/
String get(String workflowInstanceId, String key);
- /** @param logs Task Execution logs to be indexed */
+ /**
+ * @param logs Task Execution logs to be indexed
+ */
void addTaskExecutionLogs(List logs);
/**
@@ -133,7 +137,9 @@ CompletableFuture asyncUpdateWorkflow(
*/
List getTaskExecutionLogs(String taskId);
- /** @param eventExecution Event Execution to be indexed */
+ /**
+ * @param eventExecution Event Execution to be indexed
+ */
void addEventExecution(EventExecution eventExecution);
List getEventExecutions(String event);
diff --git a/core/src/main/java/com/netflix/conductor/dao/MetadataDAO.java b/core/src/main/java/com/netflix/conductor/dao/MetadataDAO.java
index e6e203c6d..1d6bb7020 100644
--- a/core/src/main/java/com/netflix/conductor/dao/MetadataDAO.java
+++ b/core/src/main/java/com/netflix/conductor/dao/MetadataDAO.java
@@ -21,7 +21,9 @@
/** Data access layer for the workflow metadata - task definitions and workflow definitions */
public interface MetadataDAO {
- /** @param taskDef task definition to be created */
+ /**
+ * @param taskDef task definition to be created
+ */
void createTaskDef(TaskDef taskDef);
/**
@@ -36,16 +38,24 @@ public interface MetadataDAO {
*/
TaskDef getTaskDef(String name);
- /** @return All the task definitions */
+ /**
+ * @return All the task definitions
+ */
List getAllTaskDefs();
- /** @param name Name of the task */
+ /**
+ * @param name Name of the task
+ */
void removeTaskDef(String name);
- /** @param def workflow definition */
+ /**
+ * @param def workflow definition
+ */
void createWorkflowDef(WorkflowDef def);
- /** @param def workflow definition */
+ /**
+ * @param def workflow definition
+ */
void updateWorkflowDef(WorkflowDef def);
/**
@@ -67,6 +77,8 @@ public interface MetadataDAO {
*/
void removeWorkflowDef(String name, Integer version);
- /** @return List of all the workflow definitions */
+ /**
+ * @return List of all the workflow definitions
+ */
List getAllWorkflowDefs();
}
diff --git a/core/src/main/java/com/netflix/conductor/dao/QueueDAO.java b/core/src/main/java/com/netflix/conductor/dao/QueueDAO.java
index d14c7cfb4..70b5857c5 100644
--- a/core/src/main/java/com/netflix/conductor/dao/QueueDAO.java
+++ b/core/src/main/java/com/netflix/conductor/dao/QueueDAO.java
@@ -110,13 +110,19 @@ public interface QueueDAO {
*/
boolean setUnackTimeout(String queueName, String messageId, long unackTimeout);
- /** @param queueName Name of the queue */
+ /**
+ * @param queueName Name of the queue
+ */
void flush(String queueName);
- /** @return key : queue name, value: size of the queue */
+ /**
+ * @return key : queue name, value: size of the queue
+ */
Map queuesDetail();
- /** @return key : queue name, value: map of shard name to size and unack queue size */
+ /**
+ * @return key : queue name, value: map of shard name to size and unack queue size
+ */
Map