JAX-WS Apache CXF连接错误

时间:2015-12-03 14:19:13

标签: soap cxf

Apache CXF和JAX-WS似乎总是会引发问题。我不确定我是否错误地使用它!

以下是我得到的例外情况:

20151203-15:14:06.836+0100 [play-akka.actor.default-dispatcher-9] ERROR my.proj - Asset E911S (SOAP) -- unknown error occurred at 2015-12-03T14:14:05.778Z while reading tag getSlave
javax.xml.ws.WebServiceException: Could not send Message.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:150) ~[cxf-rt-frontend-jaxws-3.1.4.jar:3.1.4]
    at com.sun.proxy.$Proxy57.getSlave(Unknown Source) ~[na:na]
    at my.proj.connectors.soap.MyServiceClient$$anonfun$getSlave$1.apply(MyServiceClient.scala:174) ~[classes/:na]
    at my.proj.connectors.soap.MyServiceClient$$anonfun$getSlave$1.apply(MyServiceClient.scala:97) ~[classes/:na]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library-2.11.7.jar:na]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library-2.11.7.jar:na]
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) [akka-actor_2.11-2.3.4.jar:na]
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) [akka-actor_2.11-2.3.4.jar:na]
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.7.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.7.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.7.jar:na]
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.7.jar:na]
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://1/c.2.3.4/gi-bin/cgi.cgi?WebService: Read timed out
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_60]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_60]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_60]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[na:1.8.0_60]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1376) ~[cxf-rt-transports-http-3.1.4.jar:3.1.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1360) ~[cxf-rt-transports-http-3.1.4.jar:3.1.4]
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) ~[cxf-core-3.1.4.jar:3.1.4]
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:651) ~[cxf-rt-transports-http-3.1.4.jar:3.1.4]
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ~[cxf-core-3.1.4.jar:3.1.4]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) ~[cxf-core-3.1.4.jar:3.1.4]
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) ~[cxf-core-3.1.4.jar:3.1.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) ~[cxf-core-3.1.4.jar:3.1.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324) ~[cxf-core-3.1.4.jar:3.1.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277) ~[cxf-core-3.1.4.jar:3.1.4]
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) ~[cxf-rt-frontend-simple-3.1.4.jar:3.1.4]
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139) ~[cxf-rt-frontend-jaxws-3.1.4.jar:3.1.4]
    ... 11 common frames omitted
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_60]
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_60]
    at java.net.SocketInputStream.read(SocketInputStream.java:170) ~[na:1.8.0_60]
    at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_60]
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) ~[na:1.8.0_60]
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) ~[na:1.8.0_60]

以下是我设置上下文的方法!

  private def setRequestContext(proxy: Client, withCredentials: Boolean = false): Unit = {

    // set the time out!
    val httpConduit = proxy.getConduit.asInstanceOf[HTTPConduit]
    val httpClientPolicy = new HTTPClientPolicy()
    httpClientPolicy.setConnectionTimeout(mySoapClientConfig.requestTimeout.toSeconds)
    httpClientPolicy.setReceiveTimeout(mySoapClientConfig.requestTimeout.toSeconds)

    httpConduit.setClient(httpClientPolicy)

    if (withCredentials) {
      val userCredentials = new UserCredentials
      userCredentials.setPassword(mySoapClientConfig.password.orNull)
      userCredentials.setUserName(mySoapClientConfig.userName.orNull)

      val headerList = Seq(
        new Header(
          new QName(mySoapClientConfig.targetNamespace, "UserCredentials"),
          userCredentials,
          new JAXBDataBinding(classOf[UserCredentials])
        )
      )

      import scala.collection.JavaConverters._
      proxy.getRequestContext.put(Header.HEADER_LIST, headerList.asJava)
    }
  }

有人可以帮帮我吗?我可以使用SOAP UI连接到WebService!

1 个答案:

答案 0 :(得分:0)

我弄清楚问题是什么。请密切注意以下几行:

httpClientPolicy.setConnectionTimeout(mySoapClientConfig.requestTimeout.toSeconds)
    httpClientPolicy.setReceiveTimeout(mySoapClientConfig.requestTimeout.toSeconds)

setXXXTimeout需要很长的毫秒数,我传入的是4秒,这被理解为4毫秒,这导致读取超时!