Posts tagged ‘Java’

Azure Spring Cloud の環境構築方法のご紹介

本ブログエントリは、Microsoft Azure Advent Calendar の 20日目の内容です。
昨日は @mstakaha1113 さんによる 「AzureでIoT系のサービスをサラッと(?)使ってみよう」でした。
明日は @hoisjp さんです。

Pivotal と Microsoft は 2019/10/8 オースティンで開催された SpringOne Platform 2019 Azure Spring Cloud というサービスを発表しました。


(SpringOne 2019 における Azure Spring Cloud の発表内容)

Azure Spring Cloud の特徴


Azure Spring Cloud は Microsoft と Pivotal が共同開発した Spring Cloud アプリケーションの開発・運用に特化した環境で、これを利用した場合、アプリケーションの運用・管理コストを大幅に軽減してくれます。

実際の実行環境は Azure Kubernets Service (AKS) ですが、Kubernetes 環境を全く意識することなく、本来必要となる複雑な管理操作を完全に隠蔽しています。実際 Kubernetes コマンドを直接実行する事はできません。その為、おそらく多くの方が Kubernetes 上で動作している事に気づかないかもしれません。

筆者は Kubernetes による Java アプリケーションの開発・運用も経験をしていますが、Kubernetes 上での開発・運用に比べて、特にインフラ面の管理コストが大幅に削減できると考えています。
通常 Kubernetes 上で Java アプリケーションを動作させるためには、コンテナを強く意識したビルド・プロセス、リリース・プロセスが必要です (コンテナのビルド、コンテナレジストリへの Push、YAML の生成、k8s への適用など)。

# Build the Source Code
$ mvn clean package

# Build the Container Image
$ docker build -t $DOCKER_IMAGE:$VERSION . -f Dockerfile
$ docker tag $DOCKER_IMAGE:$VERSION $DOCKER_REPOSITORY/$DOCKER_IMAGE:$VERSION

# Push the image to Container Registry
$ docker push $DOCKER_REPOSITORY/$DOCKER_IMAGE:$VERSION

# Create and Modify the  Deployment YAML file

# Apply to the Kubernetes
kubectl apply --record -f deployment.yaml

上記以外にも、Kuberenes 自身のメンテナンスやパッチ適用、クラスタ自身の運用管理を行わなければなりません。

しかし、Azure Spring Cloud を利用すると Pivotal Build Service という機能を完全統合しているため、アプリケーション開発者は、ソースコードの開発により集中できるようになります。具体的には開発者はソースコードの開発に集中し、コンテナのビルドや YAML ファイルの生成は不要で、コマンドを2、3回実行するだけで簡単にアプリケーションをデプロイできるようになります。デプロイに関しても最初から Blue-Green デプロイの機能を持つため、最新のビルドは Staging 環境にデプロイし、動作確認したのち、本番環境と切り替えるといった操作も容易に実現できます。
さらに、既存の Azure の Managed Service (現時点では Cosmos DB, MySQL, Redis) とのサービス・バインディングの機能も持つ為、JDBC などの接続情報を容易に作成することもできとても便利です。

上記以外にも多くの機能を持つ Azure Spring Cloud ですが、筆者は比較的小規模〜中規模のマイクロサービス提供をしたい場合、今後有用な選択肢になると考えています。



実際の操作イメージを掴む為、下記のデモ動画をご覧ください。

下記動画のデモ内容


  1. デモアプリケーションのご紹介 (PetStore)
  2. Azure DataBase for MySQL の動作確認
  3. Visual Studio Code を利用した Spring Boot アプリの実装のご紹介
  4. ソースコードのビルド
  5. Azure Spring Cloud アプリの作成
  6. Azure Spring Cloud アプリから Managed MySQL へのバインド
  7. CPU, Memory, インスタンスなどのスケール機能のご紹介
  8. Spring Boot アプリケーションを Azure Spring Cloud アプリへデプロイ
  9. Log Analytics による、アプリケーション・ログの確認
  10. アプリケーションの動作確認
  11. 分散トレーシング機能のご紹介 (Application Insights を利用)
  12. ブルー・グリーン・デプロイ機能の検証
      ソースコード修正→ビルド→ステージング環境へのデプロイ
  13. ステージング・アプリと本番アプリの切り替え
  14. GitHub Actions を利用した CI/CD の構築


(GUI で Azure Spring Cloud と MySQL を接続する環境構築方法)

※ ご注意:本デモ動画は筆者のプレゼン時に操作時の待ち時間を短縮するため、操作待ちの箇所をカット(編集)しています。実際には、本デモ動画よりも所用時間が長くなることをご理解ください。

NeXTSTEP :Azure Spring Cloud 構築の事前準備 (CLI 版)

以降のエントリーでは、上記 GUI (動画ビデオ) で環境構築した内容と、ほぼ同等の内容を CLI (コマンドライン)だけで構築する方法について紹介します。

CLI で環境構築する場合は別途、Log AnalyticsApplication Insights の連携などを自ら行う必要がある為、まずはこれらを作成するところから始めます。

1. Azure へのログインと Spring Cloud 用エクステンションの追加


まず、Azure CLI を利用するために az login コマンドでログインをしましょう。そして次に、Azure Spring Cloud を操作するために、az extension コマンドでエクステンションを追加してください。

$  az login
$  az extension add --name spring-cloud

2. 環境変数の設定


次に、各種リソースの名前などを可変で変更しやすくするため、さらに入力ミスを極力減らす目的で、下記の環境変数を設定してください。

$  export RESOURCE_GROUP=Spring-Cloud-Services
$  export SPRING_CLOUD_SVC_NAME=spring-cloud-services-jp
$  export LOCATION=southeastasia
$  export APP_INSIGHTS_NAME=spring-clouds-appinsights
$  export MYSQL_NAME=mysql4springcloud
$  export MYSQL_USERNAME=terada
$  export MYSQL_PASSWORD=whelp90-OCRs
$  export MYSQL_DB_NAME=petstoredb
$  export SPRING_CLOUD_APP_NAME=petstore-app
$  export SPRING_CLOUD_APP_NEW_VERSION_NAME=petstore-app-new-version

上記の環境変数名のそれぞれの意味を下記に記載します。適宜ご自身の環境に応じて上記の環境変数の値は変更してください。

環境変数名 説明
RESOURCE_GROUP リソースグループ名
SPRING_CLOUD_SVC_NAME Azure Spring Cloud のサービス名
LOCATION リソースを配置するリージョンの場所
APP_INSIGHTS_NAME Application Insights の名前
MYSQL_NAME MySQL の名前
MYSQL_USERNAME MySQL のログイン・ユーザ名
MYSQL_PAAWORD MySQL のユーザ・パスワード
MYSQL_DB_NAME MySQL のデータベース名
SPRING_CLOUD_APP_NAME Azure Spring Cloud のデプロイするアプリケーション名
CLOUD_APP_NEW_VERSION_NAME Azure Spring Cloud のステージング環境に配備するアプリケーション名

3. Azure リソースグループの作成


それでは早速、Azure Spring Cloud をインストールするリソース・グループを作成します。下記のコマンドを実行してください。

$  az group create \
     --location $LOCATION \
     --name $RESOURCE_GROUP

4. Application Insights のインストール


リソース・グループを作成した後、Application Insights をインストールしてください。Application Insights をインストールする事で、Azure Spring Cloud から分散トレーシング機能を利用できるようになります。

$ az resource create \
     --resource-group $RESOURCE_GROUP \
     --resource-type "Microsoft.Insights/components" \
     --name $APP_INSIGHTS_NAME \
     --location $LOCATION \
     --properties '{"Application_Type":"web"}'

上記コマンドを実行した結果が、JSON 形式で出力されます。出力結果の中に、下記のような InstrumentationKey が表示されます。
後の設定で利用するため、この値をコピーして保存しておいてください。

    "InstrumentationKey": "d25f6639-****-****-****-f1b******b41",

5. Log Analytics Workspace のインストール

次に、Log Analytics Workspace をインストールします。下記の defaultValue の値をご自身の環境にあわせて修正して deploy_logworkspacetemplate.json というファイル名で保存してください。

