そごうソフトウェア研究所

SOA、開発プロセス、ITアーキテクチャなどについて書いています。Twitterやってます@rsogo

Hiveでデータベースを準備する

前にMac上にセットアップした環境にHiveで環境を作っていきます。

begirama.hatenablog.com

Hiveデータベースを作成

データベースを確認する

hive> show databases;
show databases
OK
default
Time taken: 0.567 seconds, Fetched: 1 row(s)

データベースを作成

hive> create database testdb;
create database testdb
OK
Time taken: 0.253 seconds
hive> show databases;
show databases
OK
default
testdb
Time taken: 0.074 seconds, Fetched: 2 row(s)

データベースを選択

hive> use testdb;
use testdb
OK
Time taken: 0.018 seconds

Hiveテーブルを作成

テーブルを確認する

hive> show tables;
show tables
OK
Time taken: 0.211 seconds

テーブルを作成

hive> CREATE TABLE pokes (foo INT, bar STRING);
CREATE TABLE pokes (foo INT, bar STRING)
OK
Time taken: 0.581 seconds
hive> show tables;
show tables
OK
pokes
Time taken: 0.075 seconds, Fetched: 1 row(s)

作成したテーブル定義を確認

hive> describe pokes;
describe pokes
OK
foo                     int                                         
bar                     string                                      
Time taken: 0.588 seconds, Fetched: 2 row(s)

MacにHadoopとHiveをセットアップする

MuleからHadoopに接続するのが目的です。 今回はHadoopをセットアップしたいと思います。

http://hadoop.apache.org/images/hadoop-logo.jpg

環境

OS X El Capitan 10.11.6

リモートログインをONにしておきます。 f:id:begirama:20160919224451p:plain

Hadoop

install

brew install hadoop

HADOOP_HOMEは/usr/local/Cellar/hadoop/2.7.1/libexecでした。

export HADOOP_HOME=/usr/local/Cellar/hadoop/2.7.1/libexec

設定ファイルの変更

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
       <name>fs.defaultFS</name>
       <value>hdfs://localhost:9000</value>
    </property>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

フォーマット

