diff --git a/CHANGELOG.md b/CHANGELOG.md index ca6b0d21..c89bd94c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## placeholder +* Add User-Agent Header to gRPC Metadata ([#213](https://github.com/microsoft/durabletask-java/pull/213)) +## v1.5.0-preview.1 * Update protobuf definitions to include new properties in OrchestratorRequest and update source commit hash ([#214](https://github.com/microsoft/durabletask-java/pull/214)) -## v1.5.1.preview * DTS Support ([#201](https://github.com/microsoft/durabletask-java/pull/201)) * Add automatic proto file download and commit hash tracking during build ([#207](https://github.com/microsoft/durabletask-java/pull/207)) * Fix infinite loop when use continueasnew after wait external event ([#183](https://github.com/microsoft/durabletask-java/pull/183)) diff --git a/azuremanaged/build.gradle b/azuremanaged/build.gradle index 5343b3bd..833621d3 100644 --- a/azuremanaged/build.gradle +++ b/azuremanaged/build.gradle @@ -152,3 +152,26 @@ spotbugsTest { } } +// Add this after the plugins block +def generatedSourcesDir = file("$buildDir/generated/sources/version/java/main") + +sourceSets { + main { + java { + srcDirs += generatedSourcesDir + } + } +} + +task generateVersionInfo(type: Copy) { + from 'src/main/resources/VersionInfo.java.template' + into generatedSourcesDir + expand(version: project.version) + rename { 'VersionInfo.java' } +} + +compileJava.dependsOn generateVersionInfo + +tasks.named('sourcesJar') { + dependsOn generateVersionInfo +} \ No newline at end of file diff --git a/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskSchedulerClientOptions.java b/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskSchedulerClientOptions.java index e2bca74c..be56be71 100644 --- a/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskSchedulerClientOptions.java +++ b/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskSchedulerClientOptions.java @@ -226,6 +226,11 @@ public void start(ClientCall.Listener responseListener, Metadata headers) taskHubName ); + headers.put( + Metadata.Key.of("user-agent", Metadata.ASCII_STRING_MARSHALLER), + DurableTaskUserAgentUtil.getUserAgent() + ); + // Add authorization token if credentials are configured if (finalTokenCache != null) { String token = finalTokenCache.getToken().getToken(); diff --git a/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskSchedulerWorkerOptions.java b/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskSchedulerWorkerOptions.java index 03f9d60a..bebf4f3a 100644 --- a/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskSchedulerWorkerOptions.java +++ b/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskSchedulerWorkerOptions.java @@ -235,6 +235,11 @@ public void start(ClientCall.Listener responseListener, Metadata headers) taskHubName ); + headers.put( + Metadata.Key.of("user-agent", Metadata.ASCII_STRING_MARSHALLER), + DurableTaskUserAgentUtil.getUserAgent() + ); + // Add authorization token if credentials are configured if (finalTokenCache != null) { String token = finalTokenCache.getToken().getToken(); diff --git a/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskUserAgentUtil.java b/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskUserAgentUtil.java new file mode 100644 index 00000000..cde2c104 --- /dev/null +++ b/azuremanaged/src/main/java/com/microsoft/durabletask/azuremanaged/DurableTaskUserAgentUtil.java @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +package com.microsoft.durabletask.azuremanaged; + +/** + * Utility class for generating the user agent string for the Durable Task SDK. + */ +public final class DurableTaskUserAgentUtil { + /** + * The name of the SDK used in the user agent string. + */ + private static final String SDK_NAME = "durabletask-java"; + + private DurableTaskUserAgentUtil() { + // Private constructor to prevent instantiation + } + + /** + * Generates the user agent string for the Durable Task SDK based on a fixed name and the package version. + * + * @return The user agent string. + */ + public static String getUserAgent() { + return String.format("%s/%s", SDK_NAME, VersionInfo.VERSION); + } +} \ No newline at end of file diff --git a/azuremanaged/src/main/resources/VersionInfo.java.template b/azuremanaged/src/main/resources/VersionInfo.java.template new file mode 100644 index 00000000..f4acb56d --- /dev/null +++ b/azuremanaged/src/main/resources/VersionInfo.java.template @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +package com.microsoft.durabletask.azuremanaged; + +/** + * Auto-generated version information for the Durable Task SDK. + * This file is generated during the build process. + */ +public final class VersionInfo { + /** + * The version of the SDK. + */ + public static final String VERSION = "${version}"; + + private VersionInfo() { + // Private constructor to prevent instantiation + } +} \ No newline at end of file diff --git a/samples/build.gradle b/samples/build.gradle index e9f049e8..5cb638df 100644 --- a/samples/build.gradle +++ b/samples/build.gradle @@ -1,7 +1,6 @@ plugins { id 'org.springframework.boot' version '2.5.2' id 'java' - id 'application' } group 'io.durabletask' @@ -9,7 +8,12 @@ version = '0.1.0' def grpcVersion = '1.59.0' archivesBaseName = 'durabletask-samples' -application { +bootJar { + mainClass = 'io.durabletask.samples.WebApplication' +} + +task runWebAppToDurableTaskSchedulerSample(type: JavaExec) { + classpath = sourceSets.main.runtimeClasspath mainClass = 'io.durabletask.samples.WebAppToDurableTaskSchedulerSample' }