{
"$schema": "https://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "workspaceName": {
        "type": "String",
 		"defaultValue": "workspace-name(適宜名前を修正してください)", 
 		"metadata": {
          "description": "Specifies the name of the workspace."
        }
    },
    "location": {
        "type": "String",
 		"allowedValues": [
 		  "eastus",
                  "southeastasia",
 		  "westus"
 		],
 		"defaultValue": "southeastasia",
 		"metadata": {
 		  "description": "Specifies the location in which to create the workspace."
 		}
    },
    "sku": {
        "type": "String",
 		"allowedValues": [
          "Standalone",
          "PerNode",
 	      "PerGB2018"
        ],
 		"defaultValue": "PerGB2018",
         "metadata": {
        "description": "Specifies the service tier of the workspace: Standalone, PerNode, Per-GB"
 	}
      }
},
"resources": [
    {
        "type": "Microsoft.OperationalInsights/workspaces",
        "name": "[parameters('workspaceName')]",
        "apiVersion": "2015-11-01-preview",
        "location": "[parameters('location')]",
        "properties": {
            "sku": {
                "Name": "[parameters('sku')]"
            },
            "features": {
                "searchVersion": 1
            }
        }
      }
   ]
}

上記の JSON を deploy_logworkspacetemplate.json ファイルに保存したのち、下記のコマンドを実行し Log Analytics の Workspace を作成してください。

$ az group deployment create \
     --resource-group $RESOURCE_GROUP \
     --name spring-cloud-log-analytics-workspace \
     --template-file deploy_logworkspacetemplate.json

6. Azure Database for MySQL のインストールと検証用 DB の作成

最後の準備事項として、下記のコマンドを実行して Azure Database for MySQL をインストールします。

※ ご注意:今回の MySQL の作成方法は検証目的で作成しています。本番環境用ではないためご注意ください。

$ az mysql server create \
     -l $LOCATION \
     -g $RESOURCE_GROUP \
     -n $MYSQL_NAME \
     -u $MYSQL_USERNAME \
     -p $MYSQL_PASSWORD \
     --sku-name GP_Gen5_2

MySQL を作成した直後は Firewall の設定により全てのクライアントからのリクエストを受け付けられなくなっています。そこで Firewall の設定を行い MySQL に接続できるようにします。ここでは、Azure 内の IP アドレス (0.0.0.0) からだけ MySQL に接続をできるようにしています。

※ ご注意:本来は個別に接続可能な IP アドレスを設定してください。

$ az mysql server firewall-rule create \
     -g $RESOURCE_GROUP \
     -s $MYSQL_NAME \
     -n allowfrominternal \
     --start-ip-address 0.0.0.0 \
     --end-ip-address 0.0.0.0

上記の設定で、Azure 内のネットワークからは MySQL に接続できるようになります。たとえばコマンドの実行環境が Cloud Shell などを利用している場合、これで接続ができるようになるかと想定します。

一方、MySQL への接続が外部のネットワークからの場合、0.0.0.0 の部分を変更し個別に接続可能な IP アドレスを指定してください。管理ポータルを利用すると簡単にクライアントの IP アドレスを入手し登録する事もできます。MySQL の「Connection Security」より「Add ClientIP」というボタンを押下するとご自身の IP アドレスが自動的に取得できます。「Save」ボタンを押下してご自身のパソコンなどからアクセスできるように設定してください。


Firewall 設定が完了すると、mysql コマンドを利用して MySQL に接続ができるようになります。下記のコマンドでは日本語入力に対応する設定や、データベースの作成、さらにはテーブル作成やデータをインサートを行なっています。 ( catalog.sql は後述する git clone で入手できます)

$ mysql -u $MYSQL_USERNAME@$MYSQL_NAME \
     -h $MYSQL_NAME.mysql.database.azure.com -p

mysql> show databases;
mysql> show variables like "char%";
mysql> set character_set_database=utf8mb4;
mysql> set character_set_server=utf8mb4;
mysql> create database petstoredb default character set utf8mb4;
mysql> use petstoredb;
mysql> source ./catalog.sql
mysql> select * from item;

CLI 版:Azure Spring Cloud の環境構築

7. Azure Spring Cloud の構築

上記の準備を完了することで、Azure Spring Cloud を便利に利用できるための環境が整いました。そこで、ここから実際に Azure Spring Cloud のサービスを作っていきます。リソース・グループ内に Azure Spring Cloud のサービスを作成してください。

$ az spring-cloud create \
     -n $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP

8.Azure Spring Cloud と Log Analytics の連携

Azure Spring Cloud のサービスを作成したのち、Log Analytics WorkSpace と連携するための設定を行ってください。
大変残念ながら、この連携の設定は現時点で Azure 管理ポータルからしかできません。
管理ポータルから Azure Spring Cloud を選択し、「Monitoring」→「Diagnostics settings」を選択してください。

次に「+ Add diagnostic setting」を押下し「Name」に適切な名前を入力してください。

次に「Send to Log Analytics」にチェックし「Subscription」と「Log Analytics workspace」から、準備段階で作成したワークスペース名を選択してください。log, metrics の全項目にチェックし「Save」ボタンを押下してください。

以上で、デプロイしたアプリケーションのログなどが Log Analytics 経由で参照できるようになります。

9. Azure Spring Cloud 上に新規アプリの作成

Azure Spring Cloud のサービスを作成したので、次にサービス内に Spring Boot/Spring Cloud のマイクロサービス・アプリケーションをデプロイします。

$ az spring-cloud app create \
     -n $SPRING_CLOUD_APP_NAME \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP

10. MySQL へのバインドを作成

次に、Azure Spring Cloud から MySQL を利用できるようにバインド設定を行います。GUI からバインドを作成する際は、GUI からサブスクリプションを選択しその中に含まれる MySQL を選択することで容易にバインド情報を作成できますが、CLI からバインドを行うためにはまず MySQL の ID を取得しなければなりません。そこで、MySQL の ID を取得するために、下記のコマンドを実行して取得してください。ここで、「“id”: “/subscriptions/***」 ではじまる行の内 「/databases/petstoredb」 より前の部分を MySQL の リソース ID (–resource-id) として利用します。

$ az mysql db show \
     --name $MYSQL_DB_NAME \
     -g $RESOURCE_GROUP \
     --server-name $MYSQL_NAME
{
  "charset": "utf8mb4",
  "collation": "utf8mb4_general_ci",
  "id": "/subscriptions/********-****-****-****-************/resourceGroups/Spring-Cloud-Env/providers/Microsoft.DBforMySQL/servers/mysql4springcloud/databases/petstoredb",
  "name": "petstoredb",
  "resourceGroup": "Spring-Cloud-Env",
  "type": "Microsoft.DBforMySQL/servers/databases"
}

取得した リソース ID を指定して MySQL のバインドを作成してください。

$ az spring-cloud app binding mysql add \
     --app $SPRING_CLOUD_APP_NAME \
     --resource-id "/subscriptions/********-****-****-****-************/resourceGroups/Spring-Cloud-Env/providers/Microsoft.DBforMySQL/servers/mysql4springcloud" \
     --database-name $MYSQL_DB_NAME \
     --name "mysql-binding"  \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP \
     --username $MYSQL_USERNAME@$MYSQL_NAME \
     --key $MYSQL_PASSWORD

バインドが完了すると Azure Portal 上では下記のような内容を確認できます。

11. サンプル・ソースコードの入手

次に、GitHub よりサンプルのソースコードやデータ、設定ファイルなどを入手してください。

$ git clone https://github.com/yoshioterada/Azure-Spring-Cloud-with-MySQL-Sample

ディレクトリ構成は下記のようになっています。

├── catalog.sql (MySQL に挿入するデータ)
├── deploy_logworkspacetemplate.json (Log Analytics Workspace を作成するためのJSON)
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── yoshio3
    │   │           └── demo
    │   │               ├── CatItemRepository.java (Repository クラス)
    │   │               ├── DemoApplication.java  (Main クラス)
    │   │               ├── Item.java   (JPA Entity クラス)
    │   │               └── PetItemController.java (REST API 実装クラス)
    │   └── resources
    │       ├── AI-Agent.xml
    │       ├── application.properties
    │       ├── log4j2.xml
    │       ├── static
    │       │   ├── css
    │       │   │   ├── new-design.css  (新デザイン)
    │       │   │   └── old-design.css  (旧デザイン)
    │       │   └── images
    │       └── templates
    │           └── index.html   ( Web ページ ThymeLeaf )
    └── test
        └── java
            └── com
                └── yoshio3
                    └── demo
                        └── DemoApplicationTests.java

12. ソースコードのビルドとアプリのデプロイ

入手したソースコードを mvn コマンドでビルドしてください。ビルドが完了すると target ディレクトリ配下に demo-0.0.1-SNAPSHOT.jar ができます。

$ mvn clean package -DskipTests
$ ls target/
classes
demo-0.0.1-SNAPSHOT.jar
demo-0.0.1-SNAPSHOT.jar.original
generated-sources
generated-test-sources
maven-archiver
maven-status
test-classes