hadoop namenode -format
$ hadoop namenode -format
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
16/09/19 18:56:23 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = ryohei-no-macbook-pro.local/192.168.11.5
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 2.7.1
STARTUP_MSG:   classpath = 略
STARTUP_MSG:   build = https://git-wip-us.apache.org/repos/asf/hadoop.git -r 15ecc87ccf4a0228f35af08fc56de536e6ce657a; compiled by 'jenkins' on 2015-06-29T06:04Z
STARTUP_MSG:   java = 1.8.0_45
************************************************************/
16/09/19 18:56:23 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]
16/09/19 18:56:23 INFO namenode.NameNode: createNameNode [-format]
16/09/19 18:56:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Formatting using clusterid: CID-2c03a33c-9032-4af1-a0d8-195f92730991
16/09/19 18:56:24 INFO namenode.FSNamesystem: No KeyProvider found.
16/09/19 18:56:24 INFO namenode.FSNamesystem: fsLock is fair:true
16/09/19 18:56:24 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000
16/09/19 18:56:24 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true
16/09/19 18:56:24 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec is set to 000:00:00:00.000
16/09/19 18:56:24 INFO blockmanagement.BlockManager: The block deletion will start around 2016 9 19 18:56:24
16/09/19 18:56:24 INFO util.GSet: Computing capacity for map BlocksMap
16/09/19 18:56:24 INFO util.GSet: VM type       = 64-bit
16/09/19 18:56:24 INFO util.GSet: 2.0% max memory 889 MB = 17.8 MB
16/09/19 18:56:24 INFO util.GSet: capacity      = 2^21 = 2097152 entries
16/09/19 18:56:24 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false
16/09/19 18:56:24 INFO blockmanagement.BlockManager: defaultReplication         = 1
16/09/19 18:56:24 INFO blockmanagement.BlockManager: maxReplication             = 512
16/09/19 18:56:24 INFO blockmanagement.BlockManager: minReplication             = 1
16/09/19 18:56:24 INFO blockmanagement.BlockManager: maxReplicationStreams      = 2
16/09/19 18:56:24 INFO blockmanagement.BlockManager: shouldCheckForEnoughRacks  = false
16/09/19 18:56:24 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000
16/09/19 18:56:24 INFO blockmanagement.BlockManager: encryptDataTransfer        = false
16/09/19 18:56:24 INFO blockmanagement.BlockManager: maxNumBlocksToLog          = 1000
16/09/19 18:56:24 INFO namenode.FSNamesystem: fsOwner             = rsogo (auth:SIMPLE)
16/09/19 18:56:24 INFO namenode.FSNamesystem: supergroup          = supergroup
16/09/19 18:56:24 INFO namenode.FSNamesystem: isPermissionEnabled = true
16/09/19 18:56:24 INFO namenode.FSNamesystem: HA Enabled: false
16/09/19 18:56:24 INFO namenode.FSNamesystem: Append Enabled: true
16/09/19 18:56:24 INFO util.GSet: Computing capacity for map INodeMap
16/09/19 18:56:24 INFO util.GSet: VM type       = 64-bit
16/09/19 18:56:24 INFO util.GSet: 1.0% max memory 889 MB = 8.9 MB
16/09/19 18:56:24 INFO util.GSet: capacity      = 2^20 = 1048576 entries
16/09/19 18:56:24 INFO namenode.FSDirectory: ACLs enabled? false
16/09/19 18:56:24 INFO namenode.FSDirectory: XAttrs enabled? true
16/09/19 18:56:24 INFO namenode.FSDirectory: Maximum size of an xattr: 16384
16/09/19 18:56:24 INFO namenode.NameNode: Caching file names occuring more than 10 times
16/09/19 18:56:24 INFO util.GSet: Computing capacity for map cachedBlocks
16/09/19 18:56:24 INFO util.GSet: VM type       = 64-bit
16/09/19 18:56:24 INFO util.GSet: 0.25% max memory 889 MB = 2.2 MB
16/09/19 18:56:24 INFO util.GSet: capacity      = 2^18 = 262144 entries
16/09/19 18:56:24 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033
16/09/19 18:56:24 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes = 0
16/09/19 18:56:24 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension     = 30000
16/09/19 18:56:24 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.window.num.buckets = 10
16/09/19 18:56:24 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.num.users = 10
16/09/19 18:56:24 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.windows.minutes = 1,5,25
16/09/19 18:56:24 INFO namenode.FSNamesystem: Retry cache on namenode is enabled
16/09/19 18:56:24 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis
16/09/19 18:56:24 INFO util.GSet: Computing capacity for map NameNodeRetryCache
16/09/19 18:56:24 INFO util.GSet: VM type       = 64-bit
16/09/19 18:56:24 INFO util.GSet: 0.029999999329447746% max memory 889 MB = 273.1 KB
16/09/19 18:56:24 INFO util.GSet: capacity      = 2^15 = 32768 entries
16/09/19 18:56:24 INFO namenode.FSImage: Allocated new BlockPoolId: BP-816378738-192.168.11.5-1474278984811
16/09/19 18:56:24 INFO common.Storage: Storage directory /tmp/hadoop-rsogo/dfs/name has been successfully formatted.
16/09/19 18:56:25 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
16/09/19 18:56:25 INFO util.ExitUtil: Exiting with status 0
16/09/19 18:56:25 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at {Dummy}
************************************************************/

start-all.shで起動

$ $HADOOP_HOME/sbin/start-dfs.sh 
start-all.sh 
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
16/09/19 22:36:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [localhost]
Password:
localhost: starting namenode, logging to /usr/local/Cellar/hadoop/2.7.1/libexec/logs/hadoop-rsogo-namenode-Ryohei-no-MacBook-Pro.local.out
localhost: Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Password:
localhost: starting datanode, logging to /usr/local/Cellar/hadoop/2.7.1/libexec/logs/hadoop-rsogo-datanode-Ryohei-no-MacBook-Pro.local.out
localhost: Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Starting secondary namenodes [0.0.0.0]
Password:
0.0.0.0: starting secondarynamenode, logging to /usr/local/Cellar/hadoop/2.7.1/libexec/logs/hadoop-rsogo-secondarynamenode-Ryohei-no-MacBook-Pro.local.out
0.0.0.0: Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
16/09/19 22:37:36 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
starting yarn daemons
starting resourcemanager, logging to /usr/local/Cellar/hadoop/2.7.1/libexec/logs/yarn-rsogo-resourcemanager-Ryohei-no-MacBook-Pro.local.out
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Password:
localhost: starting nodemanager, logging to /usr/local/Cellar/hadoop/2.7.1/libexec/logs/yarn-rsogo-nodemanager-Ryohei-no-MacBook-Pro.local.out
localhost: Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

バージョンチェック

$ hadoop version
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Hadoop 2.7.1
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 15ecc87ccf4a0228f35af08fc56de536e6ce657a
Compiled by jenkins on 2015-06-29T06:04Z
Compiled with protoc 2.5.0
From source with checksum fc0a1a23fc1868e4d5ee7fa2b28a58a
This command was run using /usr/local/Cellar/hadoop/2.7.1/libexec/share/hadoop/common/hadoop-common-2.7.1.jar

stop-all.shで停止

$ $HADOOP_HOME/sbin/stop-all.sh 
This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
16/09/19 22:34:25 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Stopping namenodes on [localhost]
Password:
localhost: stopping namenode
Password:
localhost: stopping datanode
Stopping secondary namenodes [0.0.0.0]
Password:
0.0.0.0: stopping secondarynamenode
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
16/09/19 22:34:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
stopping yarn daemons
stopping resourcemanager
Password:
localhost: stopping nodemanager
no proxyserver to stop

Hive

install

$ brew install hive

起動

動作確認してデータベース一覧を表示できればOK。

$ hive
hive> show databases;
show databases
OK
default

Google I/O 2016。Keynote自分まとめ。Machine Learning、Google Home、Allo、Duo、Android N

Keynoteのライブ、見終わりました。

ここで録画が見られます。 www.youtube.com

Keynoteのメッセージの中心にはマシンラーニングがあったのかなと思います。 AlphaGoのようなマシンラーニングを活かすために、Google Assistantと、Assistantにテキストや、声でコミュニケーションするためのプロダクトが発表されました。

Google Home

Amazon Echoみたいなやつ。 f:id:begirama:20160519042558p:plain

家の中に置いておいて、声でGoogle Assistantに指示が出せます。

デモ中であったのは、「OK Google」って言って、音楽をかけたり(家中のスピーカーにも出力できる!)、宇宙について調べたり、スケジュールを変更したり。

リアルにどこまで使えるかやってみたい。 そのうち、Google Homeと連携するものを開発するためのツールが提供されるとのこと。

Google製メッセージアプリ「Allo」、ビデオチャットアプリ「Duo」

どちらもGoogleが出す、コミュニケーションアプリです。

  • Allo f:id:begirama:20160519043907p:plain 普通のメッセージアプリにない機能としては、ユーザーの振る舞いを学習して、相手の会話への回答の候補を出してくれます。それでよければ、タップして選ぶだけ。面白かったのが、相手が送ってきた犬の写真に対して、画像解析して、テキストへの返信と同じように「Cute dog!」などの回答候補がでること。

デモではチャットでレストランの予約をとっていました。 これも予約するためのプラットフォームに参加するお店がどのくらい日本で増えるかな。

個人的には、メッセージのフロントはLINEとか、FacebookメッセージやSlackなどなんでも良くって、後ろでGoogle Assistantが動いてて、会話のサジェスチョンもしてくれるし、レストランも予約してくれるってアーキテクチャがいいな。 きっとbotフレームワークもでるよね。

  • Duo f:id:begirama:20160519045543p:plain 娘さんのダンスが可愛いね。 電話をかけると、受ける方は取る前に相手の動画を見られる。誰かが家のインターフォンみたいなかんじだねって言ってた。確かに。

ハングアウトはどうなるんだろ。

Androidについて

Android Wear 2.0

これまでスマートフォンを母艦としないと何もできませんでしたが、スタンドアローンでいくつかの機能が動くようです。スタンドアローンで何ができて、何ができないのか、詳細はWearのセッションを楽しみにしたいと思います。

Android N

Android N自体は以前から発表されているので、知っている人は知っているという感じでした。 ここから誰でもNの名前を投票できるって。 Help name Android N

DaydreamっていうVRの仕組みでは、Android Nが前提となっているようです。

Android Studio 2.2

既にプレビュー版がダウンロード可能になっています。 Layout Designerが新しくなるみたいです。XCodeなみにUIの開発が楽になれば・・・。

Android Instant App

インストールしないNativeアプリ。このあたり眠くて記憶がない。

Introducing Android Instant Apps | Android Developers Blog

Android Instant Apps | Android Developers

Firebase2.0

Androidとは直接関係ないけど、バックエンドサービスのFirebaseにも触れていました。

Google I/O 2016 Live有りAndroidセッションまとめ

いよいよGoogle I/Oが今年も始まりますね。

events.google.com

ライブストリーミングがある予定の、Android関連セッションのうち、私が興味があるものをリストアップしてみました。 ちなみに私が興味があるのはAndroidの最新情報の概要と、AndroidアプリのUI、UX、アーキテクチャです。あと、Wearはどうなるのか?

May 18

キーノート

まずはキーノート。Androidについても何かしら発表があるでしょう。 goo.gl

What's new in Android" at #io16:

初日のキーノートの後は、Androidの最新情報のまとめから。キーノートと、What's newまでは生で見たい気がする。 goo.gl

Image compression for Android developers

What's newの後にいきなり、細かいトピックですが、画像の圧縮について。 goo.gl

Multi-Window mode

あんまり興味ないけど、一応、Android Nからサポートされるマルチウィンドウへの対応。 goo.gl

What the Fragment?

Fragmentについて。なんで今頃わざわざGoogle I/Oでやるんだろうか。 みんなどういう風に使うか、悩んでいるから? goo.gl

Android Auto: The Road Ahead

直近使うことはなさそうだけど、話題性としては、車の中で使用するためのプラットフォーム、Android Autoについて。 goo.gl

May 19

Android themes & styles demystified

テーマとスタイルについて。 goo.gl

What's new in Android development tools

Androidの開発ツールについて。最近2.xにバージョンアップしたAndroid Stuidioについてでしょうか。 goo.gl

What's new in Android Wear?

はっきり言って、Wearに関するセッションは少ないです。 今回のI/Oでも盛り上がりに欠けそうな予感はしていますが、新しい発表はあるでしょうか。 goo.gl

The experts' guide to Android development tools

Android Studioの深いところやTipsを教えてくれて、生産性があがるらしいです。 goo.gl

May 20

Android UI and layouts

UIとレイアウトについて。カスタムView、カスタムLayout、効率的なLayout階層構造などについて教えてくれるみたいです。 goo.gl

Android application architecture: Get ready for the next billion!

オフライン対応についてみたい。 goo.gl

A window into transitions

画面遷移のアニメーションなどについて。これ、iOSと比較して弱かったところなので、最新だとどうなっているのか興味がある。 goo.gl

Cordovaを6.xに、cordova-androidを5.xにバージョンアップしました

Cordovaをバージョンアップしました。

  • バージョンアップ前
$ cordova -version
5.4.1
  • バージョンアップ
$ sudo npm install  -g cordova@6.1.1
  • バージョンアップ後
$ cordova -version
6.1.1

Pluginのバージョン確認

$ cordova plugin version
com.phonegap.plugins.PushPlugin 2.5.0 "PushPlugin"
cordova-plugin-console 1.0.2 "Console"
cordova-plugin-device 1.1.0 "Device"
cordova-plugin-statusbar 2.0.0 "StatusBar"
cordova-plugin-whitelist 1.2.0 "Whitelist"

合わせてcordova platformのバージョンアップ

以前からcordova-androidのバージョンが古いと警告がでていたので、platformのバージョンアップもやります。

cordova-android 5についての公式のリリース情報はこちら。手順も載ってる。 Cordova Android 5.0.0 - Apache Cordova

 Using this version of Cordova with older version of cordova-android is being deprecated. Consider upgrading to cordova-android@5.0.0 or newer.
  • バージョンアップ前
$ cordova platform
Installed platforms:
  android 4.1.1
  browser 4.0.0
Available platforms: 
  amazon-fireos ~3.6.3 (deprecated)
  blackberry10 ~3.8.0
  firefoxos ~3.6.3
  ios ~4.1.0
  osx ~4.0.1
  webos ~3.7.0
  • バージョンアップ
$ cordova platform update android
Updating android project...
Android project updated with cordova-android@5.1.1
Discovered plugin "PushPlugin" in config.xml. Installing to the project
  • バージョンアップ後
$ cordova platform
Installed platforms:
  android 5.1.1
  browser 4.0.0
Available platforms: 
  amazon-fireos ~3.6.3 (deprecated)
  blackberry10 ~3.8.0
  firefoxos ~3.6.3
  ios ~4.1.0
  osx ~4.0.1
  webos ~3.7.0

android 5.1.1に上がってますね。

www.gitignore.ioを使って「OSX端末上でEclipseを使っているJavaのMavenプロジェクト」の.gitignoreファイルを作る

www.gitignore.ioを使って、OSX端末上で、Eclipseを使ってJavaMavenプロジェクトを開発している場合、 次のようなコマンドで.gitignoreファイルを作る。

curl https://www.gitignore.io/api/osx,java,eclipse,maven > .gitignore

今更使ったけど、すごい便利じゃないですか!

Concurrency Utilities for Java EE(JSR-236)のシンプルなサンプル試してみる

Java EEで非同期処理を行う方法を調べていました。 やりたいことは、iOSAndroidのPushメッセージのリクエストを受け付けて、リクエストの内容はデータベースに保存。非同期で、データベースの情報を元に、APNsやGCMにメッセージを送るという処理です。

選択肢としてはこんな感じかなと思います。

方式 検討したこと
Concurrency Utilities for Java EE Concurrencyという名前が付いているだけあって、単なる非同期処理というよりは、並列処理に関するコントロールがいろいろできそうです。
Message Driven Bean キューにメッセージがエンキューされたタイミングで、イベント・ドリブンで処理が動きます。JMSにメッセージがキューイングされるので、メッセージの永続化が可能。メッセージの永続化が可能なら、この方式かなと思います。今回は、Pushメッセージの内容はDBに永続化されていて、処理依頼のメッセージ自体のの永続性は不要だったので、JMSの環境構築の手間も考えて選択肢から外しました。
EJB Timer Service 単純な非同期処理以外にも、cron的なスケジュールベースの処理起動ができるみたいです。今回の要件では、多重度なくて、並行処理はどっちでもいいので、こちらの方式でもいいかも。

このエントリではConcurrency Utilities for Java EEを使ってみたいと思います。 Executors.newSingleThreadExecutorを使ってみます。これは、アプリケーション・サーバーなどのコンテナからスレッドを借りてこれますが、スレッドの多重度は1つになります。 生成されたスレッドは、コンテナのコンテキストを持っています。

Executors.newSingleThreadExecutorを使ったサンプルコード

Webサービスでリクエストを受け付ける部分

GETメソッドで処理を受け付けて、後述する非同期処理を起動します。 リクエストごとにRequestIdを採番しています。

package sample;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("/task")
public class TaskService {

    static int index = 0;
    
    @GET
    @Path("/")
    public void start() {
        
        System.out.println("TaskService.start is called. RequestId is " + index);
        
        TaskManager timer = TaskManager.getInstance();
        timer.exec(index++);
    }
}

非同期処理を行う部分

Executors.newSingleThreadExecutorを使って、処理を非同期で行います。 シングルトンで実装しています。

非同期処理部分で2秒間待合せ処理をしています。 パラメタで受け取ったリクエストIDと、スレッドを識別するためのスレッドIDをログに出力しています。

package sample;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TaskManager {
    
    static private TaskManager instace = null;
    private ExecutorService executor = null;
    
    private TaskManager() {
        executor =  Executors.newSingleThreadExecutor();
    }
    
    synchronized static public TaskManager getInstance() {
        if (instace == null) {
            instace = new TaskManager();
        }
        return instace;
    }
    
    public void exec(int requestId) {
        Runnable runnable = new Runnable() {

            public void run() {
                System.out.println("RequestId " + requestId + ":ThreadId " + Thread.currentThread().getId() + " is running.");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {}
                System.out.println("RequestId " + requestId + ":ThreadId " + Thread.currentThread().getId() + " is finished.");
            }
        };
        executor.execute(runnable);
    }
}

実行時ログ

作ったWebサービスを呼び出して、ログを確認します。 Executors.newSingleThreadExecutorを使っていることで、リクエストが重なった時も1つのスレッドで順次処理されていることがわかります。

# 最初のリクエスト
01:00:46,566 INFO  [stdout] (default task-2) TaskService.start is called. RequestId is 0
01:00:46,568 INFO  [stdout] (pool-5-thread-1) RequestId 0:ThreadId 138 is running.
01:00:48,570 INFO  [stdout] (pool-5-thread-1) RequestId 0:ThreadId 138 is finished.
# リクエストを受け付けて、処理が不通に動きました。スレッドIDは138。

01:00:50,164 INFO  [stdout] (default task-3) TaskService.start is called. RequestId is 1
01:00:50,164 INFO  [stdout] (pool-5-thread-1) RequestId 1:ThreadId 138 is running.
01:00:52,169 INFO  [stdout] (pool-5-thread-1) RequestId 1:ThreadId 138 is finished.

# ここからリクエストを連続で投げました
01:00:53,444 INFO  [stdout] (default task-4) TaskService.start is called. RequestId is 2
01:00:53,444 INFO  [stdout] (pool-5-thread-1) RequestId 2:ThreadId 138 is running.
01:00:53,756 INFO  [stdout] (default task-5) TaskService.start is called. RequestId is 3
01:00:54,028 INFO  [stdout] (default task-6) TaskService.start is called. RequestId is 4
01:00:54,317 INFO  [stdout] (default task-7) TaskService.start is called. RequestId is 5
# リクエストは受付られましたが、処理はキューイングされています

01:00:55,447 INFO  [stdout] (pool-5-thread-1) RequestId 2:ThreadId 138 is finished.
01:00:55,447 INFO  [stdout] (pool-5-thread-1) RequestId 3:ThreadId 138 is running.
01:00:57,448 INFO  [stdout] (pool-5-thread-1) RequestId 3:ThreadId 138 is finished.
01:00:57,449 INFO  [stdout] (pool-5-thread-1) RequestId 4:ThreadId 138 is running.
01:00:59,451 INFO  [stdout] (pool-5-thread-1) RequestId 4:ThreadId 138 is finished.
01:00:59,451 INFO  [stdout] (pool-5-thread-1) RequestId 5:ThreadId 138 is running.
01:01:01,452 INFO  [stdout] (pool-5-thread-1) RequestId 5:ThreadId 138 is finished.
# 同じスレッドIDで順次、処理が実行されていきました

サンプルコード

サンプルコードの全部はGithubで公開しています。

github.com

参考ドキュメント

こちらを参考にさせてもらいました。

Concurrency Utilities for EE 7 | 寺田 佳央 - Yoshio Terada

Concurrency Utilities for Java EEをつかってみる - Qiita