仕掛けを作る
HerokuのPostgeSQLを使うための仕掛け
HerokuのPostgreSQLを使うためにデータベース設定を少しだけ細工する。
ローカルでもHerokuでも動かせるためにHeroku用のDataSourceFactory
を作る。
public class HerokuDataSourceFactory {
private static Logger logger = LoggerFactory.getLogger(HerokuDataSourceFactory.class);
public static DataSourceFactory get(String databaseUrl){
logger.info("Creating DB for " + Objects.requireNonNull(databaseUrl));
try {
URI dbUri = new URI(databaseUrl);
final String user = dbUri.getUserInfo().split(":")[0];
final String password = dbUri.getUserInfo().split(":")[1];
final String url = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath()
+ "?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory";
DatabaseConfiguration<Configuration> databaseConfiguration = new DatabaseConfiguration<Configuration>() {
@Override
public DataSourceFactory getDataSourceFactory(Configuration configuration) {
//TODO 接続設定以外は設定ファイルから読みたい
DataSourceFactory dsf = new DataSourceFactory();
dsf.setUser(user);
dsf.setPassword(password);
dsf.setUrl(url);
dsf.setDriverClass("org.postgresql.Driver");
dsf.setAutoCommitByDefault(false);
return dsf;
}
};
return databaseConfiguration.getDataSourceFactory(null);
} catch (URISyntaxException e) {
logger.error(e.getMessage());
return null;
}
}
}
続いてConfiguration
クラスに仕掛けする。
@Valid
@NotNull
@JsonProperty("database")
private DataSourceFactory database = new DataSourceFactory();
public DataSourceFactory getDataSourceFactory() {
String databaseUrl = System.getenv("DATABASE_URL");
if(databaseUrl == null){
logger.info("Standard DataSourceFactory url=" + database.getUrl());
return database;
}
DataSourceFactory dsf = HerokuDataSourceFactory.get(databaseUrl);
logger.info("Heroku DataSourceFactory url=" + dsf.getUrl());
return dsf;
}
これでローカルで実行するときは設定ファイルから、Heroku上で実行するときにはSystem.getenv("DATABASE_URL")
で取得することができる。
Herokuで実行するための仕掛け
Procfile
を作成する。
web: java $JAVA_OPTS -jar target/dropwizard-app.jar db migrate dropwizard-app.yml && java $JAVA_OPTS -Ddw.server.connector.port=$PORT -jar target/dropwizard-app.jar server dropwizard-app.yml
設定ファイルをsimpleサーバーモードで起動するようにする。
server:
type: simple
applicationContextPath: /
connector:
type: http
port: 8080
ローカルで動かしてみる
mvn package
foreman
を使用して起動する。
foreman start
http://localhost:5000
にアクセスして確認する。
Herokuにデプロイしてみる
一応最初から。
プロジェクトルートをgitレポジトリ化してコミットする。
git init
git add .
git commit -m "Initial commit"
Herokuアプリを作成。
heroku create <application name>
PostgreSQLアドオンを追加。
heroku addons:create heroku-postgresql:dev
Herokuにpushする。
git push heroku master
アプリを開く。
heroku open
問題なく稼働することが確認できました。