Es scheint, dass Java offiziell von Azure-Funktionen unterstützt wird. Versuchen wir es also eine Weile. Grundsätzlich wurde es gemäß dem folgenden Ablauf durchgeführt, aber ich bin auf dem Weg mehrmals gestolpert, machen Sie sich also eine Notiz mit dem Inhalt des Stolperns. Erstellen Sie Ihre erste Funktion mit Java und Maven (Vorschau)
.NET CORE Von ↓ installieren. https://www.microsoft.com/net/learn/get-started/windows node.js
Wählen Sie "Windows Installer (.msi)". https://nodejs.org/en/download/
Nach der Installation ist der Pfad bereits vorhanden. Lassen Sie uns an der Eingabeaufforderung überprüfen.
> node -v
v8.9.4
Azure Functions Core Tools Ein Tool, mit dem Sie Azure-Funktionen lokal ausführen und debuggen können. Nachdem wir node.js installiert haben, installieren Sie es mit npm.
>npm install -g azure-functions-core-tools@core
C:\Users\xxx\AppData\Roaming\npm\func -> C:\Users\xxx\AppData\Roaming\npm\node_modules\azure-functions-core-tools\lib\main.js
C:\Users\xxx\AppData\Roaming\npm\azurefunctions -> C:\Users\xxx\AppData\Roaming\npm\node_modules\azure-functions-core-tools\lib\main.js
C:\Users\xxx\AppData\Roaming\npm\azfun -> C:\Users\xxx\AppData\Roaming\npm\node_modules\azure-functions-core-tools\lib\main.js
[email protected] postinstall C:\Users\xxx\AppData\Roaming\npm\node_modules\azure-functions-core-tools
node lib/install.js
[==================] Downloading Azure Functions Cli
+ [email protected]
added 46 packages in 8.164s
Azure CLI Wie der Name schon sagt, handelt es sich um ein Tool, mit dem Sie Azure in der Befehlszeile verwenden können. Installieren Sie anhand der folgenden Anweisungen. https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows
Wechseln Sie an der Eingabeaufforderung in den Arbeitsbereich von Eclipse und führen Sie den folgenden Befehl aus. Ich denke, Sie können ein neues Projekt mit der GUI erstellen.
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype
Sie werden nach verschiedenen Gruppen-IDs gefragt. Geben Sie ihm einen Namen, den Sie mögen.
Define value for property 'groupId': jp.suzuq
Define value for property 'artifactId': azure.functions
Define value for property 'version' 1.0-SNAPSHOT: : 0.0.1
Define value for property 'package' jp.suzuq: : jp.suzuq.azure.functions
Define value for property 'appName' azure.functions-20180222185249620: :
Define value for property 'appRegion' westus: : jp
Nach Abschluss des Projekts wird eine einfache Funktionsklasse erstellt. Lassen Sie uns dies zunächst erstellen und bereitstellen und den Vorgang überprüfen.
mvn clean package
Wenn ich es so gemacht habe, ist der Build mit dem folgenden Fehler fehlgeschlagen.
Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:0.1.10:package (package-functions) on project azure.functions: Execution package-functions of goal com.microsoft.azure:azure-functions-maven-plugin:0.1.10:package failed: A required class was missing while executing com.microsoft.azure:azure-functions-maven-plugin:0.1.10: package: com/microsoft/azure/serverless/functions/annotation/DocumentDBInput
Das Azure-Funktionen-Maven-Plugin scheint etwas falsch zu sein, also habe ich die Version auf die neueste Version 0.2.1 geändert und es hat funktioniert.
pom.xml
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-functions-maven-plugin</artifactId>
<version>0.2.1</version>
</plugin>
Versuchen Sie vor der Bereitstellung in Azure, es lokal auszuführen.
mvn azure-functions:run
Das Funktionslogo wird auf der Konsole angezeigt ...
[INFO] Starting running Azure Functions...
%%%%%%
%%%%%%
@ %%%%%% @
@@ %%%%%% @@
@@@ %%%%%%%%%%% @@@
@@ %%%%%%%%%% @@
@@ %%%% @@
@@ %%% @@
@@ %% @@
%%
%
Wenn die folgende Meldung angezeigt wird, können Sie loslegen.
Http Functions:
hello: http://localhost:7071/api/hello
Versuchen Sie wie angegeben Folgendes in Curl: Wenn Sie keine Locken haben, verwenden Sie ein Tool, das etwas http werfen kann.
curl -w '\n' -d hoge http://localhost:7071/api/hello
Das Protokoll wird an die Konsole ausgegeben und Sie können sehen, dass es ausgeführt wird.
[2018/05/02 9:51:28] Function started (Id=0aed5288-e5ff-47e2-868b-8455d7731b70)
[2018/05/02 9:51:28] Executing 'Functions.hello' (Reason='This function was programmatically called via the host APIs.', Id=0aed5288-e5ff-47e2-868b-8455d7731b70)
[2018/05/02 9:51:28] Java HTTP trigger processed a request.
[2018/05/02 9:51:28] Function "hello" (ID: 40832889-9057-4664-885e-c84407660a4a) invoked by Java Worker
[2018/05/02 9:51:28] Function completed (Success, Id=0aed5288-e5ff-47e2-868b-8455d7731b70, Duration=5ms)
[2018/05/02 9:51:28] Executed 'Functions.hello' (Succeeded, Id=0aed5288-e5ff-47e2-868b-8455d7731b70)
Das Ausführungsergebnis wurde mit der 200. Antwort zurückgegeben.
Hello, hoge'
Ich werde es endlich bereitstellen.
Melden Sie sich mit der Azure-CLI an. Öffnen Sie die Powershell auf Ihrem PC und "az login".
> az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXXX to authenticate.
Gehen Sie wie angewiesen zu https://microsoft.com/devicelogin und geben Sie den Code ein, der auf der Powershell-Konsole angezeigt wird. Der Befehl "az login" wird beendet und zeigt die Informationen zu dem von Ihnen angemeldeten Azure an.
[
{
"cloudName": "AzureCloud",
"id": "xxxxxxxxxxxxxxxxxxxxxxx",
"isDefault": true,
"name": "Microsoft Azure",
"state": "Enabled",
"tenantId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"user": {
"name": "xxxx@xxxxxxxxxxxxxxxxxxxxxx",
"type": "user"
}
}
]
Gehen Sie zurück zu Eclipse und führen Sie den folgenden Befehl maven aus.
mvn azure-functions:deploy
Ich habe einen Fehler bekommen ...
[ERROR] Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:0.2.1:deploy (default-cli) on project azure.functions: Status code 400, {"error":{"code":"LocationNotAvailableForResourceGroup","message":"The provided location 'jp' is not available for resource group. List of available regions is 'centralus,eastasia,southeastasia,eastus,eastus2,westus,westus2,northcentralus,southcentralus,westcentralus,northeurope,westeurope,japaneast,japanwest,brazilsouth,australiasoutheast,australiaeast,westindia,southindia,centralindia,canadacentral,canadaeast,uksouth,ukwest,koreacentral,koreasouth,francecentral'."}}
Da die Region dies sagt, versuchen Sie, die regionähnliche Einstellung von pom.xml von "jp" in "japaneast" zu ändern.
pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<functionAppName>azure.functions-9999999.azurewebsites.net</functionAppName>
<functionAppRegion>japaneast</functionAppRegion>
</properties>
Diesmal habe ich einen anderen Fehler bekommen.
[ERROR] Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:0.2.1:deploy (default-cli) on project azure.functions: The host name azure.functions-20180222185249620.azurewebsites.net is invalid. OnError while emitting onNext value: retrofit2.Response.class
Versuchen Sie, den Funktionsnamen zu ändern. Der Funktionsname ist auch der Dateiname des JAR, das für Azure bereitgestellt wird. Erstellen Sie ihn daher hier erneut.
pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<functionAppName>testFunction</functionAppName>
<functionAppRegion>japaneast</functionAppRegion>
</properties>
Auch ein Fehler.
[ERROR] Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:0.2.1:deploy (default-cli) on project azure.functions: {
[ERROR] "message": "An error has occurred.",
[ERROR] "exceptionMessage": "An error occurred when trying to create a controller of type 'DeploymentController'. Make sure that the controller has a parameterless public constructor.",
[ERROR] "exceptionType": "System.InvalidOperationException",
[ERROR] "stackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
[ERROR] "innerException": {
[ERROR] "message": "An error has occurred.",
[ERROR] "exceptionMessage": "The user name or password is incorrect.\r\n",
[ERROR] "exceptionType": "System.IO.IOException",
[ERROR] "stackTrace": " at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)\r\n at System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)\r\n at System.IO.Directory.CreateDirectory(String path)\r\n at System.IO.Abstractions.DirectoryWrapper.CreateDirectory(String path)\r\n at Microsoft.Web.Deployment.WebApi.PathHelper.GetLogFilesFolderPath(IEnvironment environment)\r\n at Microsoft.Web.Deployment.WebApi.DeploymentController..ctor()\r\n at lambda_method(Closure )\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
[ERROR] }
[ERROR] }: OnError while emitting onNext value: retrofit2.Response.class
Ich weiß nicht, was du sagst, also habe ich es erneut versucht und aus irgendeinem Grund ERFOLGREICH.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 35.832 s
[INFO] Finished at: 2018-05-10T18:55:38+09:00
[INFO] Final Memory: 48M/551M
[INFO] ------------------------------------------------------------------------
Lassen Sie uns die im Azure-Portal bereitgestellte Funktion überprüfen. Über "Funktions-App" im Seitenmenü.
Sie können die URL von "Funktions-URL abrufen" oben rechts im Bild oben kopieren. Lassen Sie uns eine Anfrage von curl an die kopierte URL stellen.
curl -w '\n' https://functionName.azurewebsites.net/api/hello -d AzureFunctions
Hello, AzureFunctions
Es funktionierte!
Vorerst funktionierte die standardmäßig vorbereitete Funktion. Erstellen wir also eine Originalfunktion. Ich habe gerade dieses Programm ausgeführt, das automatisch im Arbeitsbereich generiert wurde. Mit dieser Referenz werde ich meine eigene Funktion erstellen.
Function.java
package jp.suzuq.azure.functions;
import java.util.*;
import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.*;
/**
* Azure Functions with HTTP Trigger.
*/
public class Function {
/**
* This function listens at endpoint "/api/hello". Two ways to invoke it using "curl" command in bash:
* 1. curl -d "HTTP Body" {your host}/api/hello
* 2. curl {your host}/api/hello?name=HTTP%20Query
*/
@FunctionName("hello")
public HttpResponseMessage<String> hello(
@HttpTrigger(name = "req", methods = {"get", "post"}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
// Parse query parameter
String query = request.getQueryParameters().get("name");
String name = request.getBody().orElse(query);
if (name == null) {
return request.createResponse(400, "Please pass a name on the query string or in the request body");
} else {
return request.createResponse(200, "Hello, " + name);
}
}
}
Die Standardeinstellung ist eine Funktion, die durch eine http-Anforderung ausgelöst wird. Erstellen wir also eine Funktion, die von einem Timer ausgelöst wird.
TimerFunction.java
package jp.suzuq.azure.functions;
import com.microsoft.azure.serverless.functions.ExecutionContext;
import com.microsoft.azure.serverless.functions.annotation.FunctionName;
import com.microsoft.azure.serverless.functions.annotation.TimerTrigger;
public class TimerFunction {
@FunctionName("timer")
public void timer(
@TimerTrigger(name = "timer", schedule = "0 */5 * * * *") String timerInfo,
final ExecutionContext context)
{
context.getLogger().info("timerInfo : " + timerInfo);
}
}
Fügen Sie dem ersten Argument der Methode die Annotation @TimerTrigger hinzu. Beschreiben Sie dann den Zeitplan im Cron-Format unter "Zeitplan". Dies ist der Zeitplan für die Funktionsausführung.
Ich wollte Azure-Funktionen mit Java erstellen, weil ich verschiedene Java-Bibliotheken verwenden wollte. Es gibt viele nützliche Java-Klassen im internen Maven-Repository, und ich verwende sie in meiner täglichen Entwicklung. Daher dachte ich, es wäre schön, wenn ich sie auch in Azure-Funktionen verwenden könnte.
Fügen Sie es zu pom.xml hinzu und versuchen Sie es bereitzustellen.
pom.xml
<dependency>
<groupId>jp.hoge</groupId>
<artifactId>HogeCommon</artifactId>
<version>1.20.0</version>
</dependency>
Wenn ich versuche, es zu verschieben, läuft die Funktion aus irgendeinem Grund ab und es wird in der Mitte zwangsweise beendet. Ich habe mich gefragt, warum das Zeitlimit abgelaufen ist, aber es scheint, dass die Bibliothek, die ich zu pom hinzugefügt habe, nicht im vorgefertigten Modul enthalten war. Dann werfen Sie eine ClassNotFoundException ...
Vorgefertigte Module können in Kudu vom Azure-Portal heruntergeladen werden, wenn Sie den Zielordner im Eclipse-Arbeitsbereich anzeigen möchten oder was tatsächlich bereitgestellt wurde.
Da die Erstellungsmethode schlecht war, habe ich pom.xml unter Bezugnahme auf Folgendes geändert. How to add dependency JAR in java azure functions
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive />
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Wow! Es hat funktioniert!
Ich würde gerne verschiedene Dinge ausprobieren, aber vorerst ist es das.
Ich bin froh, die interne Bibliothek mit Azure-Funktionen verwenden zu können. Aber es ist doch mühsam, verschiedene Dinge vorzubereiten. Wenn es sich um eine einfache Funktion handelt, ist es am einfachsten, sie mit Javascript zu erstellen. Es ist schön, dass Java vorhandene Assets im Unternehmen wie dieses wiederverwenden und lokal debuggen kann. Ich möchte es entsprechend dem Zweck richtig verwenden.
Erstellen Sie Ihre erste Funktion mit Java und Maven (Vorschau) Trigger in Java setzen Installation und Anmeldung von Azure CLI (Windows-Version) How to add dependency JAR in java azure functions
Recommended Posts