# java容器
java容器很很多,tomcat、jetty、jboss、resin、weblogic、webspere等等。
有收費的,也有開源免費的,性能可能是有些許差異的,理論上,收費的應該比免費的,性能要要一些。
但是,用開源免費的來做巨大訪問量的(比如千萬PV)應用,也是毫無問題的,當前我們所處的技術浪潮,性能的瓶頸一般都在數據庫上,在硬盤的訪問上,而不是網絡請求和響應。
**已知互聯網公司使用的java容器:**
jetty:google、美團
tomcat:yougou.com
jetty官網:[http://www.eclipse.org/jetty/](http://www.eclipse.org/jetty/)
jetty源碼:git clone https://github.com/eclipse/jetty.project.git
關于tomcat的博客:[http://blog.csdn.net/puma_dong/article/details/21875253](http://blog.csdn.net/puma_dong/article/details/21875253)
[Jetty 的工作原理以及與 Tomcat 的比較](http://www.ibm.com/developerworks/cn/java/j-lo-jetty/)
[Google App Engine轉向了Jetty](http://www.infoq.com/cn/news/2009/08/google-chose-jetty/)
# jetty日志
### jetty的日志記錄
本周遇到一個jetty日志的問題,看jetty的request.log日志中,我們post過來的參數沒有記錄,google了好久,沒有答案,于是把jetty源碼下載下來,看了看日志這部分:jetty-server/src/main/resource/org/eclipse/jetty/server/NCSARequestLog.java,發現日志中關于參數相關的日志,只記錄了request.getUri(),也就是說只有get的參數才能記錄到日志里面去,post的參數都不會記錄到日志里面。
**相關帖子:**
[http://wiki.eclipse.org/Jetty/Tutorial/RequestLog](http://wiki.eclipse.org/Jetty/Tutorial/RequestLog)
### 啟動過程中一個日志輸出的問題
啟動過程中,jetty的INFO級別及以上的日志,會打印到IDE控制臺(比如Eclipse),突然有一天,日志不再打印到IDE控制臺,而是到某個地方后,重定向到了logs/jetty.log.2015-06-10,如圖:

開始發現這個日志和mms-boot-0.8.jar中的配置一致,截圖如下:

所以把問題的原因定義為:jetty定義的重定向,對于控制臺的輸出重定向到了文件(實際jetty8.xml僅僅是對System.out/error進行了重定向)。
后來了解到,其他的項目也是同樣的啟動方式,沒有這個問題。
于是重新查原因,對比hotel-campaigns和hotel-cms的日志的不同,開始時有“先入為主”的思維定勢,潛意識相信是jetty8.xml再搗鬼,所以對比兩個項目的依賴mms的版本、及執行jetty8.xml處的日志,修改log4j.xml配置文件進行多種辦法的嘗試,沒有找出問題。
結合下午發現的log4j.xml配置文件不生效,可以確定:IDE啟動hotel-campaigns項目時,對于slf4j的實現,用了logback,為什么突然用了logback呢?
結合pom.xml,可以看到:

于是exclusions 這個jar,問題解決。
**參考文章:**
[http://www.slf4j.org/codes.html#multiple_bindings](http://www.slf4j.org/codes.html#multiple_bindings)
[http://www.slf4j.org/manual.html](http://www.slf4j.org/manual.html)
# 嵌入式Jetty和RunJettyRun插件
使用RunJettyRun插件,項目運行正常,截圖如下:
使用嵌入式方式運行,打不出啟動成功的標記,截圖如下:
開始嘗試解決問題:
1、由于“springmvc”是web.xml里面關于SpringMVC的servlet,嘗試把SpringMVC相關的內容都去掉,依然沒有打出啟動成功的日志
2、嘗試著訪問了一下antispider-server提供的Thrift服務和Web服務,結果都是正常的,很是疑惑,這個時候懷疑:RunJettyRun插件(這相當于Jetty容器)和Bootstrap(這相當于Jetty內嵌),對于SpringMVC或者Web項目的處理方式,有很大不同,導致沒有正常啟動完畢。
評:這實際是由于對Jetty理解不深刻,胡亂猜忌Jetty了,如果作為容器和嵌入式,有很大的差別,這簡直是不可想象的。
由于沒有解決問題,結合Bootstrap源碼,關注以上圖示中的“第一點”和“第二點”
第一點:這一點沒啥好說的,就是src/main/resource下沒有config.properties,對于結果沒有影響,期間經歷一個小插曲,hotel-campaigns-web項目,沒有config.properties文件,也沒打這行日志,經查是因為依賴的sinai.client里面有config.properties
第二點:這一點因為使用RunJettyRun插件時沒有這個日志,所以被高度懷疑,差異了一些資料,但是依然沒有解決
http://stackoverflow.com/questions/22938689/info-no-spring-webapplicationinitializer-types-detected-on-classpath
http://stackoverflow.com/questions/16321819/no-spring-webapplicationinitializer-types-detected-on-classpath
http://steveliles.github.io/setting_up_embedded_jetty_8_and_spring_mvc_with_maven_and_no_xml.html
http://hitmit1314.iteye.com/blog/1315816
3、萬不得已,新建一個單純的aitispider-test項目,使用Bootstrap運行,并逐漸增加antispider-server的配置文件,終于在一步增加log4j.xml時,問題重現,找出原因:
4、"org"中,“ERROR”以下級別的日志被過濾了,用RunJettyRun插件,啟動成功,是oejs包打印的,所以能顯示;而用嵌入式Jetty,啟動成功是org包打的,所以被過濾掉了,截圖如下:
5、故事到此就結束了,但這個經歷,加深了對嵌入式Jetty的理解:服從一套規范,實現一組標準,幫我們實現高效的Web通訊。如果寫過ServerSocket通訊程序,會對嵌入式Jetty更深入的了解。
另外一個沒有微觀佐證的問題,關于Maven解決沖突的方式:
對于,這個問題,我使用準確告訴maven使用版本的方式解決(這是最標準、明確的方式,本身對于pom.xml就應該進行準確的定義,不應該依賴Maven自定義的方式幫我們解決沖突):
- 前言
- Java之旅--如何從草根成為技術專家
- 《深入理解Java虛擬機》學習筆記
- 《Spring3.X企業應用開發實戰》學習筆記--IoC和AOP
- 《Tomcat權威指南》第二版學習筆記
- Java之旅--多線程進階
- Java之旅--Web.xml解析
- 《Spring3.X企業應用開發實戰》學習筆記--DAO和事務
- 《Spring3.X企業應用開發實戰》學習筆記--SpringMVC
- Java之旅--定時任務(Timer、Quartz、Spring、LinuxCron)
- Spring實用功能--Profile、WebService、緩存、消息、ORM
- JDK框架簡析--java.lang包中的基礎類庫、基礎數據類型
- JDK框架簡析--java.util包中的工具類庫
- JDK框架簡析--java.io包中的輸入輸出類庫
- Java之旅--通訊
- Java之旅--XML/JSON
- Java之旅--Linux&java進階(看清操作系統層面的事)
- Java之旅--硬件和Java并發(神之本源)
- Java之旅--設計模式
- jetty