昨天知道了一個Scala Web框架,感受至關不錯。 java
因爲它是基於Netty的,不能經過Web容器部署,有點猶豫要不要用它,不知道能不能在CloudFoundry上發佈。 node
以後搜到一篇關於在CloudFoundry上部署獨立應用的文章,因而開始嘗試。 web
首先,開發了一個簡單的Socko示例應用,打完包之後目錄結構大概是這樣: spring
dist/ main.jar lib/ a.jar b.jar
其中IP和端口綁定代碼爲: shell
hostname = Option(System.getenv("VCAP_APP_HOST")).getOrElse("localhost"), port = Option(System.getenv("VCAP_APP_PORT")).getOrElse("8080").toInt理論上,我只須要把dist目錄下的全部內容上傳(vmc)到cloudfoundry上便可。
上傳過程: 瀏覽器
dist>vmc push msockotest DL is deprecated, please use Fiddle Instances> 1 1: grails 2: java_web 3: lift 4: node 5: play 6: rack 7: rails3 8: sinatra 9: spring 10: standalone Framework> 10 // 選10,獨立部署 1: java 2: java7 3: node 4: node06 5: node08 6: ruby18 7: ruby19 Runtime> 2 // 是Java7開發的 Custom startup command> java -jar study_socko_2.10-0.1.jar 1: 64M 2: 128M 3: 256M Memory Limit> 64M // 示例應用,不改了 Creating mistsockotest... OK 1: msckotest.cloudfoundry.com 2: none Domain> msockotest.cloudfoundry.com Updating msockotest... OK Create services for application?> n Save configuration?> n Uploading mistsockotest... FAILED Upload failed. Try again with 'vmc push'. TypeError: no implicit conversion of nil into String For more information, see ~/.vmc/crash結果卻上傳失敗了,沒有找到緣由。替代方法是將啓動命令寫到腳本里:
startup.sh ruby
CLASSPATH="./*:./lib/*" export CLASSPATH java $JAVA_OPTS helloexample.HelloApp
腳本放在dist下。而後把Custom startup command寫成 app
./startup.sh
上傳成功。再試,失敗,而後不管怎麼上傳都是失敗,就成功了一次。Google一下,發現不少人遇到這個問題,有人提出是新版本vmc的問題,因而卸載vmc0.5,安裝0.4版: 框架
gem uninstall vmc uninstall tunnel-vmc-plugin # gem install -v 0.3.21 vmc gem install -v 0.4.0 vmc從新上傳
dist>vmc push msockotest Instances> 1 10: standalone Framework> 10 2: java7 Runtime> 2 Startup command> ./startup.sh 1: 64M Memory Limit> 64M Creating msockotest... OK 1: msockotest.cloudfoundry.com 2: none URL> msockotest.cloudfoundry.com Updating msockotest... OK Create services for application?> n Bind other services to application?> n Save configuration?> n Uploading msockotest... OK Starting msockotest... OK Checking msockotest... GAVE UP Application failed to start.上傳成功,但啓動失敗了,因而查看日誌:
dist>vmc files msockotest --path logs/err.log DL is deprecated, please use Fiddle Getting file contents... OK # Logfile created on 2013-04-23 05:57:24 +0000 by logger.rb/25413 F, [2013-04-23T05:57:24.510280 #25207] FATAL -- : Memory limit of 64M exceeded. F, [2013-04-23T05:57:24.510350 #25207] FATAL -- : Actual usage was 65M, process terminated.好象是內存不夠,因而把Memory Limit改爲128M
dist>vmc delete msockotest ... Deleting msockotest... OK dist>vmc push msockotest ... 1: 64M 2: 128M 3: 256M 4: 512M Memory Limit> 2 Creating msockotest... OK ... Uploading msockotest... OK Starting msockotest... OK Checking msockotest... OK
成功,就是Checking的過程稍微有點漫長,嚇得我覺得又失敗了呢。 spa
dist>vmc files msockotest --path logs/stdout.log DL is deprecated, please use Fiddle Getting file contents... OK ./*:./lib/* 06:01:14.118 [HelloExampleActorSystem-akka.actor.default-dispatcher-4] [] INFO akka.event.slf4j.Slf4jEventHandler - Sl f4jEventHandler started 06:01:14.228 [main] [] INFO o.m.socko.webserver.WebServer - Socko server '[WebServer, 172.30.49.146, 46824]' started o n {}:{}日誌中能夠看到這個應用實際綁定IP和端口。
用瀏覽器訪問http://msockotest.cloudfoundry.com/,獲得
Hello from Socko (Tue Apr 23 06:07:28 UTC 2013)終於完成了,真曲折啊。