2014-10-06 71 views
2

Tomcat上部署大量工作燈應用我使用的工作燈版本6.2.0.01.20141002-2218(工作室,服務器,Ant任務)和Tomcat 7.0.55主持工作燈服務器(一切都在Windows 8.1上運行)。作爲CI構建的一部分,我們使用Ant(版本1.8.4)構建最新應用程序(.wlapp)和適配器(.adapter),然後將其部署到Tomcat實例。我們看到的問題是,對於.wlapp文件大於大約2 MB的,我們得到以下錯誤(IP及端口隱藏)放大:無法使用wladm Ant任務

[wladm] Oct 06, 2014 1:42:55 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
[wladm] INFO: I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error 
[wladm] Oct 06, 2014 1:42:55 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
[wladm] INFO: Retrying request 
[wladm] Oct 06, 2014 1:42:55 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
[wladm] INFO: I/O exception (java.net.SocketException) caught when processing request: Software caused connection abort: socket write error 
[wladm] Oct 06, 2014 1:42:55 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
[wladm] INFO: Retrying request 
[wladm] Oct 06, 2014 1:42:55 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
[wladm] INFO: I/O exception (java.net.SocketException) caught when processing request: Software caused connection abort: socket write error 
[wladm] Oct 06, 2014 1:42:55 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute 
[wladm] INFO: Retrying request 
[wladm] Error accessing http://XXX.XX.XX.XXX:XXXX/wladmin/management-apis/1.0/runtimes/MyApp/applications?locale=en_GB: 

BUILD FAILED 
D:\XXX\build.xml:200: com.ibm.worklight.admin.restclient.RESTException: Error accessing http://XXX.XX.XX.XXX:XXXX/wladmin/management-apis/1.0/runtimes/MyApp/applications?locale=en_GB: Software caused connection abort: socket write error 
    at com.ibm.worklight.admin.restclient.RESTClient.getResponse(RESTClient.java:1062) 
    at com.ibm.worklight.admin.restclient.RESTClient.getPOSTResponse(RESTClient.java:1207) 
    at com.ibm.worklight.admin.restclient.RESTClient.getPOSTFileResponse(RESTClient.java:1227) 
    at com.ibm.worklight.admin.commands.DeployApp.getResponse(DeployApp.java:41) 
    at com.ibm.worklight.admin.restclient.ActionClient.execute(ActionClient.java:85) 
    at com.ibm.worklight.admin.ant.types.AbstractActionElement.executeCommand(AbstractActionElement.java:76) 
    at com.ibm.worklight.admin.ant.types.ActionElement.executeCommands(ActionElement.java:43) 
    at com.ibm.worklight.admin.ant.WladmTask.executeCommands(WladmTask.java:441) 
    at com.ibm.worklight.admin.ant.WladmTask.execute(WladmTask.java:290) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:392) 
    at org.apache.tools.ant.Target.performTasks(Target.java:413) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
    at org.apache.tools.ant.Main.runBuild(Main.java:811) 
    at org.apache.tools.ant.Main.startAnt(Main.java:217) 
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 
Caused by: java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159) 
    at org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:153) 
    at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:114) 
    at org.apache.http.entity.mime.content.FileBody.writeTo(FileBody.java:105) 
    at org.apache.http.entity.mime.HttpMultipart.doWriteTo(HttpMultipart.java:206) 
    at org.apache.http.entity.mime.HttpMultipart.writeTo(HttpMultipart.java:224) 
    at org.apache.http.entity.mime.MultipartEntity.writeTo(MultipartEntity.java:183) 
    at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:96) 
    at org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108) 
    at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:120) 
    at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:263) 
    at org.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:227) 
    at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:255) 
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:645) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) 
    at com.ibm.worklight.admin.restclient.RESTClient.getResponse(RESTClient.java:951) 
    ... 25 more 

注意,在服務器日誌中沒有任何錯誤的痕跡。 ,涉及到這個Ant構建文件的部分是:

<target name="setup-worklight-tasks"> 
    <taskdef resource="com/worklight/ant/defaults.properties"> 
     <classpath> 
      <pathelement location="${worklight_ant_builder_path}"/> 
     </classpath> 
    </taskdef> 
    <taskdef resource="com/worklight/ant/deployers/antlib.xml"> 
     <classpath> 
      <pathelement location="${worklight_ant_deployer_path}"/> 
     </classpath> 
    </taskdef> 
