Azure funktioniert in Java

Überblick

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)

Umgebung

Zunächst verschiedene Installationen

.NET CORE Von ↓ installieren. https://www.microsoft.com/net/learn/get-started/windows node.js

Installateur

Wählen Sie "Windows Installer (.msi)". https://nodejs.org/en/download/

Bestätigung

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

Erstellen Sie ein Projekt

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

Sofort bauen

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>

Testlauf lokal

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'

Bereitstellen

Ich werde es endlich bereitstellen.

Melden Sie sich bei Azure an

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"
    }
  }
]

Mit Maven bereitstellen

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ü.

azurePortal.png

Versuche zu rennen

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!

Machen Sie eine originelle Funktion

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);
        }
    }
}

Machen Sie einen Timer-Trigger

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.

Bibliothek hinzufügen

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.

スケッチ.png

スケッチ2.png

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! 1528452015300.png

Ich würde gerne verschiedene Dinge ausprobieren, aber vorerst ist es das.

Impressionen

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.

Hilfreiche Seite

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

Azure funktioniert in Java
Erstellen Sie Azure-Funktionen in Java
Adressiert, da Azure-Funktionen in Java nicht mehr funktionieren
Führen Sie Java-Anwendungen in Azure Batch aus
Partisierung in Java
Änderungen in Java 11
Janken in Java
Umfangsrate in Java
FizzBuzz in Java
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Kommentare in der Java-Quelle
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Erstellen Sie JSON in Java
Datumsmanipulation in Java 8
Was ist neu in Java 8?
Verwenden Sie PreparedStatement in Java
Was ist neu in Java 9,10,11
Parallele Ausführung in Java
Aufrufen von Funktionen in großen Mengen mit Java Reflection
Löschen Sie alle aus dem Java SDK in Azure CosmosDB
Ändern Sie die Größe des Java-Heapspeichers in Tomcat von Azure App Service
Android-Laden Sie Bilddateien in den Azure Blob-Speicher in Java hoch
Remote-Debugging von Java-Anwendungen in Azure Web Apps
Lesen Sie Binärdateien in Java 1
Vermeiden Sie den Fehler, den Yuma in Java gemacht hat
[Neta] Sleep Sort in Java
Bearbeiten von ini in Java: ini4j
Java-Geschichte in dieser Welt
Segfo Java in 6 Zeilen
Versuchen Sie, JavaScript in Java aufzurufen
Lassen Sie uns Spresense mit Java entwickeln (1)
Ich habe ein Roulette in Java gemacht.
Implementierung der zweistufigen Authentifizierung in Java
Refactoring: Machen Sie Blackjack in Java
Schreiben Sie Flyway-Rückrufe in Java
Themenanalyse (LDA) in Java