Scala+DBMS+Web スカラ座の夜

2012年1月2日

Heroku Embedded Tomcat + Scala2.9.1

Filed under: Scala — admin @ 11:26 PM

Embedded Tomcat7 をランチするScala Object のソースコードです。

Heroku/src/main/scala/launch/Main.scala ファイルです。

このMainオブジェクトは先に書いたMain.javaをScalaコードに書き換えたものです。

package launch

import java.util._
import java.net.URL
import java.net.MalformedURLException
import java.net.URLClassLoader
import java.io.File
import java.io.IOException
import java.io.Writer
import javax.servlet.Servlet
import javax.servlet.ServletException
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

import org.apache.catalina._
import org.apache.catalina.connector.Connector
import org.apache.catalina.core.StandardHost
import org.apache.catalina.core.StandardServer
import org.apache.catalina.core.AprLifecycleListener
import org.apache.catalina.startup.Embedded
import org.apache.catalina.startup.Tomcat
import org.apache.coyote.http11.AbstractHttp11JsseProtocol
import org.apache.tomcat.util.IntrospectionUtils

object Main {

	def main(args: Array[String]): Unit = {
		val webappDirLocation = "src/main/webapp/"
		val tomcat = new Tomcat
		//The port that we should run on can be set into an environment variable
		//Look for that variable and default to 8080 if it isn't there.
		var webPort = System.getenv("PORT")
		if(webPort == null || webPort.isEmpty()) {
			webPort = "8080"
		}
		tomcat.setPort(Integer.valueOf(webPort))
		var appBase = new File(webappDirLocation).getAbsolutePath
		val contextPath = "/"
		// Add AprLifecycleListener
		val server = tomcat.getServer
		var listener = new AprLifecycleListener
		server.addLifecycleListener(listener)

		val configFile = new File("META-INF/context.xml")
		val context = tomcat.addWebapp(contextPath, appBase)
		context.setConfigFile(configFile.toURI().toURL())
		println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath())
		tomcat.enableNaming
		tomcat.start
		tomcat.getServer().await
	}
}


このコードの特徴は、

META-INF/context.xml を読み込んでいることです。
これでTomcat7のJDBCコネクション・プールが使えるようになります。

最初のアクセスはDBセッションを作るので遅いですが、それ以降はセッションがプールから得られるので早いです。

META-INF/context.xml ファイルの内容は、




    


ここまで来るには、いろいろと障害がある訳です。
ローカルの環境で動いたからといっても、Herokuで動くとは限らない。

その障害の1つ。

Main.javaの環境があるとところでこのScalaオブジェクトがあると、HerokuへファイルをアップロードするとすでにMain.javaがあるからとエラーとなってしまいました。

これを回避するには、ローカル環境にある.gitフォルダをいったんすべて削除してから、
Deploy to Herokuしました。

Commit your changes to Git:


$ git init
$ git add .
$ git commit -m "Ready to deploy"


新しいインスタンスを作ります。
Create the app on the Cedar stack:

$ heroku create --stack cedar


インストールが成功すると以下のようにメッセージされます。
Deploy your code:


$ git push heroku master
............

       [INFO] --- maven-install-plugin:2.3.1:install (default-install) @ embedde
dTomcatSeedo ---
       [INFO] Installing /tmp/build_22ibt93uw91ys/target/embeddedTomcatSeedo.jar
 to /app/tmp/repo.git/.cache/.m2/repository/com/heroku/seedo/embeddedTomcatSeedo
/1.0-SNAPSHOT/embeddedTomcatSeedo-1.0-SNAPSHOT.jar
       [INFO] Installing /tmp/build_22ibt93uw91ys/pom.xml to /app/tmp/repo.git/.
cache/.m2/repository/com/heroku/seedo/embeddedTomcatSeedo/1.0-SNAPSHOT/embeddedT
omcatSeedo-1.0-SNAPSHOT.pom
       [INFO] ------------------------------------------------------------------
------
       [INFO] BUILD SUCCESS
       [INFO] ------------------------------------------------------------------
------
       [INFO] Total time: 1:33.414s
       [INFO] Finished at: Mon Jan 02 14:03:43 UTC 2012
       [INFO] Final Memory: 13M/490M
       [INFO] ------------------------------------------------------------------
------
-----> Discovering process types
       Procfile declares types -> web
-----> Compiled slug size is 17.8MB
-----> Launching... done, v5
       http://radiant-mountain-7703.herokuapp.com deployed to Heroku

To git@heroku.com:radiant-mountain-7703.git
 * [new branch]      master -> master

ewave@WYOMING ~/workspace/heroku (master)
$


[INFO] BUILD SUCCESS とくれば成功!

Comments

comments

Powered by Facebook Comments

コメントはまだありません

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress