DynamoDB(Local)とwebsocketを軽く触ってみたので、今度はSpringBootでチャットアプリのサンプルを作ってみます。
環境
- windows7
- eclipse Luna
- java8(1.8.0_25)
- dynamodb_local_latest
- spring-boot(1.2.2)
windows版DynamoDBLocalのインストールと起動確認
- http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html より「zip」版をダウンロードする
- 任意のフォルダで解凍する(私はC:¥直下にdynamodbフォルダを作成し、そこに解凍しました)
- コマンドプロンプトを起動し、上記フォルダに移動する
- 以下のコマンドを実行
java -Djava.library.path=.¥DynamoDBLocal_lib -jar DynamoDBLocal.jar
※ctrl+cで終了できます
テーブル構成
今回は以下のようなテーブル構成にします
chatテーブル
名称 | 型 | 構造 | 用途 |
---|---|---|---|
room_id |
N(Numeric) | HASH | |
commented_datetime |
S(Srting) | RANGE | |
user_name |
S(String) | - | ユーザ名称 |
message |
S(String) | - | 文章 |
- 上記「room_id」「commented_datetime」はcreate tableを行うときに必要
- 「user_name」「message」はcreate table時には必要無いが、データを登録するときに使う
ソース
ソースはGitHubにありますので参考にしてください。
https://github.com/duke-gonorego/WebsocketChatSample
※これ以降DynamoDBLocalへの操作はソースを利用して説明します。
テーブルの作成、初期データ登録
ソース内のテストクラスを使ってテーブルを作成します
DynamoDBAPITest.java
@Ignore
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class DynamoDBAPITest {
※テスト実施前にIgnoreを外してください
作成します
DynamoDBAPITest.java
@Test
public void createTableTest() throws Exception {
dynamoDBAPI.createTable();
}
※上記メソッドのテスト実行をしてください。
テーブルが作成されたか確認します
DynamoDBAPITest.java
@Test
public void getTableInformationTest(){
dynamoDBAPI.getTableInformation();
}
※コンソールログにテーブル構成が出力されます
データ登録
DynamoDBAPITest.java
@Test
public void putTest() {
for (int i = 0; i < 10; i++) {
ChatItem chatItem = new ChatItem();
chatItem.setUserName("test" + String.valueOf(i));
chatItem.setMessage("hogehogehoge" + String.valueOf(i));
dynamoDBAPI.put(chatItem);
}
}
データ確認
DynamoDBAPITest.java
@Test
public void getAllTest(){
System.out.println(dynamoDBAPI.getAll());
}
※データ登録が上手くいっていればコンソールログにselect結果が出力されます
SpringBoot起動
※その前に「DynamoDBAPITest.java」の@Ignoreを再度つけてください
-
.jarを作成する
- 「Run As」⇒「Java Application」⇒「Appliation - com.websockettest」選択して起動
ブラウザで確認
- http://localhost:8000/login にアクセス
- user1/password1 を入力してログイン
- 事前にデータを登録している場合はデータが画面に表示されます
- 「connect」ボタンを押してからメッセージを入力し、sendmessageボタンをクリックします
- 入力したメッセージが表示されます(このメッセージはwebsocket経由でリクエストし、レスポンスされたメッセージです)
- 画面をリロードしても入力したメッセージが表示されます(このメッセージはDynamoDBLocalに先ほど登録されたメッセージを取得し、表示しています)
メモ
- SpringSecurityを使った理由:ログインユーザのメッセージをユーザ名称とともにDynamoDBLocalに登録するとき、認証の為だけにDBを用意するのが面倒だったので。。
- リクエストされたメッセージを受けるcontroller(MessageController)でSpringSecurityで認証されたユーザ名を取得する方法が不明だった。。(のでChatControllerで無理矢理thymeleafに渡すというお寒いやり方に。。)
- とりあえずDynamoDBLocalにメッセージ保存/取得、websocketでメッセージのやりとりを確認したかっただけなので、それだけの実装しかしていません。。