在CloudFoundry上部署獨立Java應用

昨天知道了一個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)
終於完成了,真曲折啊。
相關文章
相關標籤/搜索