</target> 

<target name="deploy" depends="setup-worklight-tasks"> 
    <wladm url="${admin_services_url}" user="${admin_services_user}" password="${admin_services_pass}" secure="false"> 
     <deploy-app runtime="${runtime_name}" file="bin/MyApp-all.wlapp"/> 
    </wladm> 
</target> 

測試與小.wlapp文件並不構成導致成功部署應用程序的任何問題。考慮到Tomcat的默認最大POST大小限制爲2 MB,我最初認爲問題出在我的連接器配置上。然而,在調整了所有可能與此相關的連接器之後,我仍然得到錯誤。這裏是Tomcat的server.xml我的連接器的配置:

... 
<Connector port="9080" protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      redirectPort="9443" maxPostSize="-1" maxSavePostSize="-1" maxHttpHeaderSize="2097152" socketBuffer="-1" bufferSize="20480"/> 

<Connector port="9443" protocol="HTTP/1.1" SSLEnabled="true" 
      maxThreads="150" scheme="https" secure="true" 
      clientAuth="false" sslProtocol="TLS" 
      keystoreFile="D:/IBM/apache-tomcat-7.0.55/security/server2_withchain.p12" 
      keystoreType="PKCS12" 
      keyPass="myPass" maxPostSize="-1" maxSavePostSize="-1" maxHttpHeaderSize="2097152" socketBuffer="-1" bufferSize="20480"/>    

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxPostSize="-1" maxSavePostSize="-1" maxHttpHeaderSize="2097152" socketBuffer="-1" bufferSize="20480"/> 
... 

我測試的另外一個事情是通過工作燈控制檯UI其中工作正常.wlapp文件的任何大小做了部署。一個有趣的問題,我發現與使用工作燈控制檯(從檢查Tomcat的訪問日誌),相關的網址是:

XXX.XX.XX.XXX - demo [06/Oct/2014:13:48:05 +0200] "POST /wladmin/management-apis/1.0/runtimes/MyApp/applications?async=true HTTP/1.1" 200 602 
0:0:0:0:0:0:0:1 - demo [06/Oct/2014:13:48:05 +0200] "POST /worklightconsole/services/management-apis/1.0/runtimes/MyApp/applications?async=true HTTP/1.1" 200 602 

有趣的事情是在async=true參數的存在。考慮到這一點,並考慮到通常「連接重置通過peer:套接字寫入錯誤」通常表明客戶端的問題,我認爲這可能是一個問題,wladm任務意外關閉連接(一步由於async=true參數,在通過用戶界面進行部署時可以避免這種情況)。

有沒有人在部署到Tomcat時使用wladm任務時遇到類似的問題?

更新1:

我做我自己的.wlapp文件的POST(使用Chrome的郵差),並上傳加上部署工作的罰款。這肯定指出了wladm ant任務中的一個問題。

更新2:

我在螞蟻CI構建過程中替換使用wladm一起cURL調用做應用程序和適配器文件發佈到工作燈服務器。我可以確認,使用cURL就像一個魅力,這意味着問題確實在於wladm(更可能是它使用的捆綁的Apache HTTP客戶端)。這是我的Ant構建文件的更新部分(我定義了一個布爾標誌使用cURLwladm):

... 
<target name="deploy" unless="deploy_done" depends="build, setup-worklight-tasks" description="Deploy adapters and apps"> 
    <if> 
     <available file="adapters" type="dir"/> 
     <then> 
      <echo message="Deploying adapters" level="info"/> 
      <foreach target="deploy-adapter" param="adapterPath" inheritall="true"> 
       <path> 
        <dirset dir="adapters" casesensitive="yes"> 
         <include name="*"/> 
        </dirset> 
       </path> 
      </foreach> 
     </then> 
    </if> 
    <echo message="Deploying applications" level="info"/> 
    <foreach target="deploy-app" param="appPath" inheritall="true"> 
     <path> 
      <dirset dir="apps" casesensitive="yes"> 
       <include name="*"/> 
      </dirset> 
     </path> 
    </foreach> 
    <property name="deploy_done" value="true"/> 
</target> 