ビルドの成果物である demo-0.0.1-SNAPSHOT.jar を Azure Spring Cloud のアプリに対してデプロイします。

この時、事前準備で作成した Application Insights の InstrumentationKey を環境変数 (–env “azure.application-insights.instrumentation-key=) に設定します。これにより Java で実装した Application Insights を動作できます。デプロイには少し時間がかかりますので、しばらくお待ちください。

$ az spring-cloud app deploy \
     -n $SPRING_CLOUD_APP_NAME \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP \
     --instance-count 2 --memory 2 \
     --runtime-version Java_8  \
     --env "azure.application-insights.instrumentation-key=********-****-****-****-************" \
     --jar-path ./target/demo-0.0.1-SNAPSHOT.jar --version 1 

13. 外部から接続可能な Public URL を作成

デプロイ時に Public URL の公開オプションを指定せずにデプロイすると下記のように 「Test Endpoint」しか作成されません。

GUI からは「Assign domain」のボタンを押下するだけで容易に Public URL を付加する事ができますが、CLI では下記のコマンドを実行することで Public からアクセス可能な URL を作成できます。

$ az spring-cloud app update \
     -n $SPRING_CLOUD_APP_NAME  \
     -s $SPRING_CLOUD_SVC_NAME  \
     -g $RESOURCE_GROUP \
     --is-public true

作成された URL を確認するために、下記のコマンドを実行してください。”url” の行に URL が表示されます。

$ az spring-cloud app show \
     -n $SPRING_CLOUD_APP_NAME  \
     -s $SPRING_CLOUD_SVC_NAME  \
     -g $RESOURCE_GROUP

    ........ (中略)

    "url": "https://spring-cloud-services-******-********-***.azuremicroservices.io"
  },
  "resourceGroup": "Spring-Cloud-Env",
  "type": "Microsoft.AppPlatform/Spring/apps"
}

14. 動作確認

上記の URL に対して curl コマンド、もしくは Web ブラウザを利用してアクセスしてみてください。

$ curl https://spring-cloud-services-******-********-***.azuremicroservices.io/cats

15. 新バージョンをステージングへデプロイ

上記で一通りアプリケーションのデプロイはできるようになりましたが、さらにアプリケーションを更新して、Blue-Green デプロイの機能も試してみましょう。
アプリケーションの一部を更新して新バージョンを作成します。
ここではわかりやすくするため、デザインを変更してみましょう。index.html を開き、CSS を “old-design.css” から “new-design.css” に修正して、さらに <H1>Hello Java<H1> の行も追加します。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Springboot</title>
    <meta charset="utf-8" />
    <link th:href="@{/css/new-design.css}" rel="stylesheet" type="text/css"></link>
</head>
<body>
<H1>Hello Java</H1>

編集が終わったのち、新しいバージョンを作るために再度 mvn コマンドでソースコードをビルドします。

$ mvn clean package -DskipTests

今回は、アプリケーションを Staging 環境にデプロイするため、下記のコマンドを実行します。–name で新規バージョンにつける名前を指定します。

(ご注意:上記で実行した az spring-cloud app deploy コマンドとは違います)

$ az spring-cloud app deployment create \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP \
     --name $SPRING_CLOUD_APP_NEW_VERSION_NAME \
     --version 2 \
     --app $SPRING_CLOUD_APP_NAME \
     --jar-path target/demo-0.0.1-SNAPSHOT.jar

16. 本番とステージングのアプリの入れ替え

上記で、Staging 環境に新しいバージョンがデプロイされましたが、新バージョンを本番環境に適用するためには、旧バージョンから新バージョンにリクエストの振り先を変える必要があります。そこで、振り先を新バージョンに変更するために下記のコマンドを実行してください。

$ az spring-cloud app set-deployment \
     --deployment $SPRING_CLOUD_APP_NEW_VERSION_NAME \
     --name $SPRING_CLOUD_APP_NAME \
     -s $SPRING_CLOUD_SVC_NAME \
     -g $RESOURCE_GROUP

このようにして簡単にバージョンの切り替えも可能です。

17. GitHub Actions による CI/CD

さらに、下記にのような GitHub Actions のワークフローを作成(.github/workflows/main.yaml)することで、GitHub に対してソースコードを Push する度に、ソースコードのビルドからデプロイまでを自動化することもできます。

このワークフローを作成する上で注意したポイントは、Staging にすでにアプリケーションがデプロイされている場合、上書きできずエラーになるため、一旦既存のデプロイ済みのアプリケーションを削除して追加しています。また、ソースコードリビジョンとデプロイ名を一致させるために、環境変数に Git のリビジョン番号などを代入し、それを名前に付加するようにしています。

name: Build and deploy on Azure Spring Cloud

on: [push]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Get Year Month Day 
      run: echo ::set-env name=DATE::$(date '+%Y%m%d-%H%M%S')
    - name: Get the Git Revision Number
      run: echo ::set-env name=GIT_SHORT_VERSION::$(git rev-parse --short HEAD)
    - name: Build with Maven
      run: mvn package -DskipTests -Pcloud
    - name: Login to Azure Spring Cloud
      uses: azure/actions/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
    - name: Install Azure Spring Cloud extension
      run: az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl
    - name: Get Un Active Service Name 
      run: echo ::set-env name=UNACTIVE_SERVICE::$(az spring-cloud app deployment list -g Spring-Cloud-Services -s spring-cloud-services-jp --app petstore-app  -o json |  jq -c '.[]| [.name, .properties.active]' | grep false | awk -F'["]' '{print $2}')
    - name: Delete UnActive Service 
      run: az spring-cloud app deployment delete -n ${{env.UNACTIVE_SERVICE}} -g Spring-Cloud-Services -s spring-cloud-services-jp --app petstore-app
    - name: Deploy to Azure Spring Cloud
      run: az spring-cloud app deployment create -g Spring-Cloud-Services -s spring-cloud-services-jp --name green-${{env.DATE}}-${{env.GIT_SHORT_VERSION}} --version ${{env.DATE}}-${{env.GIT_SHORT_VERSION}} --app petstore-app --jar-path target/demo-0.0.1-SNAPSHOT.jar

以上、で GUI でデモした内容とほぼ同等の内容を CLI だけで実施しましたが、自動化設定を行う際には本内容が必要になる場合もあるかと想定します。本エントリを少しでもお役に立てていただければ誠に幸いです。

その他の参考情報

Azure Spring Cloud は 2019 年 10 月に発表されたばかりのサービスで、現時点ではまだ Preview 版になります。しかしながら現状でも便利な機能が含まれるため、ぜひ多くの皆様にお試しいただければ誠に幸いです。また、本紙の都合上取り上げなかった機能に関しても下記のようなドキュメントから参照していただく事ができます。

Azure Spring Cloud
Azure Spring Cloud のドキュメント
その他 Spring on Azure に関する情報
Azure Spring Cloud のご紹介

また、Microsoft MVP である@setoazusaさんも、12/19 に「Azure Spring CloudでBlue-Green Deploy」というエントリーを投稿してくださっているようです。こちらも合わせてご覧ください。

さいごに

Azure Spring Cloud の正式リリース(GA) は来年 2020 年の Q2 あたりを予定しています。ご興味のある方はぜひ、お早めにお試しいただきぜひ使用感に関してフィードバックをいただければ誠に幸いです。
より多くのフィードバックをいただき改善していくことでさらに良くなってまいりますので、ぜひ多くの皆様お試しください。
ご協力のほどどうぞよろしくお願いします。

2019年12月20日 at 12:22 AM

最近の Microsoft の Java 事情とインタビュー記事の日本語化

はじめに:最近の Microsoft における Java について


この記事の本題に入る前に、マイクロソフトの Java 活動にとって、とても嬉しい情報を共有いたします。私が入社したのは約2年半前になります。その際私以外にグローバルで Java on Azure に関する啓蒙活動をしている方は一人 (Brian Benz) しかいませんでした。そして私の入社から2年半を経て、この直近数ヶ月の間に 3 人もの Java 関連の方々がマイクロソフトに入社してきてくださいました。その内二人は元オラクルで、一人は、TomEE を提供する Tomitribe から入ってきてくださいました。

Bruno Borges (Developer Advocate)
Jonathan Giles (Developer Advocate)
Theresa Nguyen (Sr. Product Marketing Manager)

この中で、Bruno Borges は去年の JavaOne San Francisco で基調講演にも登壇したブラジル人で、オラクル時代から Java のコミュニティとの関係が強く、様々なカンファレンスなどで登壇しています。一時期ブラジルにいる頃 Java EE エバンジェリストをしていたこともあったように記憶しています。そして彼はマイクロソフトで Java の Developer Advocate チームを率いるという話を聞いています。

また、Jonathan は私同様 Sun Microsystems 出身で、彼はエンジニアリングチームに所属し、JavaOne のコンテンツ選定委員 (CFP で応募されたコンテンツを選定する側) を務めたり、JavaOne の優秀なスピーカーにだけ与えられる称号 Java Rock Star の称号も持っています。さらに昨年 Duke’s Choice Award なども受賞している、ガチの Java エンジニアです。

最後に、Java 専門のプロダクトマネージャとして最近入社されたのは、TomEE (Tomcat をベースとした Java EE コンテナ) を提供する Tomitribeで Vice President を務めていた方が入社してきてくださいました。

いずれの方も、グローバルでは Java 開発者コミュニティーから認知度の高い、Java コミュニティに精通する方ばかりです。Jonathan はJava SDK の API 実装においても Java らしい実装のレビューなどに多大な貢献が期待されますし、Bruno にはグローバルの Java コミュニティに対して、幅広くコンタクトしてくれると思いますので、ますます Java on Azure の拡大に期待が持てる、そんなハイアリングとなりました。前述した Brian と共に、この 4 名と一緒に Java on Azure の啓蒙活動を続けていく事をとても楽しみにしています。

下記のエントリの内容は、先日上記の Jonathan Giles からインタビューを受けましたので、インタビュー内容 (オリジナルの英語) を日本語化した内容を記載します。

Jonathan Giles からのインタビューの日本語訳


今日から Azure で Java を利用、または開発している方々とのインタビューシリーズを開始しています。 すでに他にも何名ものインタビューを企画しているため、これをシリーズ化したいと考えています。私からインタビューを受けたい方は、私にご連絡ください。

最初のインタビューは、Java チャンピオンであり、JUG リーダーでもある寺田 佳央さんです。彼は日本マイクロソフトで働く Java エバンジェリストで、私と彼は Sun Microsystems と Oracle で共に働いていたので、以前から彼の事を知っていました。 寺田さんは Java に長くそして深く関わっていますので、彼とのインタビューを喜んでいます。どうぞ読者の皆様もお楽しみください。

こんにちは寺田さん – みなさんに自己紹介をしていただけないでしょうか?


このような素晴らしい機会を与えていただきありがとうございます。 私は 2015年7月から日本 マイクロソフト でJava Evangelist として働いています。また Japan Java Users Group の幹事メンバーの一人でもあります。

マイクロソフトに入社する前は、日本 Sun Microsystems で GlassFish エバンジェリストとして働いていました。 Oracle による Sun の買収後、日本 Oracle で Java/Java EE のエバンジェリストとして5年間働いていました。 日本 Oracle での私の仕事は、JavaOne Tokyo、Java Day Day Tokyo、Java ユーザーズ・グループのイベントなど、日本の多くの Java 関連のイベントで、企画、運営・管理、登壇などをしていました。そして、マイクロソフト入社後 2016 年 7 月、私は Java チャンピオンになりました。

あなたはしばらくの間マイクロソフトで勤めているんですね。私はちょうど 12 月にマイクロソフトに入社したばかりなので、私よりもとても長いですね。私たちは二人とも比較的にた経歴を持っています。私もSun Microsystems と Oracle で勤めていましたが、私は開発のエンジニアリング・チームに所属していました。
私はあなたにマイクロソフトにおける Java の印象について聞きたいです。そして Java に関して時間がたつにつれてマイクロソフトがどのように変わったのか教えていただけないでしょうか?

マイクロソフト入社前、私の経歴が Unix と Java に携わる事が多かったため、マイクロソフトで働くことを全く想像していませんでした。しかし、現在マイクロソフトはクラウドプラットフォームの企業になっています。そこで .NET や Windows、Office 製品だけでなく、Unix やその他のプログラミング言語も強く推進しています。 すでに Azure のシステムの 30% 以上が Linux 上で稼働しており、これらのシステムでは多くの顧客が Azure 上で Java を使用しています 。 たとえば、 Pivotal Cloud FoundryService FarbricOpenShiftKubernetes などがあります。Java 開発者が Azure でサービスを実行するための選択肢はたくさんあります 。

日本を拠点とするマイクロソフトのJavaエバンジェリストとしての日々どのような事をされているのですか?


最近は、Java のエバンジェリストとして、お客様のために多くの HackFest を開催しています。HackFest ではお客様が実際にビジネスをされている上でかかえる課題について直接改善してまいります。 お客様と NDA を締結した上で、お客様のソースコードにアクセスし、改善のためのアドバイスや直接ソースコードを編集する事もあります。いままでの経験を活かして、Azure におけるシステム運用方法や、アーキテクチャ設計に関するアドバイスなどを行います。

たとえば、最近ハックフェストを実施したとあるお客様では、オンプレミスで運用されている既存の Java Web アプリケーションを Azure 上のコンテナに移行したいと考えていらっしゃいました。当初、お客様は Kubernetes についてよくご存知ではなかったのですが、 HackFest を通じて Azure Container Service (AKS) の構築方法や、操作方法について情報を提供し、結果として、わずか5日間で既存のシステムを AKS に移行することができました。2日間で Lift & Shift し、残りの 3 日間で、ソースコードに手を加え、例えば Serverless の Azure Functions 等も試され、アプリケーションのモダナイズを行いました。HackFest では開発の視点だけでなく、運用的な観点からも助言しています。 その結果、そのお客様はこの HackFest の成果に非常に満足されていました。

この HackFest は、Azure をご利用される世界中の Java 開発者も利用できます。 読者のみなさまの中で Azure 上で Java を利用し、それを有効活用したい、そのために私のような Java エバンジェリストと緊密に会話したい場合は、私に連絡するか、各国に存在するエバンジェリストに HackFest についてお問い合わせください(※ 実際には HackFest を実施するためには利用可能なテクノロジー領域に条件があります)。 また私自身、マイクロソフトのグローバル組織に所属していますので、HackFest への参加のご要望をいただいた場合、国を問わず、北米、ヨーロッパ、ブラジルなど世界中のさまざまな場所に参加できるかもしれません。

Azure は Java(または Kotlin、Scala などの JVM 上の言語)を基盤とする開発者や組織に適していますか?


はい、Azure は Java 開発者にとって適しています。多くのサービスで Java SDK が用意され、開発は頻繁に行われています。 また一部のサービスでは SDK が存在しないものもありますが、Azure では多くのサービスが RESTful インターフェイスを提供しているため、任意のプログラミング言語からこれらのサービスにアクセスできるようになっています。たとえば、Office 365 をご利用されている場合は、REST 呼び出しで Office 365 を操作することも可能です。

おそらく、マイクロソフトであなたはいくつかのクールなデモやチュートリアルを時間をかけて作成してきたと思います。読者が興味をもちそうなプロジェクトや GitHub のレポジトリについてご紹介いただけないでしょうか?

すべてのデモやプロジェクトを公開しているわけではありませんが、私は GitHub リポジトリに多くのデモとサンプルをアップロードしています。

最新のデモには、多くの面白い最新技術を含んでいます(スライドはこちら)。 1回のデモに含めた Azure の技術要素として下記を含んでいます。

Azure の Bot Framework を利用して Slack からメッセージの送受信を行うチャット・ボットを作成しています。このチャット・ボットの処理の実装には、Serverless の「Azure Functions for Java」を利用しています。Slack から k8s の「アカウントサービスのポッド数を増やしてください」という質問を投げかけると、Azure Functions は LUIS を呼び出して、文を解析しどの意図(入力内容を判定)が最も適切かを判断します。その結果、Kubernetes 上で稼働するアカウントサービスのポッド数を増やします。

仮に「顧客サービスのポッド数を減らしてください」と入力すると、Kubernetes の「顧客サービス」は減少します。 このように、私はチャットボットから Azure のKubernetes を操作できるようにしています。

さらに Microsoft Translator のデモも行なっています。上記のチャット・ボットではテキストでの入力を行いましたが、このデモでは音声入力を行います。 たとえば、Microsoft Translator に対して「アカウントサービスのポッド数を増やしてください」または「顧客サービスのポッド数を減らしてください」と言葉で語りかけると、Azure 上の Kubernetes のポッド数が増減します。

上記のすべてを Java で実装し、Java 開発者が利用できる多くの Azure サービスを利用しています。

エバンジェリスト(または私のようなクラウド・デベロッパー・アドボケイト)は、開発者や利用者などとの対外的な会話と、社内開発チームとの会話のバランスをとることが重要です。 私はすべてのデベロッパー・アドボケイトがこの範囲で異なる優先順位を持っていると思います。私自身は、ドキュメント、APIの改善など、開発者の経験を向上させることに重点を置いています。あなたは、この範囲においてどこに優先順位を置いて仕事をなさっていますか?

私は開発者やお客様と直接会話をするのが好きです。もちろん、私は API を変更したりドキュメントを改善する必要がある場所を見つけることが多いので、必要に応じてやっています。ただ、まだ多くのお客様が CI/CD、マイクロサービス、Cognitive ServicesAzure FunctionsMicrosoft TranslatorIoTPowerBI などの利点についてご存知ないので、これらの技術を Java 開発者の皆様やお客様にその利点や利用方法や実装方法について紹介していきたいです。

昨今 Azure は非常に多くのサービスを提供し、その多くは本当に素晴らしいサービスです。 あなたが今より詳細に調査していることは特にありますか、全体的にあなたの好きなサービスは何ですか?

これはとても難しい質問です。なぜなら、マイクロソフトの技術と世界的な技術トレンドは以前と比べとても速く変化しているためです。 ちょうど今私が上で紹介したデモンストレーションは、現時点で私が好きな、そしてお勧めの技術から構成しています しかし、上記に取り上げた Kubernetes だけでなく、Pivotal Cloud FoundryOpenshift も非常に面白いです。

特に、お客様が巨大なデータセンターを所有されている場合は、 Azure Stack の利用をご検討いただくことをお勧めします。Pivotal Cloud Foundry も Azure Stack 上で動作します。運用における管理コストを削減したい場合、Azure Stack は選択肢の 1 つになります。

マイクロソフトは歴史的に Java の非サポートで知られていますが、最近はマイクロソフトが真にオープンソースに舵をきり大きな進歩を遂げたと思います。Java エンジニアと会話をしてAzure を紹介するとき、参加者の皆様の印象は如何でしょうか?

約2年半前、私は日本マイクロソフトに加わりました。当時すでに一部の開発者やエンジニアの中で、マイクロソフトの変化に気づいている方がいらっしゃいました。 しかしこの2年間で、私はマイクロソフトの印象がさらに変化していると感じています。私はお客様やコミュニティのメンバーとコミュニケーションをとるとき、ほとんどの人から肯定的なフィードバックをいただいています。

特に、AI 技術の観点でマイクロソフトについて多くの肯定的なフィードバックをいただいています。 build 2016 のカンファレンスで AI プロトタイプを発表したSatya Nadella の発表を見たとき、私は本当に感銘を受け、私の周りのすべてのJava開発者にビデオを共有しました。このビデオは、我々が将来を想像すると、エンジニアが世界を変える方法を示しました。本当に素晴らしい内容でした!Cognitive Services のすべてを Java アプリケーションから利用できることも重要です。

初めて他のエンジニアに Cognitive Services のデモンストレーションを行った際、多くの開発者が私もこれを試したいと言いました。 私はこの技術が世界を変えることができると思っていましたが、この技術が会社の将来をも変えることができると私は考えました。

インタビューのお時間をとっていただきありがとうございました。最後に、他にコミュニティの皆様にメッセージがあれば頂けないでしょうか?

私は過去2年間、マイクロソフトで働いており、多くのツール、テクノロジ、サービスが Java 開発者にとって利用できることを理解してきました。たとえばプログラマの皆様にとっては、Visual Studio Team Services(VSTS)はソースコード管理や運用を行うために、ぜひご利用いただきたいサービスです。CI/CD におけるビルドとデプロイのパイプラインを使用することができます。もちろん開発チームに応じて Jenkins のような他の CI/CDツール をご利用されたい場合もあるでしょう、この場合にも、VSTSからそれらのツールにアクセスできるようになっています。

またコンテナ技術をご利用されたい場合は、Web App for Container, Azure Container Service(AKS)Azure Container Instance(ACI)Pivotal Cloud FoundryOpenShift などのご利用のニーズに応じてコンテナ環境を構築できます。さらに、IoT、BigData、NoSQLなどをご利用したい場合は、マイクロソフトは、それらのサービスを提供しています。

私は、エンジニアが想像することができれば、エンジニアが世界を変えることができると信じています!そして私は、そのような素晴らしい Java の開発者の皆様とともに時間を過ごしたいと思います。 私は Java が大好きです!

2018年2月22日 at 8:30 AM 1件のコメント

Azure Functions for Java Preview Release

この度、San Francisco で開催された JavaOne 2017 で、Microsoft は Azure Functions の Java 版を Preview 版として公開しました。本エントリーでは、ちょとだけ試してみましたので、その内容をご紹介します。

Mac OS/X の環境で Azure Functions を動作させるためには下記の環境が必要です。環境が整っていない場合、インストール・実行が正しくできない場合があります。必要な環境にご注意ください。

Azure Functions のローカル実行環境のインストール
Local Execution Environment Install

$ sudo npm i -g azure-functions-core-tools@core --unsafe-perm
Password:

> azure-functions-core-tools@2.0.1-beta.18 uninstall /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools
> node lib/uninstall.js

deleting /Users/tyoshio2002/.azurefunctions/bin
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/func -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/azfun -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js
/Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/azurefunctions -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js

> azure-functions-core-tools@2.0.1-beta.18 postinstall /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools
> node lib/install.js

+ azure-functions-core-tools@2.0.1-beta.18
updated 1 package in 112.93s

次に、Maven コマンドで Azure Functions のプロジェクトを作成します。

$ mvn archetype:generate -DgroupId=com.yoshio3  -DinteractiveMode=false  -DartifactId=AzureFunctionTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test2
[INFO] Parameter: package, Value: com.yoshio3
[INFO] Parameter: groupId, Value: com.yoshio3
[INFO] Parameter: artifactId, Value: AzureFunctionTest
[INFO] Parameter: packageName, Value: com.yoshio3
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test2/AzureFunctionTest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.258 s
[INFO] Finished at: 2017-10-28T13:24:07+09:00
[INFO] Final Memory: 15M/223M
[INFO] ------------------------------------------------------------------------

プロンプト無しで Maven プロジェクトを作成したい場合の実行例:

mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DgroupId=com.yoshio3 -DartifactId=Java-Azure-Functions -Dversion=1.0-SNAPSHOT -Dpackage=com.yoshio3 -DappName=Java-Azure-Functions -DappRegion=westus2

デフォルトで Hello World のコードが生成されます。

package yoshio3.com;

import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.ExecutionContext;
import java.util.logging.Level;

/**
 * Hello function with HTTP Trigger.
 */
public class Function {
    @FunctionName("hello")
    public String hello(@HttpTrigger(name = "req", methods = {"get", "post"}, authLevel = AuthorizationLevel.ANONYMOUS) String req,
                        ExecutionContext context) {
        return String.format("Hello, %s!", req);
    }

このサンプル・コードをビルドします。

$ mvn clean package
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ azure-functions-test ---
[INFO] Deleting /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ azure-functions-test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ azure-functions-test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ azure-functions-test ---
[INFO] Surefire report directory: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Running yoshio3.com.FunctionTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.117 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ azure-functions-test ---
[INFO] Building jar: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions-test-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:package (package-functions) @ azure-functions-test ---
AI: INFO 06-10-2017 12:00, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 12:00, 1: Configuration file has been successfully found as resource
[INFO] 
[INFO] Step 1 of 6: Searching for Azure Function entry points
[INFO] Reflections took 101 ms to scan 1 urls, producing 1 keys and 2 values 
[INFO] 2 Azure Function entry point(s) found.
[INFO] 
[INFO] Step 2 of 6: Generating Azure Function configurations
[INFO] Generation done.
[INFO] 
[INFO] Step 3 of 6: Validating generated configurations
[INFO] Validation done.
[INFO] 
[INFO] Step 4 of 6: Saving empty host.json
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/host.json
[INFO] 
[INFO] Step 5 of 6: Saving configurations to function.json
[INFO] Starting processing function: Timer
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/Timer/function.json
[INFO] Starting processing function: hello
[INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/hello/function.json
[INFO] 
[INFO] Step 6 of 6: Copying JARs to staging directory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Copied successfully.
[INFO] Successfully built Azure Functions.
[INFO] 
[INFO] --- maven-resources-plugin:3.0.2:copy-resources (copy-resources) @ azure-functions-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 33.243 s
[INFO] Finished at: 2017-10-06T12:01:07-07:00
[INFO] Final Memory: 39M/564M
[INFO] ------------------------------------------------------------------------

ローカルで実行します。

$ mvn azure-functions:run
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:run (default-cli) @ azure-functions-test ---
AI: INFO 06-10-2017 09:13, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 09:14, 1: Configuration file has been successfully found as resource
[INFO] Azure Functions stage directory found at: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java
[INFO] Azure Functions Core Tools found.
[INFO] Starting running Azure Functions...

                  %%%%%%
                 %%%%%%
            @   %%%%%%    @
          @@   %%%%%%      @@
       @@@    %%%%%%%%%%%    @@@
     @@      %%%%%%%%%%        @@
       @@         %%%%       @@
         @@      %%%       @@
           @@    %%      @@
                %%
                %

[2017/10/06 16:14:30] Reading host configuration file '/Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/host.json'
[2017/10/06 16:14:31] Host configuration file read:
[2017/10/06 16:14:31] {
[2017/10/06 16:14:31] }
[2017/10/06 16:14:31] 
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Start Process: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java  -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 "/Users/tyoshio2002/.azurefunctions/bin/workers/Java/azure-functions-java-worker.jar" --host 127.0.0.1 --port 56034 --workerId c26685f3-cbd5-4bff-bbea-d3e9e00d08ed --requestId 4270cbeb-361f-422a-872a-c0ec946199c5
[2017/10/06 16:14:32] Generating 1 job function(s)
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[2017/10/06 16:14:32] Starting Host (HostId=yoshionomacbookpro-1392184404, Version=2.0.11308.0, ProcessId=65522, Debug=False, Attempt=0)
Listening on http://localhost:7071/
Hit CTRL-C to exit...

Http Functions:

	hello: http://localhost:7071/api/hello

info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Listening for transport dt_socket at address: 5005
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Microsoft Azure Functions Java Runtime [build 1.1-SNAPSHOT]
[2017/10/06 16:14:32] Found the following functions:
[2017/10/06 16:14:32] Host.Functions.hello
[2017/10/06 16:14:32] 
[2017/10/06 16:14:32] Job host started
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      [INFO] {com.microsoft.azure.webjobs.script.handler.MessageHandler.handle}: message generated by "class com.microsoft.azure.webjobs.script.rpc.messages.StartStream$Builder"
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      Worker initialized
info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0]
      94978bb8-3f21-47c7-961d-5d9caecc0136 - "/Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/azure-functions-test-1.0-SNAPSHOT.jar"::"yoshio3.com.Function.hello" loaded
[2017/10/06 16:16:27] Function started (Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)
[2017/10/06 16:16:27] Executing 'Functions.hello' (Reason='This function was programmatically called via the host APIs.', Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)
[2017/10/06 16:16:27] Function "94978bb8-3f21-47c7-961d-5d9caecc0136" executed
[2017/10/06 16:16:27] Function completed (Success, Id=a529fffb-fd7b-43d4-bd53-3283808f68ce, Duration=444ms)
[2017/10/06 16:16:27] Executed 'Functions.hello' (Succeeded, Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)

起動が完了したら、curl コマンドなどでアクセスしてみてください。

$ curl http://localhost:7071/api/hello -d "Java World"
Hello, Java World!

上記は、簡単な Hello World ですが他のトリガーを利用する場合は、下記のように local.settings.json ファイルに、AzureWebJobsStorage のアクセスキーを入力する必要があります。どうご注意ください。

local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=fileup;AccountKey=*******;EndpointSuffix=core.windows.net",
    "AzureWebJobsDashboard": ""
  }
}

たとえば、タイマーをトリガーに何らかの処理をしたい場合、下記のようなコードを書きます。

    @FunctionName("Timer")
    public String functionHandler(@TimerTrigger(name = "timerInfo", schedule = "*/30 * * * * *") String timerInfo, final ExecutionContext executionContext) {
        executionContext.getLogger().log(Level.INFO, "Timer trigger input: {0}", timerInfo);
        return "From timer: \"" + timerInfo + "\"";
    } 

ローカルで検証が終わったので、Microsoft Azure へデプロイします。

$ mvn azure-functions:deploy
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building Azure Java Functions 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-functions-maven-plugin:0.1.4:deploy (default-cli) @ azure-functions-test ---
AI: INFO 06-10-2017 12:31, 1: Configuration file has been successfully found as resource
AI: INFO 06-10-2017 12:31, 1: Configuration file has been successfully found as resource
[INFO] Starting deploying to Function App function-test-java...
[INFO] Authenticate with Azure CLI 2.0
[INFO] --> POST https://login.microsoftonline.com/********-****-****-****-**********/oauth2/token
[INFO] 1178-byte body:
client_id=04b07795*******
[INFO] --> END POST
[INFO] <-- 200 OK https://login.microsoftonline.com/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/token (833 ms, 2907-byte body)
[INFO] Cache-Control: no-cache, no-store
[INFO] Content-Length: 2907
[INFO] Content-Type: application/json; charset=utf-8
[INFO] Date: Fri, 06 Oct 2017 19:31:31 GMT
[INFO] Expires: -1
[INFO] P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
[INFO] Pragma: no-cache
[INFO] Server: Microsoft-IIS/8.5
[INFO] Set-Cookie: esctx=AQABAAAAAAABlDrqfEFlSaui6xnRjX5E6ugjSSC5bAEQSJ1V_VvTv2HB9o-5-******;; domain=.login.microsoftonline.com; path=/; secure; HttpOnly, x-ms-gateway-slice=004; path=/; secure; HttpOnly, stsservicecookie=ests; path=/; secure; HttpOnly
[INFO] Strict-Transport-Security: max-age=31536000; includeSubDomains
[INFO] X-Content-Type-Options: nosniff
[INFO] x-ms-request-id: 4813f784-046f-414e-8d9e-29a4e43e3c00
[INFO] X-Powered-By: ASP.NET
[INFO] 2907-byte body:
{"token_type":"Bearer","scope":"user_impersonation","expires_in":"3599","ext_expires_in":"0","expires_on":"1507321891","not_before":"1507317991","resource":"https://management.core.windows.net/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkhIQnlLVS0wRHFBcU1aaDZaRlBkMlZXYU90ZyIsImtpZCI6IkhIQnlLVS*********
[INFO] <-- END HTTP
[INFO] Target Function App does not exist. Creating a new Function App ...
[INFO] Successfully created Function App function-test-java
[INFO] 
[INFO] Step 1 of 4: Creating ZIP package...
[INFO] Successfully saved ZIP package at /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java.zip
[INFO] 
[INFO] Step 2 of 4: Uploading ZIP package to Azure Storage...
[INFO] Successfully uploaded ZIP package to https://d0a43c4e4c4a435d9f25.blob.core.windows.net/java-functions-deployment-packages/function-test-java.20171006123210784.zip
[INFO] 
[INFO] Step 3 of 4: Deploying Function App with package...
[INFO] Azure Resource Manager read/write per hour limit reached. Will retry in: 5 seconds
[INFO] Successfully deployed Function App with package.
[INFO] 
[INFO] Step 4 of 4: Deleting deployment package from Azure Storage...
[INFO] Successfully deleted deployment package function-test-java.20171006123210784.zip
[INFO] Successfully deployed Function App at https://function-test-java.azurewebsites.net
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:01 min
[INFO] Finished at: 2017-10-06T12:33:00-07:00
[INFO] Final Memory: 42M/488M
[INFO] ------------------------------------------------------------------------

デプロイが完了したのち、Azure の Portal 画面を確認して正しくデプロイされている事、そしてアクセスするための URL を確認します。

Azure にデプロイした URL へアクセスしてみます。

$ curl https://function-test-java.azurewebsites.net/api/hello -d "Java World"
Hello, Java World!

ローカルで実行したのと同様に、正しく実行する事ができました。
より詳細な情報は、Azure Functions Java developer guide
に記載されています。

ぜひ、みなさまお試しください!!

2017年10月7日 at 4:46 AM

2017年度版:Java サーバの利用状況のアンケートのお願い

サーバ・サイド Java の開発・運用に携わっていらっしゃる方に質問がございます。現在、サーバ・サイドのJava 開発環境もしくは本番環境で、どのサーバ (Webコンテナ、アプリケーション・サーバ)をご利用いただいているか理解したいと考えております。そこで、大変恐れ入りますが下記のアンケートにご協力いただけないでしょうか。

昨年 (2016年) は、669名の方にご協力いただきました。ご協力誠にありがとうございました。
2016年版:Java サーバ利用状況アンケート結果の公開

今年のアンケートの締め切りは 7/12(水) 18:00 までとさせていただきます。
昨年も1週間のアンケート期間だったため、公平をきすためにも同じ1週間で実施いたします。また、速報は同日開催する「関ジャバのナイトセミナー」で発表します。

複数ご回答いただいてもかまいません。個人情報は取得しませんし、この結果を売買に使うことも決してありません。利用状況について正しく把握することで、現在のサーバ・サイドのトレンドについて理解できるとともに、結果を本ブログで公開することで他の皆様にも有用な情報になるのではないかと想定しております。締め切り後に、再利用可能な結果(順位、投票数、パーセント)として公開します。

また、上記で「組み込みコンテナ(実行可能 jar)に移行済み」と回答した方のうち、どのフレームワークへ移行したかを教えていただけないでしょうか?移行していない場合は、下記にはお答えいただかなくて結構です。

本データは、日本全体における利用状況の実データにはならないと思いますし、市場調査会社がだす結果とは異なると思いますが、それでも Java コミュニティ参加者や、本ブログをご覧いただいている皆様の近辺のデータを集めることができるのではないかと想定しております。また、昨年のデータとの比較もできるかと思います。この1年で日本の状況は変わっているのでしょうか?とても楽しみにしています。

※ これは#てらだよしお 個人的なお願い事であり、所属企業や団体からの問い合わせではないことをご理解いただければ誠に幸いです。

2017年7月5日 at 8:00 AM

皆んな大好き Excel !! Excel REST API Java サンプルアプリケーション

2016 年 8 月初旬 Office 365 の Excel REST API が正式にリリースしました。
アナウンス:「Announcing the general availability of the Microsoft Excel API to expand the power of Office 365

上記により、Graph API と呼ばれる REST API を使用して、Office 365 の OneDrive に存在する Excel ファイルを操作できるようになります。
Excel 操作用の Graph API

※ REST API で利用できるため、プログラミング言語を問わず任意の言語で操作ができるようになっていますので、Java 以外のプログラミング言語でもどうぞお試しください。

今回、私は上記の REST API を利用して Java のサンプル・コードを作成しました。
サンプル・コード:「GitHub : Office-365-Excel-REST-API-for-Java」
またサンプル・コードがどのように動作するのかをわかりやすくするため、サンプル・アプリケーションのデモ動画も撮りましたので、どうぞ下記のデモ動画もご覧ください。

今回作成したサンプル・アプリケーションは Java EE 7 のアプリケーションとして作成しました。そこで、Java EE 準拠のアプリケーション・サーバであれば、いずれの環境でも動作します。私は、Payara Server 4.1.1.162 (GlassFish) で動作確認をしていますが、少しの変更を行うだけで、アプリケーション・サーバではなく、Servlet Container(Tomcat/Jetty) でも動かすことができます。

追記:
Office 365 を無料でお試しいただく為の設定手順 (ステップ・バイ・ステップの画面ダンプ) や Tomcat 用の設定方法に関しては 「GitHub : README.md もしくは README-4-Tomcat.md」に記載しています。

アプリケーションの実装の詳細
このサンプル・アプリケーションは Java EE 7 で実装しています。

まず、GUI (フロントエンド) のビュー・テクノロジーとして JavaServer Faces (PirmeFaces) を利用しています。しかし、フロント技術はこのサンプルでは重要でありません。慣れ親しんだフロント・テクノロジーをご利用ください。

実際の、Excel 操作の要は、com.yoshio3.restclient パッケージ配下で実装しています。
特に com.yoshio3.restclient.services サービスが重要で、Excel REST API で用意されている各種機能(REST 呼び出し)をラッピングしたメソッドを実装しています。
また、Excel REST API のリクエスト・ボディ、もしくはレスポンス・ボディに含む JSON のデータは、すべて com.yoshio3.restclient.jaxb.entities パッケージ配下のクラスにマッピングしています。例えば、Excel のワーク・シートやテーブルを取得した際に取得できる情報はすべて com.yoshio3.restclient.jaxb.entities.excel パッケージに含まれています。このマッピングした Java オブジェクトを操作することで、実際の JSON データを意識せずにプログラムができます。

また、Office 365 に接続するためには、Azure Active Directory で認証を行う必要があります。今までは、「Microsoft Azure Active Directory Authentication Library (ADAL) for Java」を利用してきました。しかし、今回 Azure AD で認証を行うために必要最低限の軽量な Servlet Filter (AzureADAuthServletFilter) を独自に実装しました。

Servlet Filter : AzureADAuthServletFilter.java
アクセス・トークン:AccessToken.java
Auth サービス: OAuth2Service.java

まだ一部実装が足りない部分(TODO)はありますが、Azure AD の認証のフローをご理解頂く上で、このサーブレット・フィルタはご参考いただけるのではないかと思います。また、Servlet Filter なので認可はできませんが、Tomcat/Jetty のような Servlet Container でも動作します。認可が必要な方は、以前作成した「Azure AD 認証・認可サンプル」をご参照ください。

Java ユーザの皆様も、Office 365 の OneDrive に存在する Excel ファイルを直接 Java から操作してみませんか?

Have fan Excel with Java !!

2016年8月31日 at 8:00 AM

Microsoft Azure IoT Hub with Java

Microsoft Azure の IoT Hub が Java でも利用できるということで試しました。Microsoft Azure の IoT Hub に関する詳細な説明はこちらをご参照ください。

Azure IoT Hub とは
IoT Hub と Event Hubs の比較

私がはまったのは1点で、「Device ID」をどうやって作るかという点でしたが、そこも下記にくわしく手順を記載します。

1. 最初に、Microsoft Azure の管理ポータルにアクセスし、新規から IoT Hub を作成します。
  Microsoft Azure の管理ポータルへアクセス

「参照 >」から「IoT Hub プレビュー」を選択します。

「新規」ボタンを押下すると、下記の画面が表示されますので「Name」に名前を入力し、利用する規模に応じて価格やプランを選択してください。

次に、リソース・グループ名を新規に作成し、ロケーションとして「東アジア」を選択し最後に「作成」ボタンを押下してください。

2. Windows 環境で DeviceExplorer をインストール
Azure IoT SDKsのサイトにアクセスし、DeviceExplorer のインストーラを入手してください。Windows 環境用に用意されている「SetupDeviceExplorer.msi」をダウンロードします (このリンクから入手できる版は 2015-11-30 版です、最新版はAzure IoT SDKsから入手してください)。

ファイルを入手後、入手したファイル(インストーラ)をクリックしてインストーラを起動してください。

次に、インストール場所や利用者を指定し「Next >」ボタンを押下します。

確認画面が表示されますので、「Next>」ボタンを押下します。

ユーザアカウント制御の確認画面が表示されますので、「はい(Y)」を押下してインストールをはじめてください。

インストールが完了すると下記の画面が表示されますので「Close」ボタンを押下してください。

インストールが完了すると Windows 10 の場合、メニューから「最新追加されたもの」の欄から実行できることを確認できます。

3. Device Explorer から Device ID と接続用文字列を作成

メニューから DeviceExplorer を起動してください。起動すると下記の画面が表示されます。

ここで、DeviceExplorer から Microsoft Azure の IoT Hub に接続し操作できるように、Azure 上で接続用の情報を確認し取得します。Microsoft Azure の管理ポータルに接続し、作成した IoT Hub のサービスを参照してください。

IoT Hub サービスを参照すると「Settings」というボタンがあるので押下します。

「Settings」ボタンを押下すると「Shared access policies」のリンクがあるので選択してください。

「Shared access policies」の POLICY から「iothubowner」を選択してください。
選択すると「Connection string—primary key」の欄があります。記載内容をクリップ・ボードへコピーできるようにコピー・ボタンが右端に用意されていますので、これをクリックしてコピーしてください。

クリップ・ボードへ文字列がコピーされると「コピー済み」と表示されます。

文字列をコピーしたのち、Device Explorer に戻り、文字列を貼り付けてください。

文字列をコピーしたのち、「Update」ボタンを押下してください。正しく設定が更新されると「Settings updated successfully」という画面が表示されます。

続いて、Device Explorer のタブから「Management」を選択し「Create」ボタンを押下してください。

ボタンを押すと、下記の画面が表示されますので、「Device ID」欄にデバイス固有の名前を入力し「Create」ボタンを押下してください。(Primary Key,Secondary Keyは自動的にキーの文字列が入力されています。)

ボタンを押下すると下記の画面が表示されますので「Done」ボタンを押下してください。

デバイス ID を作成すると一覧に1行が追加されます。ここで、追加された行をマウスで右クリックしてください。すると、選択メニューが表示されますので、「Copy connection string for selected device」を選択して接続用の文字列をコピーしてください。

コピーして作成された、接続用の文字列の例は下記のような文字列です。この文字列は後からのプログラム内で記述する必要があります。そこで、この文字列を一時的にテキストファイルなどに保管しておいてください。

HostName=HOSTNAME.azure-devices.net;DeviceId=DEVICE-ID;SharedAccessKey=Wf0o****************************************

※ 補足:Device Explorer の詳しい使い方は下記に記載されていますので、こちらもご確認ください。
How to use Device Explorer for IoT Hub devices

4. Microsoft Azure IoT Hub サンプルコードの作成

それでは、プログラムを組むための環境設定や準備が整いましたので、実際にプログラムを書いてみましょう。本サンプル・アプリケーションは、基本的にこちらに記載されている内容を実際に動作させた物です。
※ 本記事の目的は、IoT Hub の設定方法を説明するのがメインのため、コードの詳細にまでは触れず、MS 社員のどなたかが作成したコードをそのまま記載しています。しかし、この一連の設定ができると色々と面白いことができるので、まずは基本的な手順を理解してください。

Maven の pom ファイルは下記のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yoshio3</groupId>
    <artifactId>Azure-IoT-Hub</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <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>
        <maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.microsoft.azure.iothub-java-client</groupId>
            <artifactId>iothub-java-client</artifactId>
            <version>1.0.0-preview.7</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <finalName>${project.artifactId}-${project.version}</finalName>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.yoshio3.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Java のサンプル・ソースコードはこちらになります。

package com.yoshio3;

import com.microsoft.azure.iothub.DeviceClient;
import com.microsoft.azure.iothub.IotHubClientProtocol;
import com.microsoft.azure.iothub.Message;
import com.microsoft.azure.iothub.IotHubStatusCode;
import com.microsoft.azure.iothub.IotHubEventCallback;
import com.microsoft.azure.iothub.IotHubMessageResult;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Scanner;


public class Main {

    protected static class EventCallback
            implements IotHubEventCallback {

        @Override
        public void execute(IotHubStatusCode status, Object context) {
            Integer i = (Integer) context;
            System.out.println("IoT Hub responded to message " + i.toString()
                    + " with status " + status.name());
        }
    }

    protected static class MessageCallback
            implements com.microsoft.azure.iothub.MessageCallback {

        @Override
        public IotHubMessageResult execute(Message msg,
                Object context) {
            System.out.println(
                    "Received message with content: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));

            return IotHubMessageResult.COMPLETE;
        }
    }

    public static void main(String... args) throws IOException, URISyntaxException {
        //Device Explorer で作成してコピーした接続用の文字列をここに記載
        String connString = "HostName=HOSTNAME.azure-devices.net;DeviceId=DEVICE-ID;SharedAccessKey=Wf0o****************************************";


        IotHubClientProtocol protocol = IotHubClientProtocol.AMQPS;

        DeviceClient client = new DeviceClient(connString, protocol);

        MessageCallback messageCallback = new MessageCallback();
        client.setMessageCallback(messageCallback, null);
        client.open();

        for (int i = 0; i < 10; ++i) {
            String msgStr = "Event Message " + Integer.toString(i);
            try {
                Message msg = new Message(msgStr);
                msg.setProperty("messageCount", Integer.toString(i));
                System.out.println(msgStr);
                EventCallback eventCallback = new EventCallback();
                client.sendEventAsync(msg, eventCallback, i);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        System.out.println("Press any key to exit...");
        Scanner scanner = new Scanner(System.in);
        scanner.nextLine();

        client.close();
    }
}

念のため、Maven プロジェクトは Git Hub にもあげておきます。上記をベースに、Microsoft Azure IoT Hub Java Client 1.0.0-preview.7 API を参照しながらプログラムを作ってみてください。

5. デバイスでプログラム実行
プログラムをビルド後、下記のコマンドを IoT デバイス上で実行してください。

# java -jar Azure-IoT-Hub-1.0-SNAPSHOT.jar

実行すると、下記のようなメッセージが表示されます。

$ java -jar Azure-IoT-Hub-1.0-SNAPSHOT.jar
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory getClass
警告: unable to load org.bouncycastle.openssl.PEMReader
12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory getClass
警告: unable to load org.bouncycastle.openssl.PasswordFinder
12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory
警告: unable to load bouncycastle provider
Event Message 0
Event Message 1
Event Message 2
Event Message 3
Event Message 4
Event Message 5
Event Message 6
Event Message 7
Event Message 8
Event Message 9
Press any key to exit…
IoT Hub responded to message 5 with status OK_EMPTY
IoT Hub responded to message 4 with status OK_EMPTY
IoT Hub responded to message 7 with status OK_EMPTY
IoT Hub responded to message 2 with status OK_EMPTY
IoT Hub responded to message 3 with status OK_EMPTY
IoT Hub responded to message 6 with status OK_EMPTY
IoT Hub responded to message 1 with status OK_EMPTY
IoT Hub responded to message 9 with status OK_EMPTY
IoT Hub responded to message 0 with status OK_EMPTY
IoT Hub responded to message 8 with status OK_EMPTY


参考:
Microsoft Azure IoT device SDK for Java

IoT Kit ハンズオン トレーニング 初めの一歩モノの接続からデータ分析まで by @embedded_george

最後に、今回は実戦的なアプリまでは作成しませんでしたが、上記をベースに Raspberry Pi や LEGO Mindstorms 上にプログラムを配置し、Azure 上にデータを配信したり、Azure から各種デバイスを操作したりできるようになりますね。

Let’s enjoy IoT with Java on Azure !!

2015年12月15日 at 5:24 PM 1件のコメント

Microsoft Java DevOps ハッカソン@JJUG CCC 2015


JJUG CCC 2015 Fall が2015年 11月 28日 (土) にベルサール新宿グランド(東京都新宿区西新宿8-17-3 住友不動産新宿グランドタワー) で開催されます。

今回、日本マイクロソフト株式会社は JJUG CCC にプラチナ・スポンサーとして参加し、Java の開発者と運用者による DevOps ハッカソンを2日間で実施します。このハッカソンは過去2度程実施していますが、いずれの参加者も参加してよかった他の方にもぜひお勧めしたいといわれている、とても有意義なハッカソンです(下記の参加レポートをご参照)。
みなさま、Microsoft Azure のプラットフォーム上で、 Jenkins や今はやりの Docker などを利用して 継続的インテグレーションやデリバリ(CI や CD)を体感してみませんか?今回は、JJUG との共催という事で、開発者は Java デベロッパーのみなさまが対象となります。

参加のご登録はコチラから
 ■ 開発者の方はコチラ
 ■ インフラ技術者の方はコチラ

( ※ 参加可能な人数に限りがあるため、JJUG CCC の参加登録とは別途、登録サイトをご用意しています。JJUG CCC の参加登録はコチラから行ってください。)



ご案内文
DevOps はソフトウエアデリバリのライフサイクルを早める考え方で、短期間で開発、 運用を繰り返し、一日に5 回以上新しいサービスをリリースする企業も出てくるなど、DevOps のビジネス価値、効果は昨今たいへん注目されています。      

しかし DevOps が何を指すのかは人やベンダーによって言うことがまちまちで、その多くはツールのみの話に終始していますが、ツールは DevOps の要素のひとつであり、実際は人、プロセス、さまざまな要素が関係します。      

アプリケーション開発者、そしてインフラ技術者でチームを構成し、DevOps のプラクティスを適用して、Infrastructure as Code の自動化技術を使いながら本物のDevOps が体験できるイベントを企画しました。

ぜひ奮ってご参加ください。


過去に開催した DevOps ハッカソンの参加レポートは下記にリンクしています。
● メディアの記事
http://codezine.jp/article/detail/8944
http://www.atmarkit.co.jp/ait/articles/1509/10/news168.html

● 参加者のブログ
http://heartbeats.jp/hbblog/2015/09/microsoft-devops-hackathon.html
http://couger.hatenablog.com/entry/2015/09/06/213104
http://blog.modd.com/entry/2015/09/07/151421
http://changesworlds.com/2015/09/devops-hackathon-day-2-done/
http://newscentral.exsees.com/item/2e7e6c6899c626e2baddb7cdeaaed62d-d28352a527a1d995287ddd23891859aa

参加のご登録はコチラから
 ■ 開発者の方はコチラ
 ■ インフラ技術者の方はコチラ

2015年11月6日 at 2:48 PM

過去の投稿


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2020年4月
 12345
6789101112
13141516171819
20212223242526
27282930  

カテゴリー

Twitter

clustermap

ブログ統計情報

  • 1,176,052 hits

RSSフィード

アーカイブ