AWS + java + JAX-RS + session のメモ

beanstalkでさっとdynamodbのセッションを作る

Amazon DynamoDBによるTomcatセッション永続化とフェイルオーバー | Developers.IO

eclipseで普通にやるとsession用のdynamodbのテーブルが日本以外のリージョンにできてしまうので、context.xmlに以下の属性値を加える。

regionId="ap-northeast-1"

jax-rs

最初にbeanstalkでdynamodbセッション連携付きで適当なjavaアプリケーションをデプロイし、その後に同じEnvironmentにJAX-RSのアプリケーションをデプロイしたら、最初に作ったdynamodbのセッション機構が生き残っていた。
とりあえずはこれでいい。

sessionを触る

web services - How Can I Retrieve The Session Id from a Jax RS Webservice? - Stack Overflow

@Path("/session-id.txt")
public class SessionIdResource
{
@GET @Produces(MediaType.TEXT_PLAIN)
public String getSessionId( @Context HttpServletRequest request ){
return request.getSession(true).getId();
}
}

最終的にpom.xmlのdependenciesに以下を追記

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk</artifactId>
  <version>1.9.22</version>
</dependency>
<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version>
   <scope>provided</scope>
</dependency>

=========しきりなおし===============

上記のやり方でJAX-RS上でDynamoDBに接続しようとしたところ、classpathの問題が発生した。

SEVERE: Servlet.service() for servlet [Jersey Web Application] in context with path [] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient] with root cause
java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient

よくわからなかったので、jax-rs周りからやり直すことにした。


JAX-RS
JAX-RS(Jersey)を使ってみる - azuki note

DynamoDB
周回遅れエンジニアノート: DynamoDB で tomcat の session を管理する
AWS - DynamoDBのドキュメントAPI、JSON対応したから簡単なサンプルで紹介する part1 - Qiita

private void getUser(String uid, String tableName) {
    	//LOGGER.info("getUser start");
    	AWSCredentials credentials = new BasicAWSCredentials("XXXXXX", "XXXXXX");
        AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials);
        client.setEndpoint("dynamodb.ap-northeast-1.amazonaws.com");
        System.out.println("ok");
        
        DynamoDB dynamo = new DynamoDB(client);
        Table table = dynamo.getTable("User");
        Item item = table.getItem("uid", "abcde");
        //AttributeをMap<String, Object>でまわせるのは便利
        for (Map.Entry<String, Object> attribute : item.attributes()) {
            System.out
                    .println(attribute.getKey() + ", " + attribute.getValue());
        }
        //LOGGER.info("getUser end");
    }