Apache CXF也支援fast infoset,而且只需要少少的設定即可,在service side的spring設定檔中加上:
<cxf:bus>
<cxf:features>
<bean class="org.apache.cxf.feature.FastInfosetFeature"></bean>
</cxf:features>
</cxf:bus>
其他詳細有關CXF bus的設定可以參考:Bus Configuration
若是有需要傳輸大量資料,可以考慮使用MTOM
可以參考:Using MTOM 、Upload big attachment (document) using CXF ( MTOM ) Spring and Tomcat
基本上,就是在service-side與client-side上都設定mtom-enabled=true的property。而service-side上,可以考慮用DataHandler作為傳輸的媒介
2009年4月14日 星期二
JAX-WS & Apache CXF 二三事(2) - Authentication
Apache CXF也有支援WS-Security來為Web service做傳輸加解密與身份認證的工作。設定與程式部份並不難。可以參考WS-Security 與 Apache CXF Tutorial - WS-Security with Spring
首先,必須先確定classpath中有wss4j的jar。然後在原本的spring設定檔中的<jaxws:endpoint>加上以下內容:
其中必須注意的是WSS4JInInterceptor的設定。action是設定認證的方式,使用UsernameToken是表示使用username與password的認證方式,這是最簡單也是常用的方式;passwordType是設定密碼型態,使用PasswordText是指明碼password;passwordCallbackClass是指實作密碼驗證的classname,此處亦可以用passwordCallbackRef來代替,而設定值也將變為已經設定好的bean。以上就是在service端必須要的設定。而除此之外,也必須撰寫對應的PasswordCallback class。例如:
在client的部份,如果不是透過spring的方式去取得service,則必須自己手動加入有關WSS4JOutInterceptor的設定。
心得:
首先,必須先確定classpath中有wss4j的jar。然後在原本的spring設定檔中的<jaxws:endpoint>加上以下內容:
<jaxws:inInterceptors>
<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackClass" value="com.company.auth.service.ServerPasswordCallback" />
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
其中必須注意的是WSS4JInInterceptor的設定。action是設定認證的方式,使用UsernameToken是表示使用username與password的認證方式,這是最簡單也是常用的方式;passwordType是設定密碼型態,使用PasswordText是指明碼password;passwordCallbackClass是指實作密碼驗證的classname,此處亦可以用passwordCallbackRef來代替,而設定值也將變為已經設定好的bean。以上就是在service端必須要的設定。而除此之外,也必須撰寫對應的PasswordCallback class。例如:
而client的部份也是使用類似的設定但是是for WSS4JOutInterceptor;而password callback class是必須for client的,因為是要設定傳送給service的username跟password。import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
public class ServerPasswordCallback implements CallbackHandler {
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
if (pc.getIdentifer().equals("joe") {
// set the password on the callback. This will be compared to the
// password which was sent from the client.
pc.setPassword("password");
}
}
}
在client的部份,如果不是透過spring的方式去取得service,則必須自己手動加入有關WSS4JOutInterceptor的設定。
心得:
- 透過WSS4JOutInterceptor跟WSS4JInInterceptor,可以讓CXF支援身份認證的功能。但是這類的身份認證是在每次連線時都會進行,所以如果是需要查詢DB的話,可能會導致執行效率低落
- service端使用WSS4JInInterceptor; client使用WSS4JOutInterceptor.
- 若是透過JaxWsServerFactoryBean來取得service,則手動設定WSS4JOutInterceptor時,雖然會有設定username的行為,但是client password callback class還是必須做設定identifier的動作,否則會有連線問題
- 當passwordType是PasswordText時,service side 必須自己取出密碼並且驗證,若是驗證失敗則必須丟出適當的exception;而若是passwordType為PasswordDigest,則密碼是處理過的,無法透過getPassword取出密碼,此時service side也必須將service端的密碼透過setPassword設定給callback class,然後交由framework去驗證;若是驗證失敗,framework會自動丟出exception
JAX-WS & Apache CXF 二三事(1) - Basic
最近因為工作上的需要,所以研究了目前Java對於SOAP Web Services的東西,最後選擇了Apache CXF作為JAX-WS的implementation.
基本上,因為JAX-WS運用了Annotation,所以在開發上算是簡化了許多,比較不需要使用大量的XML來定義。而且JAX-WS & Apache CXF預設會自動使用JAXB來做訊息格式的轉換,所以基本上只要不是複雜的JavaBean,都可以自動轉換,甚至也不會自己去定義JAXB的東西,算是相當方便。而Apache CXF本身也是支援Spring framework,所以在設定上也是遵照Spring 2.0的設定檔標準,倒是不用另外學習。
Apache CXF其實本身支援相當多的格式與標準,但是目前我只是使用JAX-WS的部份。基本入門可以參考:
Web Services Tutorial with Apache CXF 與 A simple JAX-WS service
基本上就是在service class加上@WebService等適當的annotation,然後在spring的設定檔中加上以下內容:
其中,前三行的import是必要的,用來載入CXF自己本身的一些預設設定。主要的Web service定義在
然後在web.xml中加上必要的listener跟servlet設定,如下:
其中listener的設定是為了spring,而serlvet的部份才是為了CXF。
而client也可以透過spring來取得web service或是透過JaxWsProxyFactoryBean。
目前有幾點需要注意:
基本上,因為JAX-WS運用了Annotation,所以在開發上算是簡化了許多,比較不需要使用大量的XML來定義。而且JAX-WS & Apache CXF預設會自動使用JAXB來做訊息格式的轉換,所以基本上只要不是複雜的JavaBean,都可以自動轉換,甚至也不會自己去定義JAXB的東西,算是相當方便。而Apache CXF本身也是支援Spring framework,所以在設定上也是遵照Spring 2.0的設定檔標準,倒是不用另外學習。
Apache CXF其實本身支援相當多的格式與標準,但是目前我只是使用JAX-WS的部份。基本入門可以參考:
Web Services Tutorial with Apache CXF 與 A simple JAX-WS service
基本上就是在service class加上@WebService等適當的annotation,然後在spring的設定檔中加上以下內容:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="auth"
implementor="com.company.auth.service.AuthServiceImpl"
address="/swAuth"/>
</beans>
其中,前三行的import是必要的,用來載入CXF自己本身的一些預設設定。主要的Web service定義在
<jaxws:endpoint
/>
裏面。其中的implementor是用來指定service implementation class,而address是指service對外公開的名稱,也就是被取用的名稱。spring會根據這個設定,將implementor所描述的class建立出instance,並設定成為JAX-WS的service。如果不想透過指定class name的方式而是想reuse已經存在的bean,則可以省略implementor,而改用<jaxws:implementor>的方式來reference到已定義好的bean然後在web.xml中加上必要的listener跟servlet設定,如下:
<web-app>
<display-name>Auth Manager</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:com/company/auth/service/cxf.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
其中listener的設定是為了spring,而serlvet的部份才是為了CXF。
而client也可以透過spring來取得web service或是透過JaxWsProxyFactoryBean。
目前有幾點需要注意:
- 之前使用2.1.4版會有無法連線的問題,改用2.1.3版之後就正常;2.2.0版雖然release,但是還尚未測試
- 即使取得service object,但是並不表示連線就已經建立完成。真正的連線會等到method call進行時,才做連線。
- 預設的client的Connection timeout跟receive timeout分別是30s跟60s,所以如果需要等待較長的呼叫時,可能會出現連線中斷。可以透過在client的classpath中加入cxf.xml來覆蓋預設值。詳細的設定可以參考:Client HTTP Transport (including SSL support)
2009年3月14日 星期六
改進nvidia driver的2D速度
從網路上看來的...
P.S: 後來從Google上找出來的另一項可能改善Xserver的CPU usage的設定:設定一個環境變數__GL_YIELD="NOTHING"
- 修改xorg.conf,加入
Option "PixmapCacheSize" "300000"
Option "OnDemandVBlankInterrupts" "True" - 在Console視窗執行(也可以在「作業階段」中加入項目,讓他在登入時執行):
nvidia-settings -a InitialPixmapPlacement=2 -a GlyphCache=1
P.S: 後來從Google上找出來的另一項可能改善Xserver的CPU usage的設定:設定一個環境變數__GL_YIELD="NOTHING"
2009年2月19日 星期四
扣人心弦的『神曲』
這次GUNDAM 00第2季的片尾曲都相當好聽。尤其這首由依藤由奈所演唱的『Trust you'更是讓人感動...配上新的片尾畫面更是淒美...
以下則是完整的PV:
聽完,心裡只有兩字:感動
P.S:以下網路上看來的中文歌詞,寫的相當不錯:
仿如花朵在風中飄搖
仿如細雨滋潤大地
世間萬物都彼此依偎 共同生存
為何人卻要彼此傷害
為何總有別離
即使你已遠行
在我心深處
總為那溫柔笑顏所填滿
緊緊擁抱著你的碎片
雖覺疼痛 卻依然相連
我深信
還會再見
I'm waiting for your love
I love you I trust you
請與我分享你的孤獨
I love you I trust you
無論光明或是黑暗
我們都在一起 彼此信任
No 不要分開
誰將看見世界的盡頭
誰將繼承旅途的終點
儘管現在仍是看不見答案的漫漫長夜
我也想往堅信的道路前行
因為在那一頭有光明等待
你教會我的那首歌
如今仍在我心中
與你溫柔的聲音一起響徹
流下滿載著心情的水滴
溫暖了臉頰
我會變得堅強
我深信
緊緊相連就是
I'm always by your side
I love you I trust you
為你流下的眼淚
I love you I trust you
告訴了我什麼是愛
就算你在路上迷失了方向
我也會在你身邊
Waiting for your love
Always by your side
You are the one that I love
You are the one that I trust
You are the only one
I love you I trust you
請與我分享你的孤獨
I love you I trust you
無論光明或是黑暗
I love you I trust you
無論悲傷與歡樂
I love you I trust you
我想要守護你的一切
就算你在路上迷失了方向
我也會在你身邊
我們都在一起 彼此信任
No 不要分開
以下則是完整的PV:
聽完,心裡只有兩字:感動
P.S:以下網路上看來的中文歌詞,寫的相當不錯:
仿如花朵在風中飄搖
仿如細雨滋潤大地
世間萬物都彼此依偎 共同生存
為何人卻要彼此傷害
為何總有別離
即使你已遠行
在我心深處
總為那溫柔笑顏所填滿
緊緊擁抱著你的碎片
雖覺疼痛 卻依然相連
我深信
還會再見
I'm waiting for your love
I love you I trust you
請與我分享你的孤獨
I love you I trust you
無論光明或是黑暗
我們都在一起 彼此信任
No 不要分開
誰將看見世界的盡頭
誰將繼承旅途的終點
儘管現在仍是看不見答案的漫漫長夜
我也想往堅信的道路前行
因為在那一頭有光明等待
你教會我的那首歌
如今仍在我心中
與你溫柔的聲音一起響徹
流下滿載著心情的水滴
溫暖了臉頰
我會變得堅強
我深信
緊緊相連就是
I'm always by your side
I love you I trust you
為你流下的眼淚
I love you I trust you
告訴了我什麼是愛
就算你在路上迷失了方向
我也會在你身邊
Waiting for your love
Always by your side
You are the one that I love
You are the one that I trust
You are the only one
I love you I trust you
請與我分享你的孤獨
I love you I trust you
無論光明或是黑暗
I love you I trust you
無論悲傷與歡樂
I love you I trust you
我想要守護你的一切
就算你在路上迷失了方向
我也會在你身邊
我們都在一起 彼此信任
No 不要分開
2009年1月21日 星期三
Too many open file?!
之前一直都沒有注意Linux有開啟檔案數的問題,一直到不久前,在使用eclipse時常常會出現『Too many open files'的錯誤,導致eclipse無法正常運作。原本以為是Linux上的JDK的問題,在google之後才知道原來是Linux本身的設定問題。
想知道自己某個程式的開啟檔案數,可以用以下的指令察看:
想知道自己某個程式的開啟檔案數,可以用以下的指令察看:
lsof -p [pid of your process] | wc -l如果想調大檔案開啟數,可以調整fs.file-max這個核心參數。如果memory夠大,可以將此值加大到65536,或是更大:調整的方式:
在/etc/rc.local中加入echo 65536 > /proc/sys/fs/file-max或是
在sysctl.conf中加入fs.file-max=65536不過單修改核心參數只能加大系統核心的上限,Linux本身還有針對每個user的每個程式本身的限制,因此還需要編輯/etc/security/limits.conf,並加入
* soft nofile 4096修改完畢之後,重新開機即可!
* hard nofile 4096
自己編譯gcin的deb
因為家中的Ubuntu是裝64bit的,所以在使用gcin上,不容易找到編譯好的deb來安裝。所幸,廣大的internet上還是有不少資訊可以參考,以下就是參考整理後的步驟:
經過以上步驟就可以產生需要的deb檔,就可以透過dpkg來安裝
經過以上步驟就可以產生需要的deb檔,就可以透過dpkg來安裝
訂閱:
文章 (Atom)