Heroku Embedded Tomcat + Scala2.9.1

Posted 2012年1月2日 by

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 とくれば成功!

Post Details

  • Post Title: Heroku Embedded Tomcat + Scala2.9.1
  • Author: admin
  • Filed As: Scala
  • Tags:
  • You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

Comments are closed.