<target name="post-curl"> 
    <exec executable="curl" failonerror="true" outputproperty="curl-output" errorproperty="curl-output-error"> 
     <arg value="-u"/> 
     <arg value="${admin_services_user}:${admin_services_pass}"/> 
     <arg value="-F"/> 
     <arg value="[email protected]${post-curl.file}"/> 
     <arg value="${admin_services_url}/management-apis/1.0/runtimes/${runtime_name}/${post-curl.urlPart}"/> 
    </exec> 
    <if> 
     <not><contains string="${curl-output}" substring="SUCCESS"/></not> 
     <then> 
      <echo level="error">${curl-output}</echo> 
      <echo level="error">${curl-output-error}</echo> 
      <fail message="cURL upload failed"/> 
     </then> 
    </if> 
</target> 

<target name="deploy-app"> 
    <basename property="appName" file="${appPath}"/> 
    <if> 
     <equals arg1="${admin_deploy_curl}" arg2="true"/> 
     <then> 
      <echo message="Deploying app [${appName}] using cURL..." level="info"/> 
      <antcall target="post-curl" inheritAll="true"> 
       <param name="post-curl.file" value="bin/${appName}-all.wlapp"/> 
       <param name="post-curl.urlPart" value="applications"/> 
      </antcall> 
     </then> 
     <else> 
      <echo message="Deploying app [${appName}] using wladm..." level="info"/> 
      <wladm url="${admin_services_url}" user="${admin_services_user}" password="${admin_services_pass}" secure="false"> 
       <deploy-app runtime="${runtime_name}" file="bin/${appName}-all.wlapp"/> 
      </wladm> 
     </else> 
    </if>  
    <echo message="App [${appName}] deployed." level="info"/> 
</target> 

<target name="deploy-adapter"> 
    <basename property="adapterName" file="${adapterPath}"/> 
    <if> 
     <equals arg1="${admin_deploy_curl}" arg2="true"/> 
     <then> 
      <echo message="Deploying adapter [${adapterName}] using cURL..." level="info"/> 
      <antcall target="post-curl" inheritAll="true"> 
       <param name="post-curl.file" value="bin/${adapterName}.adapter"/> 
       <param name="post-curl.urlPart" value="adapters"/> 
      </antcall> 
     </then> 
     <else> 
      <echo message="Deploying adapter [${adapterName}] using wladm..." level="info"/>     
      <wladm url="${admin_services_url}" user="${admin_services_user}" password="${admin_services_pass}" secure="false"> 
       <deploy-adapter runtime="${runtime_name}" file="bin/${adapterName}.adapter"/> 
      </wladm> 
     </else> 
    </if>  
    <echo message="Adapter [${adapterName}] deployed." level="info"/> 
</target> 
... 
+0

如果您覺得在工作燈中遇到了錯誤,那麼您需要打開PMR才能調查並收到固定版本。 – 2014-10-07 10:15:59

+0

謝謝Idan。我開始提出這個問題是因爲我想象我的配置有問題。隨着我的測試進展,越來越明顯,這很可能是一個錯誤。我確實會提交PMR並回答當前的問題。 – Costas 2014-10-07 12:39:43

回答

4

該問題是由Tomcat 7.0.55中的新行爲引入的。引用它的change log:「添加一個新的限制,默認爲2MB,用於Tomcat將中止上傳中止的數據量,該限制可以通過HTTP連接器的maxSwallowSize屬性進行配置。

所以,有三種可能的解決方法:

  • 改變所有<連接器>聲明,在Tomcat的conf/server.xml,通過添加屬性maxSwallowSize="100000000"(或任何上層的應用程序和適配器限制大小可以並處)。
  • 或者使用Worklight Console UI部署應用程序或適配器。
  • 或使用curl程序來部署應用程序或適配器。
+0

謝謝@slowhand!現在添加'maxSwallowSize =「 - 1」'允許'wladm'正確部署。這應該是Worklight文檔中Tomcat配置部分的一個要點。仍然奇怪的是,'wladm'上傳被Tomcat視爲中止,而'curl'則正常工作。 – Costas 2014-10-27 08:58:37

0

對於我的要求,我現在去各地wladm Ant任務使用捲曲的方法,我已經詳細我的第二次更新(請參閱原始問題)。通過使用這個,我又實現了一個完全自動化的CI部署。

我將向IBM提交一份PMR,根據我收到的反饋,我會繼續更新此答案。

+0

PMR尚未回覆。 @slowhand的(接受)答案現在糾正了這個問題,並且很好地總結了可能的其他解決方案。 – Costas 2014-10-27 08:59:53