You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Aki Yoshida <el...@gmail.com> on 2014/12/01 16:04:35 UTC

Re: NPE at HolderOutInterceptor / Holder.value is null

Your post is kind of too long and I am not really seeing how your
client is calling the method and how your service is setting the
value,
Could you compare that to the cxf's sample code at
samples/soap_header/src/main/java/demo/soap_header/(client|server)?


2014-11-28 18:21 GMT+01:00 André Costa Lima <an...@gmail.com>:
> Hello,
>
> I am a new CXF (v3.0.0) user. Actually, I am new to the whole JAX-WS thing.
> :)
> I have set up a JAX-WS service, SOAP over JMS with ActiveMQ. The server
> methods invocations are working fine, but I am having some trouble
> regarding the Holder class.
> I am using the holder class as a container for the outgoing SOAP header for
> all web methods, as specified in the WSDL.
> I started from WSDL first with Spring configuration for both clients and
> servers.
> I have provided an async binding to the wsdl2java tool to generate the
> async method signatures, because I want to use those instead of the sync
> ones.
>
> The problem is that when I pass the Holder object to the client method and
> assign the value field in the server, the client sees it as null but no
> exception is thrown.
> Further, if I put the @UseAsyncMethod annotation to command CXF to use the
> pure async method I have implemented, CXF throws NPE at
> HolderOutInterceptor class.
> I noticed that if the web method has no arguments besides the SOAP headers
> everything works just fine, otherwise what I have described above happens.
>
> Below there are my configurations.
>
> Maven plugin:
>
> <plugin>
> <groupId>org.apache.cxf</groupId>
>           <artifactId>cxf-codegen-plugin</artifactId>
>           <executions>
>           <execution>
>                     <id>generate-sources</id>
>                               <phase>generate-sources</phase>
>                               <configuration>
>                               <defaultOptions>
>                                         <bindingFiles>
>
> <bindingFile>${basedir}/src/main/resources/oa_types-binding.xml</bindingFile>
>
> <bindingFile>${basedir}/src/main/resources/oa_async-binding.xml</bindingFile>
>                                         </bindingFiles>
>
> <noAddressBinding>true</noAddressBinding>
>                                     </defaultOptions>
>                                     <sourceRoot>
>
> ${basedir}/target/generated-sources/cxf
>                                     </sourceRoot>
>                                     <wsdlOptions>
>                                         <wsdlOption>
>
> <wsdl>${basedir}/src/main/resources/OA_Server.wsdl</wsdl>
>
> <wsdlLocation>classpath:OA_Server.wsdl</wsdlLocation>
>                                             <extraargs>
>                                                 <extraarg>-p</extraarg>
>                                                 <extraarg>
> http://www.multispeak.org/Version_4.1_Release=org.multispeak.version_4_1_6.OA
> </extraarg>
>                                                 <extraarg>-p</extraarg>
>
> <extraarg>cpsm_V4.1_Release=org.cspm.version_4_1.OA</extraarg>
>                                                 <extraarg>-p</extraarg>
>
> <extraarg>gml_V4.1_Release=org.gml.version_4_1.OA</extraarg>
>                                                 <extraarg>-p</extraarg>
>                                                 <extraarg>
> http://www.w3.org/1999/xlink=org.w3.xlink.OA</extraarg>
>                                                 <extraarg>-p</extraarg>
>                                                 <extraarg>
> http://www.w3.org/2001/XMLSchema=org.w3.xmlschema.OA</extraarg>
>                                                 <!--
> <extraarg>-p</extraarg> -->
>                                                 <!--
> <extraarg>org.multispeak.version_4_1_6.OA</extraarg> -->
>                                                 <!--
> <extraarg>-impl</extraarg> -->
>                                                 <!--
> <extraarg>-server</extraarg> -->
>                                                 <!--
> <extraarg>-client</extraarg> -->
>
> <extraarg>-autoNameResolution</extraarg>
>                                                 <extraarg>-fe</extraarg>
>                                                 <extraarg>jaxws21</extraarg>
>                                                 <extraarg>-exsh</extraarg>
>                                                 <extraarg>true</extraarg>
>                                             </extraargs>
>                                         </wsdlOption>
>                                     </wsdlOptions>
>                                 </configuration>
>                                 <goals>
>                                     <goal>wsdl2java</goal>
>                                 </goals>
> </execution>
> </executions>
> </plugin>
>
> Spring:
>
>     <beans:bean id="connection-factory"
> class="org.apache.activemq.ActiveMQConnectionFactory">
>         <beans:property name="brokerURL"
> value="${outside.multispeak.jms.broker}"/>
>     </beans:bean>
>
>     <beans:bean id="pooled-connection-factory"
> class="org.apache.activemq.pool.PooledConnectionFactory"
> destroy-method="stop">
>         <beans:constructor-arg index="0" ref="connection-factory"/>
>         <beans:property name="expiryTimeout"
> value="${outside.multispeak.jms.pool.expiryTimeout}"/>
>     </beans:bean>
>
> <!-- multispeak call handling interface (OA) -->
>
>         <!-- client side -->
>
>         <jaxws:client
>             id="multispeak-oa-client"
>             xmlns:ns="http://www.multispeak.org/Version_4.1_Release"
>             serviceClass="org.multispeak.version_4_1_6.OA.OAServerSoap"
>             serviceName="ns:OA_Server"
>             endpointName="ns:OA_ServerSoap"
>             address="#{'jms:queue:'
>                 + '${outside.multispeak.oa.jms.queue}'
>                 + '?timeToLive=' + '${outside.multispeak.jms.timeToLive}'
>                 + '&amp;requestTimeout' +
> '${outside.multispeak.jms.receiveTimeout}'}"
>             wsdlLocation="classpath:OA_Server.wsdl">
>             <jaxws:features>
>                 <beans:bean class="org.apache.cxf.feature.LoggingFeature "/>
>                 <beans:bean
> class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
>                     <beans:constructor-arg index="0"
> ref="pooled-connection-factory"/>
>                 </beans:bean>
>             </jaxws:features>
>            </jaxws:client>
>
>         <!-- server side -->
>
>         <beans:bean id="forwarding-oa-server"
> class="${outside.multispeak.oa.server}" />
>         <beans:bean id="multispeak-oa-obj-factory"
> class="org.multispeak.version_4_1_6.OA.ObjectFactory" />
>
>         <jaxws:endpoint
>             id="multispeak-oa-server"
>             xmlns:tns="http://www.multispeak.org/Version_4.1_Release"
>             implementor="x.x.outside.multispeak.oa.server.OAServerSoapImpl"
>             serviceName="tns:OA_Server"
>             endpointName="tns:OA_ServerSoap"
>             address="#{'jms:queue:' + '${outside.multispeak.oa.jms.queue}'
> + ''}"
>             publish="false"
>             wsdlLocation="classpath:OA_Server.wsdl">
>             <jaxws:features>
>                 <beans:bean class="org.apache.cxf.feature.LoggingFeature "/>
>                 <beans:bean
> class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
>                     <beans:constructor-arg index="0"
> ref="pooled-connection-factory"/>
>                 </beans:bean>
>             </jaxws:features>
>         </jaxws:endpoint>
>
> The Service Endpoint Interface generated.
> There are two methods: pingURL and odEventNotification.
> pingURLAsync, as it has no arguments besides the headers, works just fine,
> but odEventNotificationAsync does not.
> Note that I am using an AsyncHandler of course. In case of pingURLAsync I
> can get Holder.value in the handleResponse(Response<T>) callback without
> any problems.
>
> @WebService(targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> name = "OA_ServerSoap")
> @XmlSeeAlso({ObjectFactory.class, org.w3.xlink.OA.ObjectFactory.class,
> org.gml.version_4_1.OA.ObjectFactory.class,
> org.cspm.version_4_1.OA.ObjectFactory.class})
> public interface OAServerSoap {
>
> ...
>
> @RequestWrapper(localName = "PingURL", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.PingURL")
>     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.PingURLResponse")
>     @WebMethod(operationName = "PingURL")
>     public Response<org.multispeak.version_4_1_6.OA.PingURLResponse>
> pingURLAsync(
>         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", header = true)
>         MultiSpeakMsgHeader multiSpeakMsgHeader,
>         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release", header =
> true)
>         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
>     );
>
>     @RequestWrapper(localName = "PingURL", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.PingURL")
>     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.PingURLResponse")
>     @WebMethod(operationName = "PingURL")
>     public Future<?> pingURLAsync(
>         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", header = true)
>         MultiSpeakMsgHeader multiSpeakMsgHeader,
>         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release", header =
> true)
>         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>         @WebParam(name = "asyncHandler", targetNamespace = "")
>         AsyncHandler<org.multispeak.version_4_1_6.OA.PingURLResponse>
> asyncHandler
>     );
>
>     /**
>      * Requester pings URL of OA to see if it is alive.  Returns
> errorObject(s) as necessary to communicate application status.
>      */
>     @WebResult(name = "PingURLResult", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release")
>     @RequestWrapper(localName = "PingURL", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.PingURL")
>     @WebMethod(operationName = "PingURL", action = "
> http://www.multispeak.org/Version_4.1_Release/PingURL")
>     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.PingURLResponse")
>     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject pingURL(
>         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", header = true)
>         MultiSpeakMsgHeader multiSpeakMsgHeader,
>         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release", header =
> true)
>         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
>     );
>
> @RequestWrapper(localName = "ODEventNotification", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.ODEventNotification")
>     @ResponseWrapper(localName = "ODEventNotificationResponse",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> className = "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>     @WebMethod(operationName = "ODEventNotification")
>     public
> Response<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> odEventNotificationAsync(
>         @WebParam(name = "ODEvents", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release")
>         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> odEvents,
>         @WebParam(name = "transactionID", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release")
>         java.lang.String transactionID,
>         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", header = true)
>         MultiSpeakMsgHeader multiSpeakMsgHeader,
>         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release", header =
> true)
>         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
>     );
>
>     @RequestWrapper(localName = "ODEventNotification", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.ODEventNotification")
>     @ResponseWrapper(localName = "ODEventNotificationResponse",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> className = "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>     @WebMethod(operationName = "ODEventNotification")
>     public Future<?> odEventNotificationAsync(
>         @WebParam(name = "ODEvents", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release")
>         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> odEvents,
>         @WebParam(name = "transactionID", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release")
>         java.lang.String transactionID,
>         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", header = true)
>         MultiSpeakMsgHeader multiSpeakMsgHeader,
>         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release", header =
> true)
>         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>         @WebParam(name = "asyncHandler", targetNamespace = "")
>
> AsyncHandler<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> asyncHandler
>     );
>
>     /**
>      * Publisher notifies OA of a change in OutageDetectionEvents by
> sending an array of changed OutageDetectionEvent objects.  OA returns
> information about failed transactions using an array of errorObjects. The
> message header attribute 'registrationID' should be added to all publish
> messages to indicate to the subscriber under which registrationID they
> received this notification data.
>      */
>     @WebResult(name = "ODEventNotificationResult", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release")
>     @RequestWrapper(localName = "ODEventNotification", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", className =
> "org.multispeak.version_4_1_6.OA.ODEventNotification")
>     @WebMethod(operationName = "ODEventNotification", action = "
> http://www.multispeak.org/Version_4.1_Release/ODEventNotification")
>     @ResponseWrapper(localName = "ODEventNotificationResponse",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> className = "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
> odEventNotification(
>         @WebParam(name = "ODEvents", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release")
>         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> odEvents,
>         @WebParam(name = "transactionID", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release")
>         java.lang.String transactionID,
>         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release", header = true)
>         MultiSpeakMsgHeader multiSpeakMsgHeader,
>         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> targetNamespace = "http://www.multispeak.org/Version_4.1_Release", header =
> true)
>         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
>     );
>
> ...
>
> The SEI implementation.
> Both pingURL and odEventNotification simply forward the call to a delegate.
> Both inbound and outbound headers are placed in a common container and
> handed over to the delegate.
> The async methods simply execute the calls in background and end up calling
> the sync methods internally.
> The line
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> simply calls multiSpeakMsgHeader1.value = ...
>
> @WebService(
>         serviceName = "OA_Server",
>         portName = "OA_ServerSoap",
>         targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>         wsdlLocation = "classpath:OA_Server.wsdl",
>         endpointInterface = "org.multispeak.version_4_1_6.OA.OAServerSoap")
> public class OAServerSoapImpl implements OAServerSoap {
>
> ...
>
> @Override
>     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
> multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>         try {
>             Preconditions.checkNotNull(multiSpeakMsgHeader);
>             Preconditions.checkNotNull(multiSpeakMsgHeader1);
>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>             return
> LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
>         } catch (Throwable t) {
>             throw LOG.throwing(Throwables.unchecked(t));
>         }
>     }
>
> @Override
> @UseAsyncMethod
> public ArrayOfErrorObject odEventNotification(ArrayOfOutageDetectionEvent
> odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> multiSpeakMsgHeader1);
>         try {
>             Preconditions.checkNotNull(odEvents, "odEvents");
>             Preconditions.checkNotNull(transactionID, "transactionID");
>             Preconditions.checkNotNull(multiSpeakMsgHeader,
> "multiSpeakMsgHeader");
>             Preconditions.checkNotNull(multiSpeakMsgHeader1,
> "multiSpeakMsgHeader1");
>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>             return
> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
> transactionID, mspkHeader)));
>         } catch (Throwable t) {
>             throw LOG.throwing(Throwables.unchecked(t));
>         }
>     }
>
>     @Override
>     public Future<?> pingURLAsync(MultiSpeakMsgHeader multiSpeakMsgHeader,
> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> AsyncHandler<PingURLResponse> asyncHandler) {
>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>         try {
>             PingURLAsync response = new PingURLAsync(this,
> multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>             mExecutor.submit(response);
>             return LOG.exit(response.getServerAsyncResponse());
>         } catch (Throwable t) {
>             throw LOG.throwing(Throwables.unchecked(t));
>         }
>     }
>
> @Override
>     public Future<?> odEventNotificationAsync(ArrayOfOutageDetectionEvent
> odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> AsyncHandler<ODEventNotificationResponse> asyncHandler) {
>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> multiSpeakMsgHeader1);
>         try {
>             OdEventNotificationAsync response = new
> OdEventNotificationAsync(this, odEvents, transactionID,
> multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>             mExecutor.submit(response);
>             return LOG.exit(response.getServerAsyncResponse());
>         } catch (Throwable t) {
>             throw LOG.throwing(Throwables.unchecked(t));
>         }
>     }
>
> ...
>
> The invocation test.
>
> ...
> Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>();
> Future<?> future = mServer.odEventNotificationAsync(new
> ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(), headerOut,
> new AsyncHandlerImpl(headerOut));
> ...
> private static class AsyncHandlerImpl implements
> AsyncHandler<ODEventNotificationResponse> {
>
>         private static final XLogger LOG =
> XLoggerFactory.getXLogger(AsyncHandlerImpl.class);
>
>         private final Holder<MultiSpeakMsgHeader> mHeaderOut;
>
>         public AsyncHandlerImpl(Holder<MultiSpeakMsgHeader> headerOut) {
>             mHeaderOut = headerOut;
>         }
>
>         @Override
>         public void handleResponse(Response<ODEventNotificationResponse>
> res) {
>             try {
>                 if (LOG.isTraceEnabled()) {
>                     LOG.trace("Callback: {}", res.toString());
>                 }
>                 ODEventNotificationResponse mspkRsp = res.get();
>                 if (LOG.isTraceEnabled()) {
>                     LOG.trace("OA odEventNotificationAsync() >> callback:
> {} > multispeak header: {}", mspkRsp.toString(), mHeaderOut.value);
> //                    for (Entry<String, Object> entry :
> res.getContext().entrySet()) {
> //                        LOG.trace("Response context >> string > {} >>
> object > {}", entry.getKey(), entry.getValue());
> //                    }
>                 }
>             } catch (Exception e) {
>                 LOG.catching(e);
>             }
>         }
>     }
>
> As I said above, a NPE is thrown in HolderOutInterceptor when the response
> is returned to the client if I use the pure async method with
> @UseAsyncMethod,
> or mHeaderOut.value is null if I don't. Now, the stacktrace:
>
> 28-11-2014 17:15:07.997 WARN  [OA Thread-#1]
> org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for {
> http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}ODEventNotification
> has thrown exception, unwinding now
> java.lang.NullPointerException
>     at
> org.apache.cxf.jaxws.interceptors.HolderOutInterceptor.handleMessage(HolderOutInterceptor.java:90)
> ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> [cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:81)
> [cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> [cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)
> [cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
> [cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.jms.continuations.JMSContinuation.doResume(JMSContinuation.java:109)
> [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.jms.continuations.JMSContinuation.resume(JMSContinuation.java:98)
> [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker$JaxwsServerHandler.handleResponse(AbstractJAXWSMethodInvoker.java:193)
> [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>     at
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireResult(AbstractAsyncResponseHandler.java:55)
> [classes/:?]
>     at
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireAsyncResult(AbstractAsyncResponseHandler.java:46)
> [classes/:?]
>     at
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.postProcess(AbstractAsyncResponseHandler.java:41)
> [classes/:?]
>     at
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable$1.invoke(ConditionEnforcerHandlerRunnable.java:10)
> [classes/:?]
>     at
> x.x.outside.common.util.ConditionEnforcerHandler$2.invoke(ConditionEnforcerHandler.java:25)
> [classes/:?]
>     at
> x.x.outside.common.util.ExceptionHandler.handle(ExceptionHandler.java:7)
> [classes/:?]
>     at
> x.x.outside.common.util.ConditionEnforcerHandler.handle(ConditionEnforcerHandler.java:20)
> [classes/:?]
>     at
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable.run(ConditionEnforcerHandlerRunnable.java:7)
> [classes/:?]
>     at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> [?:1.6.0_33]
>     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> [?:1.6.0_33]
>     at java.util.concurrent.FutureTask.run(FutureTask.java:166) [?:1.6.0_33]
>     at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> [?:1.6.0_33]
>     at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> [?:1.6.0_33]
>     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> 28-11-2014 17:15:08.044 TRACE [ActiveMQ Session Task-1]
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> handleResponse - Callback: org.apache.cxf.jaxws.JaxwsClientCallback$2@cc6f8c
> 28-11-2014 17:15:08.044 ERROR [ActiveMQ Session Task-1]
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> handleResponse - catching
> java.util.concurrent.ExecutionException:
> org.apache.cxf.binding.soap.SoapFault: Fault occurred while processing.
>     at
> org.apache.cxf.jaxws.JaxwsClientCallback$2.get(JaxwsClientCallback.java:99)
> ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>     at
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl.handleResponse(OAServerTestAsyncCallback.java:81)
> [classes/:?]
>     at
> org.apache.cxf.jaxws.JaxwsClientCallback.handleException(JaxwsClientCallback.java:87)
> [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:821)
> [cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>     at
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> [activemq-client-5.9.1.jar:5.9.1]
>     at
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> [activemq-client-5.9.1.jar:5.9.1]
>     at
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> [activemq-client-5.9.1.jar:5.9.1]
>     at
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> [activemq-client-5.9.1.jar:5.9.1]
>     at
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> [activemq-client-5.9.1.jar:5.9.1]
>     at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> [?:1.6.0_33]
>     at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> [?:1.6.0_33]
>     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> processing.
>     at
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     ... 11 more
> 28-11-2014 17:15:08.045 ERROR
> [x.x.outside.test.multispeak.OAServerTestAsyncCallback-1]
> x.x.outside.test.multispeak.OAServerTestAsyncCallback run - catching
> java.util.concurrent.ExecutionException:
> org.apache.cxf.binding.soap.SoapFault: Fault occurred while processing.
>     at org.apache.cxf.endpoint.ClientCallback.get(ClientCallback.java:169)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.jaxws.JaxwsResponseCallback.get(JaxwsResponseCallback.java:54)
> ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>     at
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$1.run(OAServerTestAsyncCallback.java:52)
> [classes/:?]
>     at
> x.x.outside.test.multispeak.spi.AbstractMultispeakServerTest$2.run(AbstractMultispeakServerTest.java:112)
> [classes/:?]
>     at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> [?:1.6.0_33]
>     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> [?:1.6.0_33]
>     at java.util.concurrent.FutureTask.run(FutureTask.java:166) [?:1.6.0_33]
>     at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> [?:1.6.0_33]
>     at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> [?:1.6.0_33]
>     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> processing.
>     at
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> ~[cxf-core-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>     at
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>     at
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> ~[activemq-client-5.9.1.jar:5.9.1]
>     at
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> ~[activemq-client-5.9.1.jar:5.9.1]
>     at
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> ~[activemq-client-5.9.1.jar:5.9.1]
>     at
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> ~[activemq-client-5.9.1.jar:5.9.1]
>     at
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> ~[activemq-client-5.9.1.jar:5.9.1]
>     ... 3 more
>
> Is this a configuration problem? Am I doing something stupid?
> Thanks!
>
> Regards,
>
> André Costa Lima

Re: NPE at HolderOutInterceptor / Holder.value is null

Posted by André Costa Lima <an...@gmail.com>.
Hello again,

I took a look at the WSDL in the sample and I noticed that the header type
is included as a part in both the input and output messages. In my WSDL
this does not happen. I just have one part in each message and the header
type is declared as another message. Below is what my WSDL looks like for
the ODEventNotification operation:

Types:

INPUT

<s:element name="ODEventNotification">
        <s:complexType>
          <s:sequence>
            <s:element maxOccurs="1" minOccurs="0" name="ODEvents"
type="tns:ArrayOfOutageDetectionEvent"/>
            <s:element maxOccurs="1" minOccurs="0" name="transactionID"
type="s:string"/>
          </s:sequence>
        </s:complexType>
      </s:element>

OUTPUT

<s:element name="ODEventNotificationResponse">
        <s:complexType>
          <s:sequence>
            <s:element maxOccurs="1" minOccurs="0"
name="ODEventNotificationResult" type="tns:ArrayOfErrorObject"/>
          </s:sequence>
        </s:complexType>
      </s:element>

Messages:

INPUT

  <wsdl:message name="ODEventNotificationSoapIn">
    <wsdl:part name="parameters" element="tns:ODEventNotification">
    </wsdl:part>
  </wsdl:message>

OUTPUT

<wsdl:message name="ODEventNotificationSoapOut">
    <wsdl:part name="parameters" element="tns:ODEventNotificationResponse">
    </wsdl:part>
  </wsdl:message>

HEADER

  <wsdl:message name="ODEventNotificationMultiSpeakMsgHeader">
    <wsdl:part name="MultiSpeakMsgHeader" element="tns:MultiSpeakMsgHeader">
    </wsdl:part>
  </wsdl:message>

Operation:

 <wsdl:operation name="ODEventNotification">
      <wsdl:input message="tns:ODEventNotificationSoapIn">
    </wsdl:input>
      <wsdl:output message="tns:ODEventNotificationSoapOut">
    </wsdl:output>
    </wsdl:operation>

Binding:

<wsdl:operation name="ODEventNotification">
      <soap:operation soapAction="
http://www.multispeak.org/Version_4.1_Release/ODEventNotification"
style="document"/>
      <wsdl:input>
        <soap:body use="literal"/>
        <soap:header message="tns:ODEventNotificationMultiSpeakMsgHeader"
part="MultiSpeakMsgHeader" use="literal">
        </soap:header>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
        <soap:header message="tns:ODEventNotificationMultiSpeakMsgHeader"
part="MultiSpeakMsgHeader" use="literal">
        </soap:header>
      </wsdl:output>
    </wsdl:operation>

Code generated:

@WebResult(name = "ODEventNotificationResult", targetNamespace = "
http://www.multispeak.org/Version_4.1_Release")
    @RequestWrapper(localName = "ODEventNotification", targetNamespace = "
http://www.multispeak.org/Version_4.1_Release", className =
"org.multispeak.version_4_1_6.OA.ODEventNotification")
    @WebMethod(operationName = "ODEventNotification", action = "
http://www.multispeak.org/Version_4.1_Release/ODEventNotification")
    @ResponseWrapper(localName = "ODEventNotificationResponse",
targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
className = "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
    public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
odEventNotification(
        @WebParam(name = "ODEvents", targetNamespace = "
http://www.multispeak.org/Version_4.1_Release")
        org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
odEvents,
        @WebParam(name = "transactionID", targetNamespace = "
http://www.multispeak.org/Version_4.1_Release")
        java.lang.String transactionID,
        @WebParam(mode = WebParam.Mode.INOUT, name = "MultiSpeakMsgHeader",
targetNamespace = "http://www.multispeak.org/Version_4.1_Release", header =
true)
        javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader
    );

So, the operation is in WRAPPED mode, right? As for the sample, it is in
BARE/UNWRAPPED mode.

I've regenerated the SEI code with -bareMethods=odEventNotification as
argument to wsdl2java. odEventNotification is now annotated with:

@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)

I ran my test again and now the asynchronous/synchronous invariant worked,
no exceptions. The Holder.value is correct in the client.

According to CXF-docs
<ht...@SOAPBindingannotation>,
@SOAPBinding parameterStyle can be either BARE or WRAPPED, i.e., it seems
that there are no restrictions as far as the operation mode goes, but my
tests show otherwise.

Regards,

André Costa Lima


2014-12-05 14:34 GMT+00:00 Aki Yoshida <el...@gmail.com>:

> Basically, I didn't change anything which was there in jaxws_async and
> soap_header, except for aligning some naming for the operation names.
> The executor set at the service is actually optional and yes, this is
> for the client. That shows that you can use your own executor to
> process the response message. But if you don't need that, you don't
> need to set it, then the cxf bus's default executor is used.
>
> The annotated method indicates that the method will not be called if
> there is async support (in other words, in that case, it's async
> method is instead called).
>
> regards, aki
>
> 2014-12-04 18:50 GMT+01:00 André Costa Lima <an...@gmail.com>:
> > Thanks. I will take a look into it.
> > With a quick glance, I noticed that you set an Executor on the service
> > itself. I am not doing this. I just have an Executor on server side to
> run
> > the asynchronous requests, instead of new Thread()... as shown in the
> > sample. So, is that a client side Executor?
> >
> > If you remove @UseAsyncMethod, what is the expected behaviour if the
> client
> > calls the async invariant?
> >
> >
> >
> > André Costa Lima
> >
> >
> > 2014-12-04 16:54 GMT+00:00 Aki Yoshida <el...@gmail.com>:
> >>
> >> I just created one project that combines the soap_header and
> >> jaxws_async samples. And this is working fine as one expects.
> >>
> >> Since this project is straightforward and will add not much value to
> >> the current sample collection but rather make the collection more
> >> crowded with overlapping samples, so I am not planning to add it to
> >> the cxf's samples.
> >>
> >> I uploaded this project to my dropbox here. So you can compare it to
> >> your example.
> >>
> >>
> https://www.dropbox.com/s/hexnh3jgy9o8c61/cxf_samples_jaxws_async_soap_header.tar.gz?dl=0
> >>
> >> regards, aki
> >>
> >> 2014-12-02 17:31 GMT+01:00 André Costa Lima <an...@gmail.com>:
> >> > Alright. Yes, the sync case works perfectly. Should I submit a bug in
> >> > JIRA?
> >> >
> >> > André Costa Lima
> >> >
> >> >
> >> > 2014-12-02 16:27 GMT+00:00 Aki Yoshida <el...@gmail.com>:
> >> >>
> >> >> Hi André,
> >> >> I thought you were getting no value returned for the synchronous case
> >> >> and when using the async mode, getting an NPE from one of the
> >> >> interceptors.
> >> >> So I wanted to have the first issue fixed that might fix the second
> >> >> issue.
> >> >>
> >> >> But if you didn't have any issue with the sync Holder case, I have to
> >> >> look into the async case. It looks like there is some mismatch in the
> >> >> defined operations and the values passed in the context. I can't tell
> >> >> what is causing this issue. I have to take a look at it.
> >> >>
> >> >> regards, aki
> >> >>
> >> >> 2014-12-02 13:57 GMT+01:00 André Costa Lima <andreclima.pt@gmail.com
> >:
> >> >> > I just noticed that the sample you linked me to refers only to
> >> >> > synchronous
> >> >> > invocations only. The sample jaxws_async shows how to do generate
> >> >> > async
> >> >> > invariants of the methods and how to invoke them, but does not
> >> >> > demonstrate
> >> >> > how to use Holder<T> in this case. So, maybe, I'm doing it all
> wrong
> >> >> > because
> >> >> > CXF might not support this? Holder<T> works just fine in
> synchronous
> >> >> > invocations.
> >> >> >
> >> >> > My SEI was not generated correctly anyways. According to the
> sample,
> >> >> > when
> >> >> > the method receives a SOAP header and produces one, wsdl2java
> >> >> > generates
> >> >> > a
> >> >> > SEI with an Holder with Mode.INOUT. I guess the option
> >> >> > -autoNameResolution
> >> >> > was forcing the creation of an extra input parameter in the
> method. I
> >> >> > had no
> >> >> > conflicts, so I removed the option and now the Holder with
> Mode.INOUT
> >> >> > is
> >> >> > generated. I fixed all my methods in the SEI implementation
> >> >> > accordingly.
> >> >> >
> >> >> > I tested my invocations again. Now the Holder receives in the
> >> >> > constructor
> >> >> > the input header. Without @UseAsyncMethod:
> >> >> >
> >> >> > Holder<MultiSpeakMsgHeader> headerOut = new
> >> >> > Holder<MultiSpeakMsgHeader>(new
> >> >> > MultiSpeakMsgHeader());
> >> >> > Future<?> future = mServer.odEventNotificationAsync(new
> >> >> > ArrayOfOutageDetectionEvent(), "0", headerOut, new
> >> >> > AsyncHandlerImpl(headerOut));
> >> >> >
> >> >> > Still does not work. When the client reads the value field, it does
> >> >> > not
> >> >> > get
> >> >> > the new header object created by the server.
> >> >> > With @UseAsyncMethod still throws the NPE in the same line.
> >> >> >
> >> >> > When I invoked the argumentless method, again without
> >> >> > @UseAsyncMethod:
> >> >> >
> >> >> > Holder<MultiSpeakMsgHeader> headerOut = new
> >> >> > Holder<MultiSpeakMsgHeader>(new
> >> >> > MultiSpeakMsgHeader());
> >> >> > Future<?> future = mServer.pingURLAsync(headerOut, new
> >> >> > AsyncHandlerImpl(headerOut));
> >> >> >
> >> >> > I get another exception, this time in HolderInInterceptor. (I've
> >> >> > updated
> >> >> > to
> >> >> > 3.0.2) The stacktrace is below:
> >> >> >
> >> >> > 02-12-2014 12:48:28.643 WARN  [ActiveMQ Session Task-2]
> >> >> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for
> >> >> >
> >> >> >
> >> >> > {
> http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}PingURL
> >> >> > has thrown exception, unwinding now
> >> >> > java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
> >> >> >     at java.util.ArrayList.rangeCheck(ArrayList.java:571)
> >> >> > ~[?:1.6.0_33]
> >> >> >     at java.util.ArrayList.get(ArrayList.java:349) ~[?:1.6.0_33]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.cxf.jaxws.interceptors.HolderInInterceptor.handleMessage(HolderInInterceptor.java:67)
> >> >> > ~[cxf-rt-frontend-jaxws-3.0.2.jar:3.0.2]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >> > [cxf-core-3.0.2.jar:3.0.2]
> >> >> >     at
> >> >> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> >> >> > [cxf-core-3.0.2.jar:3.0.2]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> >> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
> >> >> >     at
> >> >> >
> >> >> >
> org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> >> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> >> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> >> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> >> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> >> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> >> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> >> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> >> >> > [?:1.6.0_33]
> >> >> >     at
> >> >> >
> >> >> >
> >> >> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> >> >> > [?:1.6.0_33]
> >> >> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> >> >> >
> >> >> > So maybe there is an issue when manipulating Holder objects in
> async
> >> >> > invocations of methods with arguments?
> >> >> >
> >> >> > André Costa Lima
> >> >> >
> >> >> >
> >> >> > 2014-12-01 15:44 GMT+00:00 André Costa Lima
> >> >> > <an...@gmail.com>:
> >> >> >>
> >> >> >> Thanks for your response. I'll narrow it down to the necessary.
> >> >> >>
> >> >> >> SEI implementation:
> >> >> >>
> >> >> >> @WebService(
> >> >> >>         serviceName = "OA_Server",
> >> >> >>         portName = "OA_ServerSoap",
> >> >> >>         targetNamespace =
> >> >> >> "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>         wsdlLocation = "classpath:OA_Server.wsdl",
> >> >> >>         endpointInterface = "org.multispeak.version_4_1_6.
> >> >> >> OA.OAServerSoap")
> >> >> >> public class OAServerSoapImpl implements OAServerSoap {
> >> >> >>
> >> >> >> ...
> >> >> >>
> >> >> >> @Override
> >> >> >>     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
> >> >> >> multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
> >> >> >> multiSpeakMsgHeader1)
> >> >> >> {
> >> >> >>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >> >> >>         try {
> >> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader);
> >> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader1);
> >> >> >>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader
> =
> >> >> >> MultiSpeakInOutHeader.of(multiSpeakMsgHeader,
> multiSpeakMsgHeader1);
> >> >> >>
> >> >> >>
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >> >>             return
> >> >> >>
> LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
> >> >> >>         } catch (Throwable t) {
> >> >> >>             throw LOG.throwing(Throwables.unchecked(t));
> >> >> >>         }
> >> >> >>     }
> >> >> >>
> >> >> >> @Override
> >> >> >> @UseAsyncMethod
> >> >> >> public ArrayOfErrorObject odEventNotification(
> >> >> >> ArrayOfOutageDetectionEvent odEvents, String transactionID,
> >> >> >> MultiSpeakMsgHeader multiSpeakMsgHeader,
> Holder<MultiSpeakMsgHeader>
> >> >> >> multiSpeakMsgHeader1) {
> >> >> >>
> >> >> >>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> >> >> >> multiSpeakMsgHeader1);
> >> >> >>         try {
> >> >> >>             Preconditions.checkNotNull(odEvents, "odEvents");
> >> >> >>             Preconditions.checkNotNull(transactionID,
> >> >> >> "transactionID");
> >> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader,
> >> >> >> "multiSpeakMsgHeader");
> >> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader1,
> >> >> >> "multiSpeakMsgHeader1");
> >> >> >>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader
> =
> >> >> >> MultiSpeakInOutHeader.of(multiSpeakMsgHeader,
> multiSpeakMsgHeader1);
> >> >> >>
> >> >> >>
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >> >>             return
> >> >> >>
> >> >> >>
> >> >> >>
> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
> >> >> >> transactionID, mspkHeader)));
> >> >> >>         } catch (Throwable t) {
> >> >> >>             throw LOG.throwing(Throwables.unchecked(t));
> >> >> >>         }
> >> >> >>     }
> >> >> >>
> >> >> >>     @Override
> >> >> >>     public Future<?> pingURLAsync(MultiSpeakMsgHeader
> >> >> >> multiSpeakMsgHeader,
> >> >> >> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >> >> >> AsyncHandler<PingURLResponse> asyncHandler) {
> >> >> >>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
> >> >> >> asyncHandler);
> >> >> >>         try {
> >> >> >>             PingURLAsync response = new PingURLAsync(this,
> >> >> >> multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >> >> >>             mExecutor.submit(response);
> >> >> >>             return LOG.exit(response.getServerAsyncResponse());
> >> >> >>         } catch (Throwable t) {
> >> >> >>             throw LOG.throwing(Throwables.unchecked(t));
> >> >> >>         }
> >> >> >>     }
> >> >> >>
> >> >> >> @Override
> >> >> >>     public Future<?>
> >> >> >> odEventNotificationAsync(ArrayOfOutageDetectionEvent
> >> >> >> odEvents, String transactionID, MultiSpeakMsgHeader
> >> >> >> multiSpeakMsgHeader,
> >> >> >> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >> >> >> AsyncHandler<ODEventNotificationResponse> asyncHandler) {
> >> >> >>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> >> >> >> multiSpeakMsgHeader1);
> >> >> >>         try {
> >> >> >>             OdEventNotificationAsync response = new
> >> >> >> OdEventNotificationAsync(this, odEvents, transactionID,
> >> >> >> multiSpeakMsgHeader,
> >> >> >> multiSpeakMsgHeader1, asyncHandler);
> >> >> >>             mExecutor.submit(response);
> >> >> >>             return LOG.exit(response.getServerAsyncResponse());
> >> >> >>         } catch (Throwable t) {
> >> >> >>             throw LOG.throwing(Throwables.unchecked(t));
> >> >> >>         }
> >> >> >>     }
> >> >> >>
> >> >> >> ...
> >> >> >>
> >> >> >> }
> >> >> >>
> >> >> >> To make it clear, I'll add the code to the MultiSpeakInOutHeader
> >> >> >> class:
> >> >> >>
> >> >> >> public final class MultiSpeakInOutHeader<T> {
> >> >> >>
> >> >> >>     private final T mIn;
> >> >> >>     private final Holder<T> mOut;
> >> >> >>
> >> >> >>     private MultiSpeakInOutHeader(T in, Holder<T> out) {
> >> >> >>         Preconditions.checkNotNull(in);
> >> >> >>         Preconditions.checkNotNull(out);
> >> >> >>         mIn = in;
> >> >> >>         mOut = out;
> >> >> >>     }
> >> >> >>
> >> >> >>     public T getInbound() {
> >> >> >>         return mIn;
> >> >> >>     }
> >> >> >>
> >> >> >>     public T getOutbound() {
> >> >> >>         return getHolder().value;
> >> >> >>     }
> >> >> >>
> >> >> >>     public void setOutbound(T out) {
> >> >> >>         getHolder().value = out;
> >> >> >>     }
> >> >> >>
> >> >> >>     private Holder<T> getHolder() {
> >> >> >>         return mOut;
> >> >> >>     }
> >> >> >>
> >> >> >>     public static <T> MultiSpeakInOutHeader<T> of(T inbound,
> >> >> >> Holder<T>
> >> >> >> outbound) {
> >> >> >>         return new MultiSpeakInOutHeader<T>(inbound, outbound);
> >> >> >>     }
> >> >> >> }
> >> >> >>
> >> >> >> When I invoke:
> >> >> >>
> >> >> >> Holder<MultiSpeakMsgHeader> headerOut = new
> >> >> >> Holder<MultiSpeakMsgHeader>();
> >> >> >> Future<?> future = mServer.odEventNotificationAsync(new
> >> >> >> ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
> >> >> >> headerOut,
> >> >> >> new AsyncHandlerImpl(headerOut));
> >> >> >>
> >> >> >> an NPE is thrown at HolderOutInterceptor If I use @UseAsyncMethod
> or
> >> >> >> headerOut.value is null if I don't. Now, when I invoke:
> >> >> >>
> >> >> >> Holder<MultiSpeakMsgHeader> headerOut = new
> >> >> >> Holder<MultiSpeakMsgHeader>();
> >> >> >> Future<?> future = mServer.pingURLAsync(new MultiSpeakMsgHeader(),
> >> >> >> headerOut, new AsyncHandlerImpl(headerOut));
> >> >> >>
> >> >> >> it works. The client can see the value field / no NPE is thrown.
> >> >> >>
> >> >> >> Comparing my code to the sample, I believe I'm doing it correctly:
> >> >> >>
> >> >> >> 1. The client creates the Holder object and passes it down to the
> >> >> >> method
> >> >> >> invocation
> >> >> >> 2. The server assigns the value field before returning
> >> >> >>
> >> >> >> It's rather strange that one invocation works and the other does
> >> >> >> not.
> >> >> >> The
> >> >> >> only difference between them is that pingURL has no arguments and
> >> >> >> odEventNotification has one (ArrayOfOutageDetectionEvent). I have
> >> >> >> another
> >> >> >> argumentless method that works just fine as well and another with
> >> >> >> arguments
> >> >> >> that does not, so I think the problem lies in the number of
> >> >> >> arguments
> >> >> >> somehow or how the Holder types are manipulated.
> >> >> >>
> >> >> >> If the test that you linked me to works in the current release of
> >> >> >> CXF,
> >> >> >> maybe I have something wrong with my configuration?
> >> >> >> I will run that same test in my machine to see how it goes.
> >> >> >>
> >> >> >> Thanks.
> >> >> >>
> >> >> >> Regards,
> >> >> >>
> >> >> >>
> >> >> >> André Costa Lima
> >> >> >>
> >> >> >>
> >> >> >> 2014-12-01 15:04 GMT+00:00 Aki Yoshida <el...@gmail.com>:
> >> >> >>>
> >> >> >>> Your post is kind of too long and I am not really seeing how your
> >> >> >>> client is calling the method and how your service is setting the
> >> >> >>> value,
> >> >> >>> Could you compare that to the cxf's sample code at
> >> >> >>>
> samples/soap_header/src/main/java/demo/soap_header/(client|server)?
> >> >> >>>
> >> >> >>>
> >> >> >>> 2014-11-28 18:21 GMT+01:00 André Costa Lima
> >> >> >>> <an...@gmail.com>:
> >> >> >>> > Hello,
> >> >> >>> >
> >> >> >>> > I am a new CXF (v3.0.0) user. Actually, I am new to the whole
> >> >> >>> > JAX-WS
> >> >> >>> > thing.
> >> >> >>> > :)
> >> >> >>> > I have set up a JAX-WS service, SOAP over JMS with ActiveMQ.
> The
> >> >> >>> > server
> >> >> >>> > methods invocations are working fine, but I am having some
> >> >> >>> > trouble
> >> >> >>> > regarding the Holder class.
> >> >> >>> > I am using the holder class as a container for the outgoing
> SOAP
> >> >> >>> > header
> >> >> >>> > for
> >> >> >>> > all web methods, as specified in the WSDL.
> >> >> >>> > I started from WSDL first with Spring configuration for both
> >> >> >>> > clients
> >> >> >>> > and
> >> >> >>> > servers.
> >> >> >>> > I have provided an async binding to the wsdl2java tool to
> >> >> >>> > generate
> >> >> >>> > the
> >> >> >>> > async method signatures, because I want to use those instead of
> >> >> >>> > the
> >> >> >>> > sync
> >> >> >>> > ones.
> >> >> >>> >
> >> >> >>> > The problem is that when I pass the Holder object to the client
> >> >> >>> > method
> >> >> >>> > and
> >> >> >>> > assign the value field in the server, the client sees it as
> null
> >> >> >>> > but
> >> >> >>> > no
> >> >> >>> > exception is thrown.
> >> >> >>> > Further, if I put the @UseAsyncMethod annotation to command CXF
> >> >> >>> > to
> >> >> >>> > use
> >> >> >>> > the
> >> >> >>> > pure async method I have implemented, CXF throws NPE at
> >> >> >>> > HolderOutInterceptor class.
> >> >> >>> > I noticed that if the web method has no arguments besides the
> >> >> >>> > SOAP
> >> >> >>> > headers
> >> >> >>> > everything works just fine, otherwise what I have described
> above
> >> >> >>> > happens.
> >> >> >>> >
> >> >> >>> > Below there are my configurations.
> >> >> >>> >
> >> >> >>> > Maven plugin:
> >> >> >>> >
> >> >> >>> > <plugin>
> >> >> >>> > <groupId>org.apache.cxf</groupId>
> >> >> >>> >           <artifactId>cxf-codegen-plugin</artifactId>
> >> >> >>> >           <executions>
> >> >> >>> >           <execution>
> >> >> >>> >                     <id>generate-sources</id>
> >> >> >>> >                               <phase>generate-sources</phase>
> >> >> >>> >                               <configuration>
> >> >> >>> >                               <defaultOptions>
> >> >> >>> >                                         <bindingFiles>
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> <bindingFile>${basedir}/src/main/resources/oa_types-binding.xml</bindingFile>
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> <bindingFile>${basedir}/src/main/resources/oa_async-binding.xml</bindingFile>
> >> >> >>> >                                         </bindingFiles>
> >> >> >>> >
> >> >> >>> > <noAddressBinding>true</noAddressBinding>
> >> >> >>> >                                     </defaultOptions>
> >> >> >>> >                                     <sourceRoot>
> >> >> >>> >
> >> >> >>> > ${basedir}/target/generated-sources/cxf
> >> >> >>> >                                     </sourceRoot>
> >> >> >>> >                                     <wsdlOptions>
> >> >> >>> >                                         <wsdlOption>
> >> >> >>> >
> >> >> >>> > <wsdl>${basedir}/src/main/resources/OA_Server.wsdl</wsdl>
> >> >> >>> >
> >> >> >>> > <wsdlLocation>classpath:OA_Server.wsdl</wsdlLocation>
> >> >> >>> >                                             <extraargs>
> >> >> >>> >
> >> >> >>> > <extraarg>-p</extraarg>
> >> >> >>> >                                                 <extraarg>
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> http://www.multispeak.org/Version_4.1_Release=org.multispeak.version_4_1_6.OA
> >> >> >>> > </extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>-p</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>cpsm_V4.1_Release=org.cspm.version_4_1.OA</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>-p</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>gml_V4.1_Release=org.gml.version_4_1.OA</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>-p</extraarg>
> >> >> >>> >                                                 <extraarg>
> >> >> >>> > http://www.w3.org/1999/xlink=org.w3.xlink.OA</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>-p</extraarg>
> >> >> >>> >                                                 <extraarg>
> >> >> >>> > http://www.w3.org/2001/XMLSchema=org.w3.xmlschema.OA
> </extraarg>
> >> >> >>> >                                                 <!--
> >> >> >>> > <extraarg>-p</extraarg> -->
> >> >> >>> >                                                 <!--
> >> >> >>> > <extraarg>org.multispeak.version_4_1_6.OA</extraarg> -->
> >> >> >>> >                                                 <!--
> >> >> >>> > <extraarg>-impl</extraarg> -->
> >> >> >>> >                                                 <!--
> >> >> >>> > <extraarg>-server</extraarg> -->
> >> >> >>> >                                                 <!--
> >> >> >>> > <extraarg>-client</extraarg> -->
> >> >> >>> >
> >> >> >>> > <extraarg>-autoNameResolution</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>-fe</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>jaxws21</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>-exsh</extraarg>
> >> >> >>> >
> >> >> >>> > <extraarg>true</extraarg>
> >> >> >>> >                                             </extraargs>
> >> >> >>> >                                         </wsdlOption>
> >> >> >>> >                                     </wsdlOptions>
> >> >> >>> >                                 </configuration>
> >> >> >>> >                                 <goals>
> >> >> >>> >                                     <goal>wsdl2java</goal>
> >> >> >>> >                                 </goals>
> >> >> >>> > </execution>
> >> >> >>> > </executions>
> >> >> >>> > </plugin>
> >> >> >>> >
> >> >> >>> > Spring:
> >> >> >>> >
> >> >> >>> >     <beans:bean id="connection-factory"
> >> >> >>> > class="org.apache.activemq.ActiveMQConnectionFactory">
> >> >> >>> >         <beans:property name="brokerURL"
> >> >> >>> > value="${outside.multispeak.jms.broker}"/>
> >> >> >>> >     </beans:bean>
> >> >> >>> >
> >> >> >>> >     <beans:bean id="pooled-connection-factory"
> >> >> >>> > class="org.apache.activemq.pool.PooledConnectionFactory"
> >> >> >>> > destroy-method="stop">
> >> >> >>> >         <beans:constructor-arg index="0"
> >> >> >>> > ref="connection-factory"/>
> >> >> >>> >         <beans:property name="expiryTimeout"
> >> >> >>> > value="${outside.multispeak.jms.pool.expiryTimeout}"/>
> >> >> >>> >     </beans:bean>
> >> >> >>> >
> >> >> >>> > <!-- multispeak call handling interface (OA) -->
> >> >> >>> >
> >> >> >>> >         <!-- client side -->
> >> >> >>> >
> >> >> >>> >         <jaxws:client
> >> >> >>> >             id="multispeak-oa-client"
> >> >> >>> >
> >> >> >>> > xmlns:ns="http://www.multispeak.org/Version_4.1_Release"
> >> >> >>> >
> >> >> >>> > serviceClass="org.multispeak.version_4_1_6.OA.OAServerSoap"
> >> >> >>> >             serviceName="ns:OA_Server"
> >> >> >>> >             endpointName="ns:OA_ServerSoap"
> >> >> >>> >             address="#{'jms:queue:'
> >> >> >>> >                 + '${outside.multispeak.oa.jms.queue}'
> >> >> >>> >                 + '?timeToLive=' +
> >> >> >>> > '${outside.multispeak.jms.timeToLive}'
> >> >> >>> >                 + '&amp;requestTimeout' +
> >> >> >>> > '${outside.multispeak.jms.receiveTimeout}'}"
> >> >> >>> >             wsdlLocation="classpath:OA_Server.wsdl">
> >> >> >>> >             <jaxws:features>
> >> >> >>> >                 <beans:bean
> >> >> >>> > class="org.apache.cxf.feature.LoggingFeature "/>
> >> >> >>> >                 <beans:bean
> >> >> >>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
> >> >> >>> >                     <beans:constructor-arg index="0"
> >> >> >>> > ref="pooled-connection-factory"/>
> >> >> >>> >                 </beans:bean>
> >> >> >>> >             </jaxws:features>
> >> >> >>> >            </jaxws:client>
> >> >> >>> >
> >> >> >>> >         <!-- server side -->
> >> >> >>> >
> >> >> >>> >         <beans:bean id="forwarding-oa-server"
> >> >> >>> > class="${outside.multispeak.oa.server}" />
> >> >> >>> >         <beans:bean id="multispeak-oa-obj-factory"
> >> >> >>> > class="org.multispeak.version_4_1_6.OA.ObjectFactory" />
> >> >> >>> >
> >> >> >>> >         <jaxws:endpoint
> >> >> >>> >             id="multispeak-oa-server"
> >> >> >>> >
> >> >> >>> > xmlns:tns="http://www.multispeak.org/Version_4.1_Release"
> >> >> >>> >
> >> >> >>> > implementor="x.x.outside.multispeak.oa.server.OAServerSoapImpl"
> >> >> >>> >             serviceName="tns:OA_Server"
> >> >> >>> >             endpointName="tns:OA_ServerSoap"
> >> >> >>> >             address="#{'jms:queue:' +
> >> >> >>> > '${outside.multispeak.oa.jms.queue}'
> >> >> >>> > + ''}"
> >> >> >>> >             publish="false"
> >> >> >>> >             wsdlLocation="classpath:OA_Server.wsdl">
> >> >> >>> >             <jaxws:features>
> >> >> >>> >                 <beans:bean
> >> >> >>> > class="org.apache.cxf.feature.LoggingFeature "/>
> >> >> >>> >                 <beans:bean
> >> >> >>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
> >> >> >>> >                     <beans:constructor-arg index="0"
> >> >> >>> > ref="pooled-connection-factory"/>
> >> >> >>> >                 </beans:bean>
> >> >> >>> >             </jaxws:features>
> >> >> >>> >         </jaxws:endpoint>
> >> >> >>> >
> >> >> >>> > The Service Endpoint Interface generated.
> >> >> >>> > There are two methods: pingURL and odEventNotification.
> >> >> >>> > pingURLAsync, as it has no arguments besides the headers, works
> >> >> >>> > just
> >> >> >>> > fine,
> >> >> >>> > but odEventNotificationAsync does not.
> >> >> >>> > Note that I am using an AsyncHandler of course. In case of
> >> >> >>> > pingURLAsync
> >> >> >>> > I
> >> >> >>> > can get Holder.value in the handleResponse(Response<T>)
> callback
> >> >> >>> > without
> >> >> >>> > any problems.
> >> >> >>> >
> >> >> >>> > @WebService(targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > name = "OA_ServerSoap")
> >> >> >>> > @XmlSeeAlso({ObjectFactory.class,
> >> >> >>> > org.w3.xlink.OA.ObjectFactory.class,
> >> >> >>> > org.gml.version_4_1.OA.ObjectFactory.class,
> >> >> >>> > org.cspm.version_4_1.OA.ObjectFactory.class})
> >> >> >>> > public interface OAServerSoap {
> >> >> >>> >
> >> >> >>> > ...
> >> >> >>> >
> >> >> >>> > @RequestWrapper(localName = "PingURL", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
> >> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
> >> >> >>> > targetNamespace
> >> >> >>> > = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >> >> >>> >     @WebMethod(operationName = "PingURL")
> >> >> >>> >     public
> >> >> >>> > Response<org.multispeak.version_4_1_6.OA.PingURLResponse>
> >> >> >>> > pingURLAsync(
> >> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader",
> targetNamespace =
> >> >> >>> > "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >> >>> > "MultiSpeakMsgHeader",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > header =
> >> >> >>> > true)
> >> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >> >>> > multiSpeakMsgHeader1
> >> >> >>> >     );
> >> >> >>> >
> >> >> >>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
> >> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
> >> >> >>> > targetNamespace
> >> >> >>> > = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >> >> >>> >     @WebMethod(operationName = "PingURL")
> >> >> >>> >     public Future<?> pingURLAsync(
> >> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader",
> targetNamespace =
> >> >> >>> > "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >> >>> > "MultiSpeakMsgHeader",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > header =
> >> >> >>> > true)
> >> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >> >>> > multiSpeakMsgHeader1,
> >> >> >>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
> >> >> >>> >
> >> >> >>> > AsyncHandler<org.multispeak.version_4_1_6.OA.PingURLResponse>
> >> >> >>> > asyncHandler
> >> >> >>> >     );
> >> >> >>> >
> >> >> >>> >     /**
> >> >> >>> >      * Requester pings URL of OA to see if it is alive.
> Returns
> >> >> >>> > errorObject(s) as necessary to communicate application status.
> >> >> >>> >      */
> >> >> >>> >     @WebResult(name = "PingURLResult", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >> >>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
> >> >> >>> >     @WebMethod(operationName = "PingURL", action = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release/PingURL")
> >> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
> >> >> >>> > targetNamespace
> >> >> >>> > = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >> >> >>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
> >> >> >>> > pingURL(
> >> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader",
> targetNamespace =
> >> >> >>> > "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >> >>> > "MultiSpeakMsgHeader",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > header =
> >> >> >>> > true)
> >> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >> >>> > multiSpeakMsgHeader1
> >> >> >>> >     );
> >> >> >>> >
> >> >> >>> > @RequestWrapper(localName = "ODEventNotification",
> >> >> >>> > targetNamespace =
> >> >> >>> > "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >> >> >>> >     @WebMethod(operationName = "ODEventNotification")
> >> >> >>> >     public
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> Response<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> >> >> >>> > odEventNotificationAsync(
> >> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >> >>> >
> >> >> >>> > org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> >> >> >>> > odEvents,
> >> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >> >>> >         java.lang.String transactionID,
> >> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader",
> targetNamespace =
> >> >> >>> > "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >> >>> > "MultiSpeakMsgHeader",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > header =
> >> >> >>> > true)
> >> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >> >>> > multiSpeakMsgHeader1
> >> >> >>> >     );
> >> >> >>> >
> >> >> >>> >     @RequestWrapper(localName = "ODEventNotification",
> >> >> >>> > targetNamespace
> >> >> >>> > = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >> >> >>> >     @WebMethod(operationName = "ODEventNotification")
> >> >> >>> >     public Future<?> odEventNotificationAsync(
> >> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >> >>> >
> >> >> >>> > org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> >> >> >>> > odEvents,
> >> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >> >>> >         java.lang.String transactionID,
> >> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader",
> targetNamespace =
> >> >> >>> > "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >> >>> > "MultiSpeakMsgHeader",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > header =
> >> >> >>> > true)
> >> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >> >>> > multiSpeakMsgHeader1,
> >> >> >>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> AsyncHandler<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> >> >> >>> > asyncHandler
> >> >> >>> >     );
> >> >> >>> >
> >> >> >>> >     /**
> >> >> >>> >      * Publisher notifies OA of a change in
> OutageDetectionEvents
> >> >> >>> > by
> >> >> >>> > sending an array of changed OutageDetectionEvent objects.  OA
> >> >> >>> > returns
> >> >> >>> > information about failed transactions using an array of
> >> >> >>> > errorObjects.
> >> >> >>> > The
> >> >> >>> > message header attribute 'registrationID' should be added to
> all
> >> >> >>> > publish
> >> >> >>> > messages to indicate to the subscriber under which
> registrationID
> >> >> >>> > they
> >> >> >>> > received this notification data.
> >> >> >>> >      */
> >> >> >>> >     @WebResult(name = "ODEventNotificationResult",
> >> >> >>> > targetNamespace =
> >> >> >>> > "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >> >>> >     @RequestWrapper(localName = "ODEventNotification",
> >> >> >>> > targetNamespace
> >> >> >>> > = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >> >> >>> >     @WebMethod(operationName = "ODEventNotification", action =
> "
> >> >> >>> >
> >> >> >>> >
> http://www.multispeak.org/Version_4.1_Release/ODEventNotification")
> >> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > className =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >> >> >>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
> >> >> >>> > odEventNotification(
> >> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >> >>> >
> >> >> >>> > org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> >> >> >>> > odEvents,
> >> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >> >>> >         java.lang.String transactionID,
> >> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader",
> targetNamespace =
> >> >> >>> > "
> >> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >> >>> > "MultiSpeakMsgHeader",
> >> >> >>> > targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> > header =
> >> >> >>> > true)
> >> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >> >>> > multiSpeakMsgHeader1
> >> >> >>> >     );
> >> >> >>> >
> >> >> >>> > ...
> >> >> >>> >
> >> >> >>> > The SEI implementation.
> >> >> >>> > Both pingURL and odEventNotification simply forward the call
> to a
> >> >> >>> > delegate.
> >> >> >>> > Both inbound and outbound headers are placed in a common
> >> >> >>> > container
> >> >> >>> > and
> >> >> >>> > handed over to the delegate.
> >> >> >>> > The async methods simply execute the calls in background and
> end
> >> >> >>> > up
> >> >> >>> > calling
> >> >> >>> > the sync methods internally.
> >> >> >>> > The line
> >> >> >>> >
> >> >> >>> >
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >> >>> > simply calls multiSpeakMsgHeader1.value = ...
> >> >> >>> >
> >> >> >>> > @WebService(
> >> >> >>> >         serviceName = "OA_Server",
> >> >> >>> >         portName = "OA_ServerSoap",
> >> >> >>> >         targetNamespace =
> >> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >> >>> >         wsdlLocation = "classpath:OA_Server.wsdl",
> >> >> >>> >         endpointInterface =
> >> >> >>> > "org.multispeak.version_4_1_6.OA.OAServerSoap")
> >> >> >>> > public class OAServerSoapImpl implements OAServerSoap {
> >> >> >>> >
> >> >> >>> > ...
> >> >> >>> >
> >> >> >>> > @Override
> >> >> >>> >     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
> >> >> >>> > multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
> >> >> >>> > multiSpeakMsgHeader1)
> >> >> >>> > {
> >> >> >>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >> >> >>> >         try {
> >> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader);
> >> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1);
> >> >> >>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader>
> mspkHeader
> >> >> >>> > =
> >> >> >>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader,
> >> >> >>> > multiSpeakMsgHeader1);
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >> >>> >             return
> >> >> >>> >
> >> >> >>> >
> LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
> >> >> >>> >         } catch (Throwable t) {
> >> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
> >> >> >>> >         }
> >> >> >>> >     }
> >> >> >>> >
> >> >> >>> > @Override
> >> >> >>> > @UseAsyncMethod
> >> >> >>> > public ArrayOfErrorObject
> >> >> >>> > odEventNotification(ArrayOfOutageDetectionEvent
> >> >> >>> > odEvents, String transactionID, MultiSpeakMsgHeader
> >> >> >>> > multiSpeakMsgHeader,
> >> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
> >> >> >>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> >> >> >>> > multiSpeakMsgHeader1);
> >> >> >>> >         try {
> >> >> >>> >             Preconditions.checkNotNull(odEvents, "odEvents");
> >> >> >>> >             Preconditions.checkNotNull(transactionID,
> >> >> >>> > "transactionID");
> >> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader,
> >> >> >>> > "multiSpeakMsgHeader");
> >> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1,
> >> >> >>> > "multiSpeakMsgHeader1");
> >> >> >>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader>
> mspkHeader
> >> >> >>> > =
> >> >> >>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader,
> >> >> >>> > multiSpeakMsgHeader1);
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >> >>> >             return
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
> >> >> >>> > transactionID, mspkHeader)));
> >> >> >>> >         } catch (Throwable t) {
> >> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
> >> >> >>> >         }
> >> >> >>> >     }
> >> >> >>> >
> >> >> >>> >     @Override
> >> >> >>> >     public Future<?> pingURLAsync(MultiSpeakMsgHeader
> >> >> >>> > multiSpeakMsgHeader,
> >> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >> >> >>> > AsyncHandler<PingURLResponse> asyncHandler) {
> >> >> >>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
> >> >> >>> > asyncHandler);
> >> >> >>> >         try {
> >> >> >>> >             PingURLAsync response = new PingURLAsync(this,
> >> >> >>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >> >> >>> >             mExecutor.submit(response);
> >> >> >>> >             return LOG.exit(response.getServerAsyncResponse());
> >> >> >>> >         } catch (Throwable t) {
> >> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
> >> >> >>> >         }
> >> >> >>> >     }
> >> >> >>> >
> >> >> >>> > @Override
> >> >> >>> >     public Future<?>
> >> >> >>> > odEventNotificationAsync(ArrayOfOutageDetectionEvent
> >> >> >>> > odEvents, String transactionID, MultiSpeakMsgHeader
> >> >> >>> > multiSpeakMsgHeader,
> >> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >> >> >>> > AsyncHandler<ODEventNotificationResponse> asyncHandler) {
> >> >> >>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> >> >> >>> > multiSpeakMsgHeader1);
> >> >> >>> >         try {
> >> >> >>> >             OdEventNotificationAsync response = new
> >> >> >>> > OdEventNotificationAsync(this, odEvents, transactionID,
> >> >> >>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >> >> >>> >             mExecutor.submit(response);
> >> >> >>> >             return LOG.exit(response.getServerAsyncResponse());
> >> >> >>> >         } catch (Throwable t) {
> >> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
> >> >> >>> >         }
> >> >> >>> >     }
> >> >> >>> >
> >> >> >>> > ...
> >> >> >>> >
> >> >> >>> > The invocation test.
> >> >> >>> >
> >> >> >>> > ...
> >> >> >>> > Holder<MultiSpeakMsgHeader> headerOut = new
> >> >> >>> > Holder<MultiSpeakMsgHeader>();
> >> >> >>> > Future<?> future = mServer.odEventNotificationAsync(new
> >> >> >>> > ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
> >> >> >>> > headerOut,
> >> >> >>> > new AsyncHandlerImpl(headerOut));
> >> >> >>> > ...
> >> >> >>> > private static class AsyncHandlerImpl implements
> >> >> >>> > AsyncHandler<ODEventNotificationResponse> {
> >> >> >>> >
> >> >> >>> >         private static final XLogger LOG =
> >> >> >>> > XLoggerFactory.getXLogger(AsyncHandlerImpl.class);
> >> >> >>> >
> >> >> >>> >         private final Holder<MultiSpeakMsgHeader> mHeaderOut;
> >> >> >>> >
> >> >> >>> >         public AsyncHandlerImpl(Holder<MultiSpeakMsgHeader>
> >> >> >>> > headerOut)
> >> >> >>> > {
> >> >> >>> >             mHeaderOut = headerOut;
> >> >> >>> >         }
> >> >> >>> >
> >> >> >>> >         @Override
> >> >> >>> >         public void
> >> >> >>> > handleResponse(Response<ODEventNotificationResponse>
> >> >> >>> > res) {
> >> >> >>> >             try {
> >> >> >>> >                 if (LOG.isTraceEnabled()) {
> >> >> >>> >                     LOG.trace("Callback: {}", res.toString());
> >> >> >>> >                 }
> >> >> >>> >                 ODEventNotificationResponse mspkRsp =
> res.get();
> >> >> >>> >                 if (LOG.isTraceEnabled()) {
> >> >> >>> >                     LOG.trace("OA odEventNotificationAsync() >>
> >> >> >>> > callback:
> >> >> >>> > {} > multispeak header: {}", mspkRsp.toString(),
> >> >> >>> > mHeaderOut.value);
> >> >> >>> > //                    for (Entry<String, Object> entry :
> >> >> >>> > res.getContext().entrySet()) {
> >> >> >>> > //                        LOG.trace("Response context >>
> string >
> >> >> >>> > {}
> >> >> >>> > >>
> >> >> >>> > object > {}", entry.getKey(), entry.getValue());
> >> >> >>> > //                    }
> >> >> >>> >                 }
> >> >> >>> >             } catch (Exception e) {
> >> >> >>> >                 LOG.catching(e);
> >> >> >>> >             }
> >> >> >>> >         }
> >> >> >>> >     }
> >> >> >>> >
> >> >> >>> > As I said above, a NPE is thrown in HolderOutInterceptor when
> the
> >> >> >>> > response
> >> >> >>> > is returned to the client if I use the pure async method with
> >> >> >>> > @UseAsyncMethod,
> >> >> >>> > or mHeaderOut.value is null if I don't. Now, the stacktrace:
> >> >> >>> >
> >> >> >>> > 28-11-2014 17:15:07.997 WARN  [OA Thread-#1]
> >> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor
> >> >> >>> > for {
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}ODEventNotification
> >> >> >>> > has thrown exception, unwinding now
> >> >> >>> > java.lang.NullPointerException
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.jaxws.interceptors.HolderOutInterceptor.handleMessage(HolderOutInterceptor.java:90)
> >> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:81)
> >> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)
> >> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
> >> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.jms.continuations.JMSContinuation.doResume(JMSContinuation.java:109)
> >> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.jms.continuations.JMSContinuation.resume(JMSContinuation.java:98)
> >> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker$JaxwsServerHandler.handleResponse(AbstractJAXWSMethodInvoker.java:193)
> >> >> >>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireResult(AbstractAsyncResponseHandler.java:55)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireAsyncResult(AbstractAsyncResponseHandler.java:46)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.postProcess(AbstractAsyncResponseHandler.java:41)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable$1.invoke(ConditionEnforcerHandlerRunnable.java:10)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.common.util.ConditionEnforcerHandler$2.invoke(ConditionEnforcerHandler.java:25)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.common.util.ExceptionHandler.handle(ExceptionHandler.java:7)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.common.util.ConditionEnforcerHandler.handle(ConditionEnforcerHandler.java:20)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable.run(ConditionEnforcerHandlerRunnable.java:7)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> >> >> >>> > 28-11-2014 17:15:08.044 TRACE [ActiveMQ Session Task-1]
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> >> >> >>> > handleResponse - Callback:
> >> >> >>> > org.apache.cxf.jaxws.JaxwsClientCallback$2@cc6f8c
> >> >> >>> > 28-11-2014 17:15:08.044 ERROR [ActiveMQ Session Task-1]
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> >> >> >>> > handleResponse - catching
> >> >> >>> > java.util.concurrent.ExecutionException:
> >> >> >>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> >> >> >>> > processing.
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.jaxws.JaxwsClientCallback$2.get(JaxwsClientCallback.java:99)
> >> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl.handleResponse(OAServerTestAsyncCallback.java:81)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.jaxws.JaxwsClientCallback.handleException(JaxwsClientCallback.java:87)
> >> >> >>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:821)
> >> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> >> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> >> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> >> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> >> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> >> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> >> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> >> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> >> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> >> >> >>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault
> occurred
> >> >> >>> > while
> >> >> >>> > processing.
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     ... 11 more
> >> >> >>> > 28-11-2014 17:15:08.045 ERROR
> >> >> >>> > [x.x.outside.test.multispeak.OAServerTestAsyncCallback-1]
> >> >> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback run -
> >> >> >>> > catching
> >> >> >>> > java.util.concurrent.ExecutionException:
> >> >> >>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> >> >> >>> > processing.
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.endpoint.ClientCallback.get(ClientCallback.java:169)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.jaxws.JaxwsResponseCallback.get(JaxwsResponseCallback.java:54)
> >> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$1.run(OAServerTestAsyncCallback.java:52)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> x.x.outside.test.multispeak.spi.AbstractMultispeakServerTest$2.run(AbstractMultispeakServerTest.java:112)
> >> >> >>> > [classes/:?]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> >> >> >>> > [?:1.6.0_33]
> >> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> >> >> >>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault
> occurred
> >> >> >>> > while
> >> >> >>> > processing.
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> >> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> >> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> >> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> >> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> >> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> >> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> >> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> >> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> >> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     at
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> >> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >> >>> >     ... 3 more
> >> >> >>> >
> >> >> >>> > Is this a configuration problem? Am I doing something stupid?
> >> >> >>> > Thanks!
> >> >> >>> >
> >> >> >>> > Regards,
> >> >> >>> >
> >> >> >>> > André Costa Lima
> >> >> >>
> >> >> >>
> >> >> >
> >> >
> >> >
> >
> >
>

Re: NPE at HolderOutInterceptor / Holder.value is null

Posted by Aki Yoshida <el...@gmail.com>.
Basically, I didn't change anything which was there in jaxws_async and
soap_header, except for aligning some naming for the operation names.
The executor set at the service is actually optional and yes, this is
for the client. That shows that you can use your own executor to
process the response message. But if you don't need that, you don't
need to set it, then the cxf bus's default executor is used.

The annotated method indicates that the method will not be called if
there is async support (in other words, in that case, it's async
method is instead called).

regards, aki

2014-12-04 18:50 GMT+01:00 André Costa Lima <an...@gmail.com>:
> Thanks. I will take a look into it.
> With a quick glance, I noticed that you set an Executor on the service
> itself. I am not doing this. I just have an Executor on server side to run
> the asynchronous requests, instead of new Thread()... as shown in the
> sample. So, is that a client side Executor?
>
> If you remove @UseAsyncMethod, what is the expected behaviour if the client
> calls the async invariant?
>
>
>
> André Costa Lima
>
>
> 2014-12-04 16:54 GMT+00:00 Aki Yoshida <el...@gmail.com>:
>>
>> I just created one project that combines the soap_header and
>> jaxws_async samples. And this is working fine as one expects.
>>
>> Since this project is straightforward and will add not much value to
>> the current sample collection but rather make the collection more
>> crowded with overlapping samples, so I am not planning to add it to
>> the cxf's samples.
>>
>> I uploaded this project to my dropbox here. So you can compare it to
>> your example.
>>
>> https://www.dropbox.com/s/hexnh3jgy9o8c61/cxf_samples_jaxws_async_soap_header.tar.gz?dl=0
>>
>> regards, aki
>>
>> 2014-12-02 17:31 GMT+01:00 André Costa Lima <an...@gmail.com>:
>> > Alright. Yes, the sync case works perfectly. Should I submit a bug in
>> > JIRA?
>> >
>> > André Costa Lima
>> >
>> >
>> > 2014-12-02 16:27 GMT+00:00 Aki Yoshida <el...@gmail.com>:
>> >>
>> >> Hi André,
>> >> I thought you were getting no value returned for the synchronous case
>> >> and when using the async mode, getting an NPE from one of the
>> >> interceptors.
>> >> So I wanted to have the first issue fixed that might fix the second
>> >> issue.
>> >>
>> >> But if you didn't have any issue with the sync Holder case, I have to
>> >> look into the async case. It looks like there is some mismatch in the
>> >> defined operations and the values passed in the context. I can't tell
>> >> what is causing this issue. I have to take a look at it.
>> >>
>> >> regards, aki
>> >>
>> >> 2014-12-02 13:57 GMT+01:00 André Costa Lima <an...@gmail.com>:
>> >> > I just noticed that the sample you linked me to refers only to
>> >> > synchronous
>> >> > invocations only. The sample jaxws_async shows how to do generate
>> >> > async
>> >> > invariants of the methods and how to invoke them, but does not
>> >> > demonstrate
>> >> > how to use Holder<T> in this case. So, maybe, I'm doing it all wrong
>> >> > because
>> >> > CXF might not support this? Holder<T> works just fine in synchronous
>> >> > invocations.
>> >> >
>> >> > My SEI was not generated correctly anyways. According to the sample,
>> >> > when
>> >> > the method receives a SOAP header and produces one, wsdl2java
>> >> > generates
>> >> > a
>> >> > SEI with an Holder with Mode.INOUT. I guess the option
>> >> > -autoNameResolution
>> >> > was forcing the creation of an extra input parameter in the method. I
>> >> > had no
>> >> > conflicts, so I removed the option and now the Holder with Mode.INOUT
>> >> > is
>> >> > generated. I fixed all my methods in the SEI implementation
>> >> > accordingly.
>> >> >
>> >> > I tested my invocations again. Now the Holder receives in the
>> >> > constructor
>> >> > the input header. Without @UseAsyncMethod:
>> >> >
>> >> > Holder<MultiSpeakMsgHeader> headerOut = new
>> >> > Holder<MultiSpeakMsgHeader>(new
>> >> > MultiSpeakMsgHeader());
>> >> > Future<?> future = mServer.odEventNotificationAsync(new
>> >> > ArrayOfOutageDetectionEvent(), "0", headerOut, new
>> >> > AsyncHandlerImpl(headerOut));
>> >> >
>> >> > Still does not work. When the client reads the value field, it does
>> >> > not
>> >> > get
>> >> > the new header object created by the server.
>> >> > With @UseAsyncMethod still throws the NPE in the same line.
>> >> >
>> >> > When I invoked the argumentless method, again without
>> >> > @UseAsyncMethod:
>> >> >
>> >> > Holder<MultiSpeakMsgHeader> headerOut = new
>> >> > Holder<MultiSpeakMsgHeader>(new
>> >> > MultiSpeakMsgHeader());
>> >> > Future<?> future = mServer.pingURLAsync(headerOut, new
>> >> > AsyncHandlerImpl(headerOut));
>> >> >
>> >> > I get another exception, this time in HolderInInterceptor. (I've
>> >> > updated
>> >> > to
>> >> > 3.0.2) The stacktrace is below:
>> >> >
>> >> > 02-12-2014 12:48:28.643 WARN  [ActiveMQ Session Task-2]
>> >> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for
>> >> >
>> >> >
>> >> > {http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}PingURL
>> >> > has thrown exception, unwinding now
>> >> > java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
>> >> >     at java.util.ArrayList.rangeCheck(ArrayList.java:571)
>> >> > ~[?:1.6.0_33]
>> >> >     at java.util.ArrayList.get(ArrayList.java:349) ~[?:1.6.0_33]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.cxf.jaxws.interceptors.HolderInInterceptor.handleMessage(HolderInInterceptor.java:67)
>> >> > ~[cxf-rt-frontend-jaxws-3.0.2.jar:3.0.2]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >> > [cxf-core-3.0.2.jar:3.0.2]
>> >> >     at
>> >> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
>> >> > [cxf-core-3.0.2.jar:3.0.2]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
>> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
>> >> >     at
>> >> >
>> >> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
>> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
>> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
>> >> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>> >> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>> >> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>> >> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >     at
>> >> >
>> >> >
>> >> > org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>> >> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >     at
>> >> >
>> >> >
>> >> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> >> > [?:1.6.0_33]
>> >> >     at
>> >> >
>> >> >
>> >> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> >> > [?:1.6.0_33]
>> >> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> >> >
>> >> > So maybe there is an issue when manipulating Holder objects in async
>> >> > invocations of methods with arguments?
>> >> >
>> >> > André Costa Lima
>> >> >
>> >> >
>> >> > 2014-12-01 15:44 GMT+00:00 André Costa Lima
>> >> > <an...@gmail.com>:
>> >> >>
>> >> >> Thanks for your response. I'll narrow it down to the necessary.
>> >> >>
>> >> >> SEI implementation:
>> >> >>
>> >> >> @WebService(
>> >> >>         serviceName = "OA_Server",
>> >> >>         portName = "OA_ServerSoap",
>> >> >>         targetNamespace =
>> >> >> "http://www.multispeak.org/Version_4.1_Release",
>> >> >>         wsdlLocation = "classpath:OA_Server.wsdl",
>> >> >>         endpointInterface = "org.multispeak.version_4_1_6.
>> >> >> OA.OAServerSoap")
>> >> >> public class OAServerSoapImpl implements OAServerSoap {
>> >> >>
>> >> >> ...
>> >> >>
>> >> >> @Override
>> >> >>     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
>> >> >> multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
>> >> >> multiSpeakMsgHeader1)
>> >> >> {
>> >> >>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >> >>         try {
>> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader);
>> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader1);
>> >> >>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
>> >> >> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >> >>
>> >> >> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >> >>             return
>> >> >> LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
>> >> >>         } catch (Throwable t) {
>> >> >>             throw LOG.throwing(Throwables.unchecked(t));
>> >> >>         }
>> >> >>     }
>> >> >>
>> >> >> @Override
>> >> >> @UseAsyncMethod
>> >> >> public ArrayOfErrorObject odEventNotification(
>> >> >> ArrayOfOutageDetectionEvent odEvents, String transactionID,
>> >> >> MultiSpeakMsgHeader multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
>> >> >> multiSpeakMsgHeader1) {
>> >> >>
>> >> >>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> >> >> multiSpeakMsgHeader1);
>> >> >>         try {
>> >> >>             Preconditions.checkNotNull(odEvents, "odEvents");
>> >> >>             Preconditions.checkNotNull(transactionID,
>> >> >> "transactionID");
>> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader,
>> >> >> "multiSpeakMsgHeader");
>> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader1,
>> >> >> "multiSpeakMsgHeader1");
>> >> >>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
>> >> >> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >> >>
>> >> >> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >> >>             return
>> >> >>
>> >> >>
>> >> >> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
>> >> >> transactionID, mspkHeader)));
>> >> >>         } catch (Throwable t) {
>> >> >>             throw LOG.throwing(Throwables.unchecked(t));
>> >> >>         }
>> >> >>     }
>> >> >>
>> >> >>     @Override
>> >> >>     public Future<?> pingURLAsync(MultiSpeakMsgHeader
>> >> >> multiSpeakMsgHeader,
>> >> >> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >> >> AsyncHandler<PingURLResponse> asyncHandler) {
>> >> >>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
>> >> >> asyncHandler);
>> >> >>         try {
>> >> >>             PingURLAsync response = new PingURLAsync(this,
>> >> >> multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>> >> >>             mExecutor.submit(response);
>> >> >>             return LOG.exit(response.getServerAsyncResponse());
>> >> >>         } catch (Throwable t) {
>> >> >>             throw LOG.throwing(Throwables.unchecked(t));
>> >> >>         }
>> >> >>     }
>> >> >>
>> >> >> @Override
>> >> >>     public Future<?>
>> >> >> odEventNotificationAsync(ArrayOfOutageDetectionEvent
>> >> >> odEvents, String transactionID, MultiSpeakMsgHeader
>> >> >> multiSpeakMsgHeader,
>> >> >> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >> >> AsyncHandler<ODEventNotificationResponse> asyncHandler) {
>> >> >>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> >> >> multiSpeakMsgHeader1);
>> >> >>         try {
>> >> >>             OdEventNotificationAsync response = new
>> >> >> OdEventNotificationAsync(this, odEvents, transactionID,
>> >> >> multiSpeakMsgHeader,
>> >> >> multiSpeakMsgHeader1, asyncHandler);
>> >> >>             mExecutor.submit(response);
>> >> >>             return LOG.exit(response.getServerAsyncResponse());
>> >> >>         } catch (Throwable t) {
>> >> >>             throw LOG.throwing(Throwables.unchecked(t));
>> >> >>         }
>> >> >>     }
>> >> >>
>> >> >> ...
>> >> >>
>> >> >> }
>> >> >>
>> >> >> To make it clear, I'll add the code to the MultiSpeakInOutHeader
>> >> >> class:
>> >> >>
>> >> >> public final class MultiSpeakInOutHeader<T> {
>> >> >>
>> >> >>     private final T mIn;
>> >> >>     private final Holder<T> mOut;
>> >> >>
>> >> >>     private MultiSpeakInOutHeader(T in, Holder<T> out) {
>> >> >>         Preconditions.checkNotNull(in);
>> >> >>         Preconditions.checkNotNull(out);
>> >> >>         mIn = in;
>> >> >>         mOut = out;
>> >> >>     }
>> >> >>
>> >> >>     public T getInbound() {
>> >> >>         return mIn;
>> >> >>     }
>> >> >>
>> >> >>     public T getOutbound() {
>> >> >>         return getHolder().value;
>> >> >>     }
>> >> >>
>> >> >>     public void setOutbound(T out) {
>> >> >>         getHolder().value = out;
>> >> >>     }
>> >> >>
>> >> >>     private Holder<T> getHolder() {
>> >> >>         return mOut;
>> >> >>     }
>> >> >>
>> >> >>     public static <T> MultiSpeakInOutHeader<T> of(T inbound,
>> >> >> Holder<T>
>> >> >> outbound) {
>> >> >>         return new MultiSpeakInOutHeader<T>(inbound, outbound);
>> >> >>     }
>> >> >> }
>> >> >>
>> >> >> When I invoke:
>> >> >>
>> >> >> Holder<MultiSpeakMsgHeader> headerOut = new
>> >> >> Holder<MultiSpeakMsgHeader>();
>> >> >> Future<?> future = mServer.odEventNotificationAsync(new
>> >> >> ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
>> >> >> headerOut,
>> >> >> new AsyncHandlerImpl(headerOut));
>> >> >>
>> >> >> an NPE is thrown at HolderOutInterceptor If I use @UseAsyncMethod or
>> >> >> headerOut.value is null if I don't. Now, when I invoke:
>> >> >>
>> >> >> Holder<MultiSpeakMsgHeader> headerOut = new
>> >> >> Holder<MultiSpeakMsgHeader>();
>> >> >> Future<?> future = mServer.pingURLAsync(new MultiSpeakMsgHeader(),
>> >> >> headerOut, new AsyncHandlerImpl(headerOut));
>> >> >>
>> >> >> it works. The client can see the value field / no NPE is thrown.
>> >> >>
>> >> >> Comparing my code to the sample, I believe I'm doing it correctly:
>> >> >>
>> >> >> 1. The client creates the Holder object and passes it down to the
>> >> >> method
>> >> >> invocation
>> >> >> 2. The server assigns the value field before returning
>> >> >>
>> >> >> It's rather strange that one invocation works and the other does
>> >> >> not.
>> >> >> The
>> >> >> only difference between them is that pingURL has no arguments and
>> >> >> odEventNotification has one (ArrayOfOutageDetectionEvent). I have
>> >> >> another
>> >> >> argumentless method that works just fine as well and another with
>> >> >> arguments
>> >> >> that does not, so I think the problem lies in the number of
>> >> >> arguments
>> >> >> somehow or how the Holder types are manipulated.
>> >> >>
>> >> >> If the test that you linked me to works in the current release of
>> >> >> CXF,
>> >> >> maybe I have something wrong with my configuration?
>> >> >> I will run that same test in my machine to see how it goes.
>> >> >>
>> >> >> Thanks.
>> >> >>
>> >> >> Regards,
>> >> >>
>> >> >>
>> >> >> André Costa Lima
>> >> >>
>> >> >>
>> >> >> 2014-12-01 15:04 GMT+00:00 Aki Yoshida <el...@gmail.com>:
>> >> >>>
>> >> >>> Your post is kind of too long and I am not really seeing how your
>> >> >>> client is calling the method and how your service is setting the
>> >> >>> value,
>> >> >>> Could you compare that to the cxf's sample code at
>> >> >>> samples/soap_header/src/main/java/demo/soap_header/(client|server)?
>> >> >>>
>> >> >>>
>> >> >>> 2014-11-28 18:21 GMT+01:00 André Costa Lima
>> >> >>> <an...@gmail.com>:
>> >> >>> > Hello,
>> >> >>> >
>> >> >>> > I am a new CXF (v3.0.0) user. Actually, I am new to the whole
>> >> >>> > JAX-WS
>> >> >>> > thing.
>> >> >>> > :)
>> >> >>> > I have set up a JAX-WS service, SOAP over JMS with ActiveMQ. The
>> >> >>> > server
>> >> >>> > methods invocations are working fine, but I am having some
>> >> >>> > trouble
>> >> >>> > regarding the Holder class.
>> >> >>> > I am using the holder class as a container for the outgoing SOAP
>> >> >>> > header
>> >> >>> > for
>> >> >>> > all web methods, as specified in the WSDL.
>> >> >>> > I started from WSDL first with Spring configuration for both
>> >> >>> > clients
>> >> >>> > and
>> >> >>> > servers.
>> >> >>> > I have provided an async binding to the wsdl2java tool to
>> >> >>> > generate
>> >> >>> > the
>> >> >>> > async method signatures, because I want to use those instead of
>> >> >>> > the
>> >> >>> > sync
>> >> >>> > ones.
>> >> >>> >
>> >> >>> > The problem is that when I pass the Holder object to the client
>> >> >>> > method
>> >> >>> > and
>> >> >>> > assign the value field in the server, the client sees it as null
>> >> >>> > but
>> >> >>> > no
>> >> >>> > exception is thrown.
>> >> >>> > Further, if I put the @UseAsyncMethod annotation to command CXF
>> >> >>> > to
>> >> >>> > use
>> >> >>> > the
>> >> >>> > pure async method I have implemented, CXF throws NPE at
>> >> >>> > HolderOutInterceptor class.
>> >> >>> > I noticed that if the web method has no arguments besides the
>> >> >>> > SOAP
>> >> >>> > headers
>> >> >>> > everything works just fine, otherwise what I have described above
>> >> >>> > happens.
>> >> >>> >
>> >> >>> > Below there are my configurations.
>> >> >>> >
>> >> >>> > Maven plugin:
>> >> >>> >
>> >> >>> > <plugin>
>> >> >>> > <groupId>org.apache.cxf</groupId>
>> >> >>> >           <artifactId>cxf-codegen-plugin</artifactId>
>> >> >>> >           <executions>
>> >> >>> >           <execution>
>> >> >>> >                     <id>generate-sources</id>
>> >> >>> >                               <phase>generate-sources</phase>
>> >> >>> >                               <configuration>
>> >> >>> >                               <defaultOptions>
>> >> >>> >                                         <bindingFiles>
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > <bindingFile>${basedir}/src/main/resources/oa_types-binding.xml</bindingFile>
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > <bindingFile>${basedir}/src/main/resources/oa_async-binding.xml</bindingFile>
>> >> >>> >                                         </bindingFiles>
>> >> >>> >
>> >> >>> > <noAddressBinding>true</noAddressBinding>
>> >> >>> >                                     </defaultOptions>
>> >> >>> >                                     <sourceRoot>
>> >> >>> >
>> >> >>> > ${basedir}/target/generated-sources/cxf
>> >> >>> >                                     </sourceRoot>
>> >> >>> >                                     <wsdlOptions>
>> >> >>> >                                         <wsdlOption>
>> >> >>> >
>> >> >>> > <wsdl>${basedir}/src/main/resources/OA_Server.wsdl</wsdl>
>> >> >>> >
>> >> >>> > <wsdlLocation>classpath:OA_Server.wsdl</wsdlLocation>
>> >> >>> >                                             <extraargs>
>> >> >>> >
>> >> >>> > <extraarg>-p</extraarg>
>> >> >>> >                                                 <extraarg>
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > http://www.multispeak.org/Version_4.1_Release=org.multispeak.version_4_1_6.OA
>> >> >>> > </extraarg>
>> >> >>> >
>> >> >>> > <extraarg>-p</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>cpsm_V4.1_Release=org.cspm.version_4_1.OA</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>-p</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>gml_V4.1_Release=org.gml.version_4_1.OA</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>-p</extraarg>
>> >> >>> >                                                 <extraarg>
>> >> >>> > http://www.w3.org/1999/xlink=org.w3.xlink.OA</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>-p</extraarg>
>> >> >>> >                                                 <extraarg>
>> >> >>> > http://www.w3.org/2001/XMLSchema=org.w3.xmlschema.OA</extraarg>
>> >> >>> >                                                 <!--
>> >> >>> > <extraarg>-p</extraarg> -->
>> >> >>> >                                                 <!--
>> >> >>> > <extraarg>org.multispeak.version_4_1_6.OA</extraarg> -->
>> >> >>> >                                                 <!--
>> >> >>> > <extraarg>-impl</extraarg> -->
>> >> >>> >                                                 <!--
>> >> >>> > <extraarg>-server</extraarg> -->
>> >> >>> >                                                 <!--
>> >> >>> > <extraarg>-client</extraarg> -->
>> >> >>> >
>> >> >>> > <extraarg>-autoNameResolution</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>-fe</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>jaxws21</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>-exsh</extraarg>
>> >> >>> >
>> >> >>> > <extraarg>true</extraarg>
>> >> >>> >                                             </extraargs>
>> >> >>> >                                         </wsdlOption>
>> >> >>> >                                     </wsdlOptions>
>> >> >>> >                                 </configuration>
>> >> >>> >                                 <goals>
>> >> >>> >                                     <goal>wsdl2java</goal>
>> >> >>> >                                 </goals>
>> >> >>> > </execution>
>> >> >>> > </executions>
>> >> >>> > </plugin>
>> >> >>> >
>> >> >>> > Spring:
>> >> >>> >
>> >> >>> >     <beans:bean id="connection-factory"
>> >> >>> > class="org.apache.activemq.ActiveMQConnectionFactory">
>> >> >>> >         <beans:property name="brokerURL"
>> >> >>> > value="${outside.multispeak.jms.broker}"/>
>> >> >>> >     </beans:bean>
>> >> >>> >
>> >> >>> >     <beans:bean id="pooled-connection-factory"
>> >> >>> > class="org.apache.activemq.pool.PooledConnectionFactory"
>> >> >>> > destroy-method="stop">
>> >> >>> >         <beans:constructor-arg index="0"
>> >> >>> > ref="connection-factory"/>
>> >> >>> >         <beans:property name="expiryTimeout"
>> >> >>> > value="${outside.multispeak.jms.pool.expiryTimeout}"/>
>> >> >>> >     </beans:bean>
>> >> >>> >
>> >> >>> > <!-- multispeak call handling interface (OA) -->
>> >> >>> >
>> >> >>> >         <!-- client side -->
>> >> >>> >
>> >> >>> >         <jaxws:client
>> >> >>> >             id="multispeak-oa-client"
>> >> >>> >
>> >> >>> > xmlns:ns="http://www.multispeak.org/Version_4.1_Release"
>> >> >>> >
>> >> >>> > serviceClass="org.multispeak.version_4_1_6.OA.OAServerSoap"
>> >> >>> >             serviceName="ns:OA_Server"
>> >> >>> >             endpointName="ns:OA_ServerSoap"
>> >> >>> >             address="#{'jms:queue:'
>> >> >>> >                 + '${outside.multispeak.oa.jms.queue}'
>> >> >>> >                 + '?timeToLive=' +
>> >> >>> > '${outside.multispeak.jms.timeToLive}'
>> >> >>> >                 + '&amp;requestTimeout' +
>> >> >>> > '${outside.multispeak.jms.receiveTimeout}'}"
>> >> >>> >             wsdlLocation="classpath:OA_Server.wsdl">
>> >> >>> >             <jaxws:features>
>> >> >>> >                 <beans:bean
>> >> >>> > class="org.apache.cxf.feature.LoggingFeature "/>
>> >> >>> >                 <beans:bean
>> >> >>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
>> >> >>> >                     <beans:constructor-arg index="0"
>> >> >>> > ref="pooled-connection-factory"/>
>> >> >>> >                 </beans:bean>
>> >> >>> >             </jaxws:features>
>> >> >>> >            </jaxws:client>
>> >> >>> >
>> >> >>> >         <!-- server side -->
>> >> >>> >
>> >> >>> >         <beans:bean id="forwarding-oa-server"
>> >> >>> > class="${outside.multispeak.oa.server}" />
>> >> >>> >         <beans:bean id="multispeak-oa-obj-factory"
>> >> >>> > class="org.multispeak.version_4_1_6.OA.ObjectFactory" />
>> >> >>> >
>> >> >>> >         <jaxws:endpoint
>> >> >>> >             id="multispeak-oa-server"
>> >> >>> >
>> >> >>> > xmlns:tns="http://www.multispeak.org/Version_4.1_Release"
>> >> >>> >
>> >> >>> > implementor="x.x.outside.multispeak.oa.server.OAServerSoapImpl"
>> >> >>> >             serviceName="tns:OA_Server"
>> >> >>> >             endpointName="tns:OA_ServerSoap"
>> >> >>> >             address="#{'jms:queue:' +
>> >> >>> > '${outside.multispeak.oa.jms.queue}'
>> >> >>> > + ''}"
>> >> >>> >             publish="false"
>> >> >>> >             wsdlLocation="classpath:OA_Server.wsdl">
>> >> >>> >             <jaxws:features>
>> >> >>> >                 <beans:bean
>> >> >>> > class="org.apache.cxf.feature.LoggingFeature "/>
>> >> >>> >                 <beans:bean
>> >> >>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
>> >> >>> >                     <beans:constructor-arg index="0"
>> >> >>> > ref="pooled-connection-factory"/>
>> >> >>> >                 </beans:bean>
>> >> >>> >             </jaxws:features>
>> >> >>> >         </jaxws:endpoint>
>> >> >>> >
>> >> >>> > The Service Endpoint Interface generated.
>> >> >>> > There are two methods: pingURL and odEventNotification.
>> >> >>> > pingURLAsync, as it has no arguments besides the headers, works
>> >> >>> > just
>> >> >>> > fine,
>> >> >>> > but odEventNotificationAsync does not.
>> >> >>> > Note that I am using an AsyncHandler of course. In case of
>> >> >>> > pingURLAsync
>> >> >>> > I
>> >> >>> > can get Holder.value in the handleResponse(Response<T>) callback
>> >> >>> > without
>> >> >>> > any problems.
>> >> >>> >
>> >> >>> > @WebService(targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > name = "OA_ServerSoap")
>> >> >>> > @XmlSeeAlso({ObjectFactory.class,
>> >> >>> > org.w3.xlink.OA.ObjectFactory.class,
>> >> >>> > org.gml.version_4_1.OA.ObjectFactory.class,
>> >> >>> > org.cspm.version_4_1.OA.ObjectFactory.class})
>> >> >>> > public interface OAServerSoap {
>> >> >>> >
>> >> >>> > ...
>> >> >>> >
>> >> >>> > @RequestWrapper(localName = "PingURL", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
>> >> >>> > targetNamespace
>> >> >>> > = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >> >>> >     @WebMethod(operationName = "PingURL")
>> >> >>> >     public
>> >> >>> > Response<org.multispeak.version_4_1_6.OA.PingURLResponse>
>> >> >>> > pingURLAsync(
>> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
>> >> >>> > "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >> >>> > "MultiSpeakMsgHeader",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > header =
>> >> >>> > true)
>> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >> >>> > multiSpeakMsgHeader1
>> >> >>> >     );
>> >> >>> >
>> >> >>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
>> >> >>> > targetNamespace
>> >> >>> > = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >> >>> >     @WebMethod(operationName = "PingURL")
>> >> >>> >     public Future<?> pingURLAsync(
>> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
>> >> >>> > "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >> >>> > "MultiSpeakMsgHeader",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > header =
>> >> >>> > true)
>> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >> >>> > multiSpeakMsgHeader1,
>> >> >>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
>> >> >>> >
>> >> >>> > AsyncHandler<org.multispeak.version_4_1_6.OA.PingURLResponse>
>> >> >>> > asyncHandler
>> >> >>> >     );
>> >> >>> >
>> >> >>> >     /**
>> >> >>> >      * Requester pings URL of OA to see if it is alive.  Returns
>> >> >>> > errorObject(s) as necessary to communicate application status.
>> >> >>> >      */
>> >> >>> >     @WebResult(name = "PingURLResult", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >> >>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >> >>> >     @WebMethod(operationName = "PingURL", action = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release/PingURL")
>> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
>> >> >>> > targetNamespace
>> >> >>> > = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >> >>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
>> >> >>> > pingURL(
>> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
>> >> >>> > "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >> >>> > "MultiSpeakMsgHeader",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > header =
>> >> >>> > true)
>> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >> >>> > multiSpeakMsgHeader1
>> >> >>> >     );
>> >> >>> >
>> >> >>> > @RequestWrapper(localName = "ODEventNotification",
>> >> >>> > targetNamespace =
>> >> >>> > "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >> >>> >     @WebMethod(operationName = "ODEventNotification")
>> >> >>> >     public
>> >> >>> >
>> >> >>> >
>> >> >>> > Response<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
>> >> >>> > odEventNotificationAsync(
>> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >> >>> >
>> >> >>> > org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> >> >>> > odEvents,
>> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >> >>> >         java.lang.String transactionID,
>> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
>> >> >>> > "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >> >>> > "MultiSpeakMsgHeader",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > header =
>> >> >>> > true)
>> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >> >>> > multiSpeakMsgHeader1
>> >> >>> >     );
>> >> >>> >
>> >> >>> >     @RequestWrapper(localName = "ODEventNotification",
>> >> >>> > targetNamespace
>> >> >>> > = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >> >>> >     @WebMethod(operationName = "ODEventNotification")
>> >> >>> >     public Future<?> odEventNotificationAsync(
>> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >> >>> >
>> >> >>> > org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> >> >>> > odEvents,
>> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >> >>> >         java.lang.String transactionID,
>> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
>> >> >>> > "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >> >>> > "MultiSpeakMsgHeader",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > header =
>> >> >>> > true)
>> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >> >>> > multiSpeakMsgHeader1,
>> >> >>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > AsyncHandler<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
>> >> >>> > asyncHandler
>> >> >>> >     );
>> >> >>> >
>> >> >>> >     /**
>> >> >>> >      * Publisher notifies OA of a change in OutageDetectionEvents
>> >> >>> > by
>> >> >>> > sending an array of changed OutageDetectionEvent objects.  OA
>> >> >>> > returns
>> >> >>> > information about failed transactions using an array of
>> >> >>> > errorObjects.
>> >> >>> > The
>> >> >>> > message header attribute 'registrationID' should be added to all
>> >> >>> > publish
>> >> >>> > messages to indicate to the subscriber under which registrationID
>> >> >>> > they
>> >> >>> > received this notification data.
>> >> >>> >      */
>> >> >>> >     @WebResult(name = "ODEventNotificationResult",
>> >> >>> > targetNamespace =
>> >> >>> > "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >> >>> >     @RequestWrapper(localName = "ODEventNotification",
>> >> >>> > targetNamespace
>> >> >>> > = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >> >>> >     @WebMethod(operationName = "ODEventNotification", action = "
>> >> >>> >
>> >> >>> > http://www.multispeak.org/Version_4.1_Release/ODEventNotification")
>> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > className =
>> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >> >>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
>> >> >>> > odEventNotification(
>> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >> >>> >
>> >> >>> > org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> >> >>> > odEvents,
>> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >> >>> >         java.lang.String transactionID,
>> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
>> >> >>> > "
>> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >> >>> > "MultiSpeakMsgHeader",
>> >> >>> > targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> > header =
>> >> >>> > true)
>> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >> >>> > multiSpeakMsgHeader1
>> >> >>> >     );
>> >> >>> >
>> >> >>> > ...
>> >> >>> >
>> >> >>> > The SEI implementation.
>> >> >>> > Both pingURL and odEventNotification simply forward the call to a
>> >> >>> > delegate.
>> >> >>> > Both inbound and outbound headers are placed in a common
>> >> >>> > container
>> >> >>> > and
>> >> >>> > handed over to the delegate.
>> >> >>> > The async methods simply execute the calls in background and end
>> >> >>> > up
>> >> >>> > calling
>> >> >>> > the sync methods internally.
>> >> >>> > The line
>> >> >>> >
>> >> >>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >> >>> > simply calls multiSpeakMsgHeader1.value = ...
>> >> >>> >
>> >> >>> > @WebService(
>> >> >>> >         serviceName = "OA_Server",
>> >> >>> >         portName = "OA_ServerSoap",
>> >> >>> >         targetNamespace =
>> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >> >>> >         wsdlLocation = "classpath:OA_Server.wsdl",
>> >> >>> >         endpointInterface =
>> >> >>> > "org.multispeak.version_4_1_6.OA.OAServerSoap")
>> >> >>> > public class OAServerSoapImpl implements OAServerSoap {
>> >> >>> >
>> >> >>> > ...
>> >> >>> >
>> >> >>> > @Override
>> >> >>> >     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
>> >> >>> > multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
>> >> >>> > multiSpeakMsgHeader1)
>> >> >>> > {
>> >> >>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >> >>> >         try {
>> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader);
>> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1);
>> >> >>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader
>> >> >>> > =
>> >> >>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader,
>> >> >>> > multiSpeakMsgHeader1);
>> >> >>> >
>> >> >>> >
>> >> >>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >> >>> >             return
>> >> >>> >
>> >> >>> > LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
>> >> >>> >         } catch (Throwable t) {
>> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >> >>> >         }
>> >> >>> >     }
>> >> >>> >
>> >> >>> > @Override
>> >> >>> > @UseAsyncMethod
>> >> >>> > public ArrayOfErrorObject
>> >> >>> > odEventNotification(ArrayOfOutageDetectionEvent
>> >> >>> > odEvents, String transactionID, MultiSpeakMsgHeader
>> >> >>> > multiSpeakMsgHeader,
>> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
>> >> >>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> >> >>> > multiSpeakMsgHeader1);
>> >> >>> >         try {
>> >> >>> >             Preconditions.checkNotNull(odEvents, "odEvents");
>> >> >>> >             Preconditions.checkNotNull(transactionID,
>> >> >>> > "transactionID");
>> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader,
>> >> >>> > "multiSpeakMsgHeader");
>> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1,
>> >> >>> > "multiSpeakMsgHeader1");
>> >> >>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader
>> >> >>> > =
>> >> >>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader,
>> >> >>> > multiSpeakMsgHeader1);
>> >> >>> >
>> >> >>> >
>> >> >>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >> >>> >             return
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
>> >> >>> > transactionID, mspkHeader)));
>> >> >>> >         } catch (Throwable t) {
>> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >> >>> >         }
>> >> >>> >     }
>> >> >>> >
>> >> >>> >     @Override
>> >> >>> >     public Future<?> pingURLAsync(MultiSpeakMsgHeader
>> >> >>> > multiSpeakMsgHeader,
>> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >> >>> > AsyncHandler<PingURLResponse> asyncHandler) {
>> >> >>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
>> >> >>> > asyncHandler);
>> >> >>> >         try {
>> >> >>> >             PingURLAsync response = new PingURLAsync(this,
>> >> >>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>> >> >>> >             mExecutor.submit(response);
>> >> >>> >             return LOG.exit(response.getServerAsyncResponse());
>> >> >>> >         } catch (Throwable t) {
>> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >> >>> >         }
>> >> >>> >     }
>> >> >>> >
>> >> >>> > @Override
>> >> >>> >     public Future<?>
>> >> >>> > odEventNotificationAsync(ArrayOfOutageDetectionEvent
>> >> >>> > odEvents, String transactionID, MultiSpeakMsgHeader
>> >> >>> > multiSpeakMsgHeader,
>> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >> >>> > AsyncHandler<ODEventNotificationResponse> asyncHandler) {
>> >> >>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> >> >>> > multiSpeakMsgHeader1);
>> >> >>> >         try {
>> >> >>> >             OdEventNotificationAsync response = new
>> >> >>> > OdEventNotificationAsync(this, odEvents, transactionID,
>> >> >>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>> >> >>> >             mExecutor.submit(response);
>> >> >>> >             return LOG.exit(response.getServerAsyncResponse());
>> >> >>> >         } catch (Throwable t) {
>> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >> >>> >         }
>> >> >>> >     }
>> >> >>> >
>> >> >>> > ...
>> >> >>> >
>> >> >>> > The invocation test.
>> >> >>> >
>> >> >>> > ...
>> >> >>> > Holder<MultiSpeakMsgHeader> headerOut = new
>> >> >>> > Holder<MultiSpeakMsgHeader>();
>> >> >>> > Future<?> future = mServer.odEventNotificationAsync(new
>> >> >>> > ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
>> >> >>> > headerOut,
>> >> >>> > new AsyncHandlerImpl(headerOut));
>> >> >>> > ...
>> >> >>> > private static class AsyncHandlerImpl implements
>> >> >>> > AsyncHandler<ODEventNotificationResponse> {
>> >> >>> >
>> >> >>> >         private static final XLogger LOG =
>> >> >>> > XLoggerFactory.getXLogger(AsyncHandlerImpl.class);
>> >> >>> >
>> >> >>> >         private final Holder<MultiSpeakMsgHeader> mHeaderOut;
>> >> >>> >
>> >> >>> >         public AsyncHandlerImpl(Holder<MultiSpeakMsgHeader>
>> >> >>> > headerOut)
>> >> >>> > {
>> >> >>> >             mHeaderOut = headerOut;
>> >> >>> >         }
>> >> >>> >
>> >> >>> >         @Override
>> >> >>> >         public void
>> >> >>> > handleResponse(Response<ODEventNotificationResponse>
>> >> >>> > res) {
>> >> >>> >             try {
>> >> >>> >                 if (LOG.isTraceEnabled()) {
>> >> >>> >                     LOG.trace("Callback: {}", res.toString());
>> >> >>> >                 }
>> >> >>> >                 ODEventNotificationResponse mspkRsp = res.get();
>> >> >>> >                 if (LOG.isTraceEnabled()) {
>> >> >>> >                     LOG.trace("OA odEventNotificationAsync() >>
>> >> >>> > callback:
>> >> >>> > {} > multispeak header: {}", mspkRsp.toString(),
>> >> >>> > mHeaderOut.value);
>> >> >>> > //                    for (Entry<String, Object> entry :
>> >> >>> > res.getContext().entrySet()) {
>> >> >>> > //                        LOG.trace("Response context >> string >
>> >> >>> > {}
>> >> >>> > >>
>> >> >>> > object > {}", entry.getKey(), entry.getValue());
>> >> >>> > //                    }
>> >> >>> >                 }
>> >> >>> >             } catch (Exception e) {
>> >> >>> >                 LOG.catching(e);
>> >> >>> >             }
>> >> >>> >         }
>> >> >>> >     }
>> >> >>> >
>> >> >>> > As I said above, a NPE is thrown in HolderOutInterceptor when the
>> >> >>> > response
>> >> >>> > is returned to the client if I use the pure async method with
>> >> >>> > @UseAsyncMethod,
>> >> >>> > or mHeaderOut.value is null if I don't. Now, the stacktrace:
>> >> >>> >
>> >> >>> > 28-11-2014 17:15:07.997 WARN  [OA Thread-#1]
>> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor
>> >> >>> > for {
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}ODEventNotification
>> >> >>> > has thrown exception, unwinding now
>> >> >>> > java.lang.NullPointerException
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.jaxws.interceptors.HolderOutInterceptor.handleMessage(HolderOutInterceptor.java:90)
>> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:81)
>> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)
>> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
>> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.jms.continuations.JMSContinuation.doResume(JMSContinuation.java:109)
>> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.jms.continuations.JMSContinuation.resume(JMSContinuation.java:98)
>> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker$JaxwsServerHandler.handleResponse(AbstractJAXWSMethodInvoker.java:193)
>> >> >>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireResult(AbstractAsyncResponseHandler.java:55)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireAsyncResult(AbstractAsyncResponseHandler.java:46)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.postProcess(AbstractAsyncResponseHandler.java:41)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.common.util.ConditionEnforcerHandlerRunnable$1.invoke(ConditionEnforcerHandlerRunnable.java:10)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.common.util.ConditionEnforcerHandler$2.invoke(ConditionEnforcerHandler.java:25)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.common.util.ExceptionHandler.handle(ExceptionHandler.java:7)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.common.util.ConditionEnforcerHandler.handle(ConditionEnforcerHandler.java:20)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.common.util.ConditionEnforcerHandlerRunnable.run(ConditionEnforcerHandlerRunnable.java:7)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at
>> >> >>> >
>> >> >>> > java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> >> >>> > 28-11-2014 17:15:08.044 TRACE [ActiveMQ Session Task-1]
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
>> >> >>> > handleResponse - Callback:
>> >> >>> > org.apache.cxf.jaxws.JaxwsClientCallback$2@cc6f8c
>> >> >>> > 28-11-2014 17:15:08.044 ERROR [ActiveMQ Session Task-1]
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
>> >> >>> > handleResponse - catching
>> >> >>> > java.util.concurrent.ExecutionException:
>> >> >>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while
>> >> >>> > processing.
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.jaxws.JaxwsClientCallback$2.get(JaxwsClientCallback.java:99)
>> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl.handleResponse(OAServerTestAsyncCallback.java:81)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.jaxws.JaxwsClientCallback.handleException(JaxwsClientCallback.java:87)
>> >> >>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:821)
>> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
>> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
>> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
>> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
>> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> >> >>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred
>> >> >>> > while
>> >> >>> > processing.
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     ... 11 more
>> >> >>> > 28-11-2014 17:15:08.045 ERROR
>> >> >>> > [x.x.outside.test.multispeak.OAServerTestAsyncCallback-1]
>> >> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback run -
>> >> >>> > catching
>> >> >>> > java.util.concurrent.ExecutionException:
>> >> >>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while
>> >> >>> > processing.
>> >> >>> >     at
>> >> >>> >
>> >> >>> > org.apache.cxf.endpoint.ClientCallback.get(ClientCallback.java:169)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.jaxws.JaxwsResponseCallback.get(JaxwsResponseCallback.java:54)
>> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$1.run(OAServerTestAsyncCallback.java:52)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > x.x.outside.test.multispeak.spi.AbstractMultispeakServerTest$2.run(AbstractMultispeakServerTest.java:112)
>> >> >>> > [classes/:?]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at
>> >> >>> >
>> >> >>> > java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> >> >>> > [?:1.6.0_33]
>> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> >> >>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred
>> >> >>> > while
>> >> >>> > processing.
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
>> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
>> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
>> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
>> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
>> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
>> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     at
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >> >>> >     ... 3 more
>> >> >>> >
>> >> >>> > Is this a configuration problem? Am I doing something stupid?
>> >> >>> > Thanks!
>> >> >>> >
>> >> >>> > Regards,
>> >> >>> >
>> >> >>> > André Costa Lima
>> >> >>
>> >> >>
>> >> >
>> >
>> >
>
>

Re: NPE at HolderOutInterceptor / Holder.value is null

Posted by André Costa Lima <an...@gmail.com>.
Thanks. I will take a look into it.
With a quick glance, I noticed that you set an Executor on the service
itself. I am not doing this. I just have an Executor on server side to run
the asynchronous requests, instead of new Thread()... as shown in the
sample. So, is that a client side Executor?

If you remove @UseAsyncMethod, what is the expected behaviour if the client
calls the async invariant?



André Costa Lima


2014-12-04 16:54 GMT+00:00 Aki Yoshida <el...@gmail.com>:

> I just created one project that combines the soap_header and
> jaxws_async samples. And this is working fine as one expects.
>
> Since this project is straightforward and will add not much value to
> the current sample collection but rather make the collection more
> crowded with overlapping samples, so I am not planning to add it to
> the cxf's samples.
>
> I uploaded this project to my dropbox here. So you can compare it to
> your example.
>
> https://www.dropbox.com/s/hexnh3jgy9o8c61/cxf_samples_jaxws_async_soap_header.tar.gz?dl=0
>
> regards, aki
>
> 2014-12-02 17:31 GMT+01:00 André Costa Lima <an...@gmail.com>:
> > Alright. Yes, the sync case works perfectly. Should I submit a bug in
> JIRA?
> >
> > André Costa Lima
> >
> >
> > 2014-12-02 16:27 GMT+00:00 Aki Yoshida <el...@gmail.com>:
> >>
> >> Hi André,
> >> I thought you were getting no value returned for the synchronous case
> >> and when using the async mode, getting an NPE from one of the
> >> interceptors.
> >> So I wanted to have the first issue fixed that might fix the second
> issue.
> >>
> >> But if you didn't have any issue with the sync Holder case, I have to
> >> look into the async case. It looks like there is some mismatch in the
> >> defined operations and the values passed in the context. I can't tell
> >> what is causing this issue. I have to take a look at it.
> >>
> >> regards, aki
> >>
> >> 2014-12-02 13:57 GMT+01:00 André Costa Lima <an...@gmail.com>:
> >> > I just noticed that the sample you linked me to refers only to
> >> > synchronous
> >> > invocations only. The sample jaxws_async shows how to do generate
> async
> >> > invariants of the methods and how to invoke them, but does not
> >> > demonstrate
> >> > how to use Holder<T> in this case. So, maybe, I'm doing it all wrong
> >> > because
> >> > CXF might not support this? Holder<T> works just fine in synchronous
> >> > invocations.
> >> >
> >> > My SEI was not generated correctly anyways. According to the sample,
> >> > when
> >> > the method receives a SOAP header and produces one, wsdl2java
> generates
> >> > a
> >> > SEI with an Holder with Mode.INOUT. I guess the option
> >> > -autoNameResolution
> >> > was forcing the creation of an extra input parameter in the method. I
> >> > had no
> >> > conflicts, so I removed the option and now the Holder with Mode.INOUT
> is
> >> > generated. I fixed all my methods in the SEI implementation
> accordingly.
> >> >
> >> > I tested my invocations again. Now the Holder receives in the
> >> > constructor
> >> > the input header. Without @UseAsyncMethod:
> >> >
> >> > Holder<MultiSpeakMsgHeader> headerOut = new
> >> > Holder<MultiSpeakMsgHeader>(new
> >> > MultiSpeakMsgHeader());
> >> > Future<?> future = mServer.odEventNotificationAsync(new
> >> > ArrayOfOutageDetectionEvent(), "0", headerOut, new
> >> > AsyncHandlerImpl(headerOut));
> >> >
> >> > Still does not work. When the client reads the value field, it does
> not
> >> > get
> >> > the new header object created by the server.
> >> > With @UseAsyncMethod still throws the NPE in the same line.
> >> >
> >> > When I invoked the argumentless method, again without @UseAsyncMethod:
> >> >
> >> > Holder<MultiSpeakMsgHeader> headerOut = new
> >> > Holder<MultiSpeakMsgHeader>(new
> >> > MultiSpeakMsgHeader());
> >> > Future<?> future = mServer.pingURLAsync(headerOut, new
> >> > AsyncHandlerImpl(headerOut));
> >> >
> >> > I get another exception, this time in HolderInInterceptor. (I've
> updated
> >> > to
> >> > 3.0.2) The stacktrace is below:
> >> >
> >> > 02-12-2014 12:48:28.643 WARN  [ActiveMQ Session Task-2]
> >> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for
> >> >
> >> > {
> http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}PingURL
> >> > has thrown exception, unwinding now
> >> > java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
> >> >     at java.util.ArrayList.rangeCheck(ArrayList.java:571)
> ~[?:1.6.0_33]
> >> >     at java.util.ArrayList.get(ArrayList.java:349) ~[?:1.6.0_33]
> >> >     at
> >> >
> >> >
> org.apache.cxf.jaxws.interceptors.HolderInInterceptor.handleMessage(HolderInInterceptor.java:67)
> >> > ~[cxf-rt-frontend-jaxws-3.0.2.jar:3.0.2]
> >> >     at
> >> >
> >> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> > [cxf-core-3.0.2.jar:3.0.2]
> >> >     at
> org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> >> > [cxf-core-3.0.2.jar:3.0.2]
> >> >     at
> >> >
> >> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
> >> >     at
> >> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
> >> >     at
> >> >
> >> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> >> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
> >> >     at
> >> >
> >> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >     at
> >> >
> >> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >     at
> >> >
> >> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >     at
> >> >
> >> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >     at
> >> >
> >> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> >> > [activemq-client-5.9.1.jar:5.9.1]
> >> >     at
> >> >
> >> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> >> > [?:1.6.0_33]
> >> >     at
> >> >
> >> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> >> > [?:1.6.0_33]
> >> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> >> >
> >> > So maybe there is an issue when manipulating Holder objects in async
> >> > invocations of methods with arguments?
> >> >
> >> > André Costa Lima
> >> >
> >> >
> >> > 2014-12-01 15:44 GMT+00:00 André Costa Lima <andreclima.pt@gmail.com
> >:
> >> >>
> >> >> Thanks for your response. I'll narrow it down to the necessary.
> >> >>
> >> >> SEI implementation:
> >> >>
> >> >> @WebService(
> >> >>         serviceName = "OA_Server",
> >> >>         portName = "OA_ServerSoap",
> >> >>         targetNamespace =
> >> >> "http://www.multispeak.org/Version_4.1_Release",
> >> >>         wsdlLocation = "classpath:OA_Server.wsdl",
> >> >>         endpointInterface = "org.multispeak.version_4_1_6.
> >> >> OA.OAServerSoap")
> >> >> public class OAServerSoapImpl implements OAServerSoap {
> >> >>
> >> >> ...
> >> >>
> >> >> @Override
> >> >>     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
> >> >> multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
> multiSpeakMsgHeader1)
> >> >> {
> >> >>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >> >>         try {
> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader);
> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader1);
> >> >>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> >> >> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >> >>
> >> >> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >>             return
> >> >> LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
> >> >>         } catch (Throwable t) {
> >> >>             throw LOG.throwing(Throwables.unchecked(t));
> >> >>         }
> >> >>     }
> >> >>
> >> >> @Override
> >> >> @UseAsyncMethod
> >> >> public ArrayOfErrorObject odEventNotification(
> >> >> ArrayOfOutageDetectionEvent odEvents, String transactionID,
> >> >> MultiSpeakMsgHeader multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
> >> >> multiSpeakMsgHeader1) {
> >> >>
> >> >>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> >> >> multiSpeakMsgHeader1);
> >> >>         try {
> >> >>             Preconditions.checkNotNull(odEvents, "odEvents");
> >> >>             Preconditions.checkNotNull(transactionID,
> "transactionID");
> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader,
> >> >> "multiSpeakMsgHeader");
> >> >>             Preconditions.checkNotNull(multiSpeakMsgHeader1,
> >> >> "multiSpeakMsgHeader1");
> >> >>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> >> >> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >> >>
> >> >> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >>             return
> >> >>
> >> >>
> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
> >> >> transactionID, mspkHeader)));
> >> >>         } catch (Throwable t) {
> >> >>             throw LOG.throwing(Throwables.unchecked(t));
> >> >>         }
> >> >>     }
> >> >>
> >> >>     @Override
> >> >>     public Future<?> pingURLAsync(MultiSpeakMsgHeader
> >> >> multiSpeakMsgHeader,
> >> >> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >> >> AsyncHandler<PingURLResponse> asyncHandler) {
> >> >>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
> >> >> asyncHandler);
> >> >>         try {
> >> >>             PingURLAsync response = new PingURLAsync(this,
> >> >> multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >> >>             mExecutor.submit(response);
> >> >>             return LOG.exit(response.getServerAsyncResponse());
> >> >>         } catch (Throwable t) {
> >> >>             throw LOG.throwing(Throwables.unchecked(t));
> >> >>         }
> >> >>     }
> >> >>
> >> >> @Override
> >> >>     public Future<?>
> >> >> odEventNotificationAsync(ArrayOfOutageDetectionEvent
> >> >> odEvents, String transactionID, MultiSpeakMsgHeader
> >> >> multiSpeakMsgHeader,
> >> >> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >> >> AsyncHandler<ODEventNotificationResponse> asyncHandler) {
> >> >>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> >> >> multiSpeakMsgHeader1);
> >> >>         try {
> >> >>             OdEventNotificationAsync response = new
> >> >> OdEventNotificationAsync(this, odEvents, transactionID,
> >> >> multiSpeakMsgHeader,
> >> >> multiSpeakMsgHeader1, asyncHandler);
> >> >>             mExecutor.submit(response);
> >> >>             return LOG.exit(response.getServerAsyncResponse());
> >> >>         } catch (Throwable t) {
> >> >>             throw LOG.throwing(Throwables.unchecked(t));
> >> >>         }
> >> >>     }
> >> >>
> >> >> ...
> >> >>
> >> >> }
> >> >>
> >> >> To make it clear, I'll add the code to the MultiSpeakInOutHeader
> class:
> >> >>
> >> >> public final class MultiSpeakInOutHeader<T> {
> >> >>
> >> >>     private final T mIn;
> >> >>     private final Holder<T> mOut;
> >> >>
> >> >>     private MultiSpeakInOutHeader(T in, Holder<T> out) {
> >> >>         Preconditions.checkNotNull(in);
> >> >>         Preconditions.checkNotNull(out);
> >> >>         mIn = in;
> >> >>         mOut = out;
> >> >>     }
> >> >>
> >> >>     public T getInbound() {
> >> >>         return mIn;
> >> >>     }
> >> >>
> >> >>     public T getOutbound() {
> >> >>         return getHolder().value;
> >> >>     }
> >> >>
> >> >>     public void setOutbound(T out) {
> >> >>         getHolder().value = out;
> >> >>     }
> >> >>
> >> >>     private Holder<T> getHolder() {
> >> >>         return mOut;
> >> >>     }
> >> >>
> >> >>     public static <T> MultiSpeakInOutHeader<T> of(T inbound,
> Holder<T>
> >> >> outbound) {
> >> >>         return new MultiSpeakInOutHeader<T>(inbound, outbound);
> >> >>     }
> >> >> }
> >> >>
> >> >> When I invoke:
> >> >>
> >> >> Holder<MultiSpeakMsgHeader> headerOut = new
> >> >> Holder<MultiSpeakMsgHeader>();
> >> >> Future<?> future = mServer.odEventNotificationAsync(new
> >> >> ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
> >> >> headerOut,
> >> >> new AsyncHandlerImpl(headerOut));
> >> >>
> >> >> an NPE is thrown at HolderOutInterceptor If I use @UseAsyncMethod or
> >> >> headerOut.value is null if I don't. Now, when I invoke:
> >> >>
> >> >> Holder<MultiSpeakMsgHeader> headerOut = new
> >> >> Holder<MultiSpeakMsgHeader>();
> >> >> Future<?> future = mServer.pingURLAsync(new MultiSpeakMsgHeader(),
> >> >> headerOut, new AsyncHandlerImpl(headerOut));
> >> >>
> >> >> it works. The client can see the value field / no NPE is thrown.
> >> >>
> >> >> Comparing my code to the sample, I believe I'm doing it correctly:
> >> >>
> >> >> 1. The client creates the Holder object and passes it down to the
> >> >> method
> >> >> invocation
> >> >> 2. The server assigns the value field before returning
> >> >>
> >> >> It's rather strange that one invocation works and the other does not.
> >> >> The
> >> >> only difference between them is that pingURL has no arguments and
> >> >> odEventNotification has one (ArrayOfOutageDetectionEvent). I have
> >> >> another
> >> >> argumentless method that works just fine as well and another with
> >> >> arguments
> >> >> that does not, so I think the problem lies in the number of arguments
> >> >> somehow or how the Holder types are manipulated.
> >> >>
> >> >> If the test that you linked me to works in the current release of
> CXF,
> >> >> maybe I have something wrong with my configuration?
> >> >> I will run that same test in my machine to see how it goes.
> >> >>
> >> >> Thanks.
> >> >>
> >> >> Regards,
> >> >>
> >> >>
> >> >> André Costa Lima
> >> >>
> >> >>
> >> >> 2014-12-01 15:04 GMT+00:00 Aki Yoshida <el...@gmail.com>:
> >> >>>
> >> >>> Your post is kind of too long and I am not really seeing how your
> >> >>> client is calling the method and how your service is setting the
> >> >>> value,
> >> >>> Could you compare that to the cxf's sample code at
> >> >>> samples/soap_header/src/main/java/demo/soap_header/(client|server)?
> >> >>>
> >> >>>
> >> >>> 2014-11-28 18:21 GMT+01:00 André Costa Lima <
> andreclima.pt@gmail.com>:
> >> >>> > Hello,
> >> >>> >
> >> >>> > I am a new CXF (v3.0.0) user. Actually, I am new to the whole
> JAX-WS
> >> >>> > thing.
> >> >>> > :)
> >> >>> > I have set up a JAX-WS service, SOAP over JMS with ActiveMQ. The
> >> >>> > server
> >> >>> > methods invocations are working fine, but I am having some trouble
> >> >>> > regarding the Holder class.
> >> >>> > I am using the holder class as a container for the outgoing SOAP
> >> >>> > header
> >> >>> > for
> >> >>> > all web methods, as specified in the WSDL.
> >> >>> > I started from WSDL first with Spring configuration for both
> clients
> >> >>> > and
> >> >>> > servers.
> >> >>> > I have provided an async binding to the wsdl2java tool to generate
> >> >>> > the
> >> >>> > async method signatures, because I want to use those instead of
> the
> >> >>> > sync
> >> >>> > ones.
> >> >>> >
> >> >>> > The problem is that when I pass the Holder object to the client
> >> >>> > method
> >> >>> > and
> >> >>> > assign the value field in the server, the client sees it as null
> but
> >> >>> > no
> >> >>> > exception is thrown.
> >> >>> > Further, if I put the @UseAsyncMethod annotation to command CXF to
> >> >>> > use
> >> >>> > the
> >> >>> > pure async method I have implemented, CXF throws NPE at
> >> >>> > HolderOutInterceptor class.
> >> >>> > I noticed that if the web method has no arguments besides the SOAP
> >> >>> > headers
> >> >>> > everything works just fine, otherwise what I have described above
> >> >>> > happens.
> >> >>> >
> >> >>> > Below there are my configurations.
> >> >>> >
> >> >>> > Maven plugin:
> >> >>> >
> >> >>> > <plugin>
> >> >>> > <groupId>org.apache.cxf</groupId>
> >> >>> >           <artifactId>cxf-codegen-plugin</artifactId>
> >> >>> >           <executions>
> >> >>> >           <execution>
> >> >>> >                     <id>generate-sources</id>
> >> >>> >                               <phase>generate-sources</phase>
> >> >>> >                               <configuration>
> >> >>> >                               <defaultOptions>
> >> >>> >                                         <bindingFiles>
> >> >>> >
> >> >>> >
> >> >>> >
> >> >>> >
> <bindingFile>${basedir}/src/main/resources/oa_types-binding.xml</bindingFile>
> >> >>> >
> >> >>> >
> >> >>> >
> >> >>> >
> <bindingFile>${basedir}/src/main/resources/oa_async-binding.xml</bindingFile>
> >> >>> >                                         </bindingFiles>
> >> >>> >
> >> >>> > <noAddressBinding>true</noAddressBinding>
> >> >>> >                                     </defaultOptions>
> >> >>> >                                     <sourceRoot>
> >> >>> >
> >> >>> > ${basedir}/target/generated-sources/cxf
> >> >>> >                                     </sourceRoot>
> >> >>> >                                     <wsdlOptions>
> >> >>> >                                         <wsdlOption>
> >> >>> >
> >> >>> > <wsdl>${basedir}/src/main/resources/OA_Server.wsdl</wsdl>
> >> >>> >
> >> >>> > <wsdlLocation>classpath:OA_Server.wsdl</wsdlLocation>
> >> >>> >                                             <extraargs>
> >> >>> >
> >> >>> > <extraarg>-p</extraarg>
> >> >>> >                                                 <extraarg>
> >> >>> >
> >> >>> >
> >> >>> >
> http://www.multispeak.org/Version_4.1_Release=org.multispeak.version_4_1_6.OA
> >> >>> > </extraarg>
> >> >>> >
> >> >>> > <extraarg>-p</extraarg>
> >> >>> >
> >> >>> > <extraarg>cpsm_V4.1_Release=org.cspm.version_4_1.OA</extraarg>
> >> >>> >
> >> >>> > <extraarg>-p</extraarg>
> >> >>> >
> >> >>> > <extraarg>gml_V4.1_Release=org.gml.version_4_1.OA</extraarg>
> >> >>> >
> >> >>> > <extraarg>-p</extraarg>
> >> >>> >                                                 <extraarg>
> >> >>> > http://www.w3.org/1999/xlink=org.w3.xlink.OA</extraarg>
> >> >>> >
> >> >>> > <extraarg>-p</extraarg>
> >> >>> >                                                 <extraarg>
> >> >>> > http://www.w3.org/2001/XMLSchema=org.w3.xmlschema.OA</extraarg>
> >> >>> >                                                 <!--
> >> >>> > <extraarg>-p</extraarg> -->
> >> >>> >                                                 <!--
> >> >>> > <extraarg>org.multispeak.version_4_1_6.OA</extraarg> -->
> >> >>> >                                                 <!--
> >> >>> > <extraarg>-impl</extraarg> -->
> >> >>> >                                                 <!--
> >> >>> > <extraarg>-server</extraarg> -->
> >> >>> >                                                 <!--
> >> >>> > <extraarg>-client</extraarg> -->
> >> >>> >
> >> >>> > <extraarg>-autoNameResolution</extraarg>
> >> >>> >
> >> >>> > <extraarg>-fe</extraarg>
> >> >>> >
> >> >>> > <extraarg>jaxws21</extraarg>
> >> >>> >
> >> >>> > <extraarg>-exsh</extraarg>
> >> >>> >
> >> >>> > <extraarg>true</extraarg>
> >> >>> >                                             </extraargs>
> >> >>> >                                         </wsdlOption>
> >> >>> >                                     </wsdlOptions>
> >> >>> >                                 </configuration>
> >> >>> >                                 <goals>
> >> >>> >                                     <goal>wsdl2java</goal>
> >> >>> >                                 </goals>
> >> >>> > </execution>
> >> >>> > </executions>
> >> >>> > </plugin>
> >> >>> >
> >> >>> > Spring:
> >> >>> >
> >> >>> >     <beans:bean id="connection-factory"
> >> >>> > class="org.apache.activemq.ActiveMQConnectionFactory">
> >> >>> >         <beans:property name="brokerURL"
> >> >>> > value="${outside.multispeak.jms.broker}"/>
> >> >>> >     </beans:bean>
> >> >>> >
> >> >>> >     <beans:bean id="pooled-connection-factory"
> >> >>> > class="org.apache.activemq.pool.PooledConnectionFactory"
> >> >>> > destroy-method="stop">
> >> >>> >         <beans:constructor-arg index="0"
> ref="connection-factory"/>
> >> >>> >         <beans:property name="expiryTimeout"
> >> >>> > value="${outside.multispeak.jms.pool.expiryTimeout}"/>
> >> >>> >     </beans:bean>
> >> >>> >
> >> >>> > <!-- multispeak call handling interface (OA) -->
> >> >>> >
> >> >>> >         <!-- client side -->
> >> >>> >
> >> >>> >         <jaxws:client
> >> >>> >             id="multispeak-oa-client"
> >> >>> >             xmlns:ns="
> http://www.multispeak.org/Version_4.1_Release"
> >> >>> >
> >> >>> > serviceClass="org.multispeak.version_4_1_6.OA.OAServerSoap"
> >> >>> >             serviceName="ns:OA_Server"
> >> >>> >             endpointName="ns:OA_ServerSoap"
> >> >>> >             address="#{'jms:queue:'
> >> >>> >                 + '${outside.multispeak.oa.jms.queue}'
> >> >>> >                 + '?timeToLive=' +
> >> >>> > '${outside.multispeak.jms.timeToLive}'
> >> >>> >                 + '&amp;requestTimeout' +
> >> >>> > '${outside.multispeak.jms.receiveTimeout}'}"
> >> >>> >             wsdlLocation="classpath:OA_Server.wsdl">
> >> >>> >             <jaxws:features>
> >> >>> >                 <beans:bean
> >> >>> > class="org.apache.cxf.feature.LoggingFeature "/>
> >> >>> >                 <beans:bean
> >> >>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
> >> >>> >                     <beans:constructor-arg index="0"
> >> >>> > ref="pooled-connection-factory"/>
> >> >>> >                 </beans:bean>
> >> >>> >             </jaxws:features>
> >> >>> >            </jaxws:client>
> >> >>> >
> >> >>> >         <!-- server side -->
> >> >>> >
> >> >>> >         <beans:bean id="forwarding-oa-server"
> >> >>> > class="${outside.multispeak.oa.server}" />
> >> >>> >         <beans:bean id="multispeak-oa-obj-factory"
> >> >>> > class="org.multispeak.version_4_1_6.OA.ObjectFactory" />
> >> >>> >
> >> >>> >         <jaxws:endpoint
> >> >>> >             id="multispeak-oa-server"
> >> >>> >
> >> >>> > xmlns:tns="http://www.multispeak.org/Version_4.1_Release"
> >> >>> >
> >> >>> > implementor="x.x.outside.multispeak.oa.server.OAServerSoapImpl"
> >> >>> >             serviceName="tns:OA_Server"
> >> >>> >             endpointName="tns:OA_ServerSoap"
> >> >>> >             address="#{'jms:queue:' +
> >> >>> > '${outside.multispeak.oa.jms.queue}'
> >> >>> > + ''}"
> >> >>> >             publish="false"
> >> >>> >             wsdlLocation="classpath:OA_Server.wsdl">
> >> >>> >             <jaxws:features>
> >> >>> >                 <beans:bean
> >> >>> > class="org.apache.cxf.feature.LoggingFeature "/>
> >> >>> >                 <beans:bean
> >> >>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
> >> >>> >                     <beans:constructor-arg index="0"
> >> >>> > ref="pooled-connection-factory"/>
> >> >>> >                 </beans:bean>
> >> >>> >             </jaxws:features>
> >> >>> >         </jaxws:endpoint>
> >> >>> >
> >> >>> > The Service Endpoint Interface generated.
> >> >>> > There are two methods: pingURL and odEventNotification.
> >> >>> > pingURLAsync, as it has no arguments besides the headers, works
> just
> >> >>> > fine,
> >> >>> > but odEventNotificationAsync does not.
> >> >>> > Note that I am using an AsyncHandler of course. In case of
> >> >>> > pingURLAsync
> >> >>> > I
> >> >>> > can get Holder.value in the handleResponse(Response<T>) callback
> >> >>> > without
> >> >>> > any problems.
> >> >>> >
> >> >>> > @WebService(targetNamespace =
> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >>> > name = "OA_ServerSoap")
> >> >>> > @XmlSeeAlso({ObjectFactory.class,
> >> >>> > org.w3.xlink.OA.ObjectFactory.class,
> >> >>> > org.gml.version_4_1.OA.ObjectFactory.class,
> >> >>> > org.cspm.version_4_1.OA.ObjectFactory.class})
> >> >>> > public interface OAServerSoap {
> >> >>> >
> >> >>> > ...
> >> >>> >
> >> >>> > @RequestWrapper(localName = "PingURL", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
> targetNamespace
> >> >>> > = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >> >>> >     @WebMethod(operationName = "PingURL")
> >> >>> >     public
> Response<org.multispeak.version_4_1_6.OA.PingURLResponse>
> >> >>> > pingURLAsync(
> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
> "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >>> > "MultiSpeakMsgHeader",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > header =
> >> >>> > true)
> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >>> > multiSpeakMsgHeader1
> >> >>> >     );
> >> >>> >
> >> >>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
> targetNamespace
> >> >>> > = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >> >>> >     @WebMethod(operationName = "PingURL")
> >> >>> >     public Future<?> pingURLAsync(
> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
> "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >>> > "MultiSpeakMsgHeader",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > header =
> >> >>> > true)
> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >>> > multiSpeakMsgHeader1,
> >> >>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
> >> >>> >
> >> >>> > AsyncHandler<org.multispeak.version_4_1_6.OA.PingURLResponse>
> >> >>> > asyncHandler
> >> >>> >     );
> >> >>> >
> >> >>> >     /**
> >> >>> >      * Requester pings URL of OA to see if it is alive.  Returns
> >> >>> > errorObject(s) as necessary to communicate application status.
> >> >>> >      */
> >> >>> >     @WebResult(name = "PingURLResult", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
> >> >>> >     @WebMethod(operationName = "PingURL", action = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release/PingURL")
> >> >>> >     @ResponseWrapper(localName = "PingURLResponse",
> targetNamespace
> >> >>> > = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >> >>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
> >> >>> > pingURL(
> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
> "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >>> > "MultiSpeakMsgHeader",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > header =
> >> >>> > true)
> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >>> > multiSpeakMsgHeader1
> >> >>> >     );
> >> >>> >
> >> >>> > @RequestWrapper(localName = "ODEventNotification",
> targetNamespace =
> >> >>> > "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > className =
> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >> >>> >     @WebMethod(operationName = "ODEventNotification")
> >> >>> >     public
> >> >>> >
> >> >>> >
> Response<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> >> >>> > odEventNotificationAsync(
> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >>> >
>  org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> >> >>> > odEvents,
> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >>> >         java.lang.String transactionID,
> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
> "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >>> > "MultiSpeakMsgHeader",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > header =
> >> >>> > true)
> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >>> > multiSpeakMsgHeader1
> >> >>> >     );
> >> >>> >
> >> >>> >     @RequestWrapper(localName = "ODEventNotification",
> >> >>> > targetNamespace
> >> >>> > = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > className =
> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >> >>> >     @WebMethod(operationName = "ODEventNotification")
> >> >>> >     public Future<?> odEventNotificationAsync(
> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >>> >
>  org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> >> >>> > odEvents,
> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >>> >         java.lang.String transactionID,
> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
> "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >>> > "MultiSpeakMsgHeader",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > header =
> >> >>> > true)
> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >>> > multiSpeakMsgHeader1,
> >> >>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
> >> >>> >
> >> >>> >
> >> >>> >
> >> >>> >
> AsyncHandler<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> >> >>> > asyncHandler
> >> >>> >     );
> >> >>> >
> >> >>> >     /**
> >> >>> >      * Publisher notifies OA of a change in OutageDetectionEvents
> by
> >> >>> > sending an array of changed OutageDetectionEvent objects.  OA
> >> >>> > returns
> >> >>> > information about failed transactions using an array of
> >> >>> > errorObjects.
> >> >>> > The
> >> >>> > message header attribute 'registrationID' should be added to all
> >> >>> > publish
> >> >>> > messages to indicate to the subscriber under which registrationID
> >> >>> > they
> >> >>> > received this notification data.
> >> >>> >      */
> >> >>> >     @WebResult(name = "ODEventNotificationResult",
> targetNamespace =
> >> >>> > "
> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >>> >     @RequestWrapper(localName = "ODEventNotification",
> >> >>> > targetNamespace
> >> >>> > = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", className =
> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >> >>> >     @WebMethod(operationName = "ODEventNotification", action = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release/ODEventNotification
> ")
> >> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > className =
> >> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >> >>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
> >> >>> > odEventNotification(
> >> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >>> >
>  org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> >> >>> > odEvents,
> >> >>> >         @WebParam(name = "transactionID", targetNamespace = "
> >> >>> > http://www.multispeak.org/Version_4.1_Release")
> >> >>> >         java.lang.String transactionID,
> >> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace =
> "
> >> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
> >> >>> > "MultiSpeakMsgHeader",
> >> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >> >>> > header =
> >> >>> > true)
> >> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
> >> >>> > multiSpeakMsgHeader1
> >> >>> >     );
> >> >>> >
> >> >>> > ...
> >> >>> >
> >> >>> > The SEI implementation.
> >> >>> > Both pingURL and odEventNotification simply forward the call to a
> >> >>> > delegate.
> >> >>> > Both inbound and outbound headers are placed in a common container
> >> >>> > and
> >> >>> > handed over to the delegate.
> >> >>> > The async methods simply execute the calls in background and end
> up
> >> >>> > calling
> >> >>> > the sync methods internally.
> >> >>> > The line
> >> >>> >
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >>> > simply calls multiSpeakMsgHeader1.value = ...
> >> >>> >
> >> >>> > @WebService(
> >> >>> >         serviceName = "OA_Server",
> >> >>> >         portName = "OA_ServerSoap",
> >> >>> >         targetNamespace =
> >> >>> > "http://www.multispeak.org/Version_4.1_Release",
> >> >>> >         wsdlLocation = "classpath:OA_Server.wsdl",
> >> >>> >         endpointInterface =
> >> >>> > "org.multispeak.version_4_1_6.OA.OAServerSoap")
> >> >>> > public class OAServerSoapImpl implements OAServerSoap {
> >> >>> >
> >> >>> > ...
> >> >>> >
> >> >>> > @Override
> >> >>> >     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
> >> >>> > multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
> >> >>> > multiSpeakMsgHeader1)
> >> >>> > {
> >> >>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >> >>> >         try {
> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader);
> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1);
> >> >>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader
> =
> >> >>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader,
> multiSpeakMsgHeader1);
> >> >>> >
> >> >>> >
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >>> >             return
> >> >>> >
> LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
> >> >>> >         } catch (Throwable t) {
> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
> >> >>> >         }
> >> >>> >     }
> >> >>> >
> >> >>> > @Override
> >> >>> > @UseAsyncMethod
> >> >>> > public ArrayOfErrorObject
> >> >>> > odEventNotification(ArrayOfOutageDetectionEvent
> >> >>> > odEvents, String transactionID, MultiSpeakMsgHeader
> >> >>> > multiSpeakMsgHeader,
> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
> >> >>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> >> >>> > multiSpeakMsgHeader1);
> >> >>> >         try {
> >> >>> >             Preconditions.checkNotNull(odEvents, "odEvents");
> >> >>> >             Preconditions.checkNotNull(transactionID,
> >> >>> > "transactionID");
> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader,
> >> >>> > "multiSpeakMsgHeader");
> >> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1,
> >> >>> > "multiSpeakMsgHeader1");
> >> >>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader
> =
> >> >>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader,
> multiSpeakMsgHeader1);
> >> >>> >
> >> >>> >
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >> >>> >             return
> >> >>> >
> >> >>> >
> >> >>> >
> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
> >> >>> > transactionID, mspkHeader)));
> >> >>> >         } catch (Throwable t) {
> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
> >> >>> >         }
> >> >>> >     }
> >> >>> >
> >> >>> >     @Override
> >> >>> >     public Future<?> pingURLAsync(MultiSpeakMsgHeader
> >> >>> > multiSpeakMsgHeader,
> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >> >>> > AsyncHandler<PingURLResponse> asyncHandler) {
> >> >>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
> >> >>> > asyncHandler);
> >> >>> >         try {
> >> >>> >             PingURLAsync response = new PingURLAsync(this,
> >> >>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >> >>> >             mExecutor.submit(response);
> >> >>> >             return LOG.exit(response.getServerAsyncResponse());
> >> >>> >         } catch (Throwable t) {
> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
> >> >>> >         }
> >> >>> >     }
> >> >>> >
> >> >>> > @Override
> >> >>> >     public Future<?>
> >> >>> > odEventNotificationAsync(ArrayOfOutageDetectionEvent
> >> >>> > odEvents, String transactionID, MultiSpeakMsgHeader
> >> >>> > multiSpeakMsgHeader,
> >> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >> >>> > AsyncHandler<ODEventNotificationResponse> asyncHandler) {
> >> >>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> >> >>> > multiSpeakMsgHeader1);
> >> >>> >         try {
> >> >>> >             OdEventNotificationAsync response = new
> >> >>> > OdEventNotificationAsync(this, odEvents, transactionID,
> >> >>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >> >>> >             mExecutor.submit(response);
> >> >>> >             return LOG.exit(response.getServerAsyncResponse());
> >> >>> >         } catch (Throwable t) {
> >> >>> >             throw LOG.throwing(Throwables.unchecked(t));
> >> >>> >         }
> >> >>> >     }
> >> >>> >
> >> >>> > ...
> >> >>> >
> >> >>> > The invocation test.
> >> >>> >
> >> >>> > ...
> >> >>> > Holder<MultiSpeakMsgHeader> headerOut = new
> >> >>> > Holder<MultiSpeakMsgHeader>();
> >> >>> > Future<?> future = mServer.odEventNotificationAsync(new
> >> >>> > ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
> >> >>> > headerOut,
> >> >>> > new AsyncHandlerImpl(headerOut));
> >> >>> > ...
> >> >>> > private static class AsyncHandlerImpl implements
> >> >>> > AsyncHandler<ODEventNotificationResponse> {
> >> >>> >
> >> >>> >         private static final XLogger LOG =
> >> >>> > XLoggerFactory.getXLogger(AsyncHandlerImpl.class);
> >> >>> >
> >> >>> >         private final Holder<MultiSpeakMsgHeader> mHeaderOut;
> >> >>> >
> >> >>> >         public AsyncHandlerImpl(Holder<MultiSpeakMsgHeader>
> >> >>> > headerOut)
> >> >>> > {
> >> >>> >             mHeaderOut = headerOut;
> >> >>> >         }
> >> >>> >
> >> >>> >         @Override
> >> >>> >         public void
> >> >>> > handleResponse(Response<ODEventNotificationResponse>
> >> >>> > res) {
> >> >>> >             try {
> >> >>> >                 if (LOG.isTraceEnabled()) {
> >> >>> >                     LOG.trace("Callback: {}", res.toString());
> >> >>> >                 }
> >> >>> >                 ODEventNotificationResponse mspkRsp = res.get();
> >> >>> >                 if (LOG.isTraceEnabled()) {
> >> >>> >                     LOG.trace("OA odEventNotificationAsync() >>
> >> >>> > callback:
> >> >>> > {} > multispeak header: {}", mspkRsp.toString(),
> mHeaderOut.value);
> >> >>> > //                    for (Entry<String, Object> entry :
> >> >>> > res.getContext().entrySet()) {
> >> >>> > //                        LOG.trace("Response context >> string >
> {}
> >> >>> > >>
> >> >>> > object > {}", entry.getKey(), entry.getValue());
> >> >>> > //                    }
> >> >>> >                 }
> >> >>> >             } catch (Exception e) {
> >> >>> >                 LOG.catching(e);
> >> >>> >             }
> >> >>> >         }
> >> >>> >     }
> >> >>> >
> >> >>> > As I said above, a NPE is thrown in HolderOutInterceptor when the
> >> >>> > response
> >> >>> > is returned to the client if I use the pure async method with
> >> >>> > @UseAsyncMethod,
> >> >>> > or mHeaderOut.value is null if I don't. Now, the stacktrace:
> >> >>> >
> >> >>> > 28-11-2014 17:15:07.997 WARN  [OA Thread-#1]
> >> >>> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor
> for {
> >> >>> >
> >> >>> >
> >> >>> >
> http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}ODEventNotification
> >> >>> > has thrown exception, unwinding now
> >> >>> > java.lang.NullPointerException
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.jaxws.interceptors.HolderOutInterceptor.handleMessage(HolderOutInterceptor.java:90)
> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:81)
> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)
> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.jms.continuations.JMSContinuation.doResume(JMSContinuation.java:109)
> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.jms.continuations.JMSContinuation.resume(JMSContinuation.java:98)
> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker$JaxwsServerHandler.handleResponse(AbstractJAXWSMethodInvoker.java:193)
> >> >>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireResult(AbstractAsyncResponseHandler.java:55)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireAsyncResult(AbstractAsyncResponseHandler.java:46)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.postProcess(AbstractAsyncResponseHandler.java:41)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable$1.invoke(ConditionEnforcerHandlerRunnable.java:10)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.common.util.ConditionEnforcerHandler$2.invoke(ConditionEnforcerHandler.java:25)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.common.util.ExceptionHandler.handle(ExceptionHandler.java:7)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.common.util.ConditionEnforcerHandler.handle(ConditionEnforcerHandler.java:20)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable.run(ConditionEnforcerHandlerRunnable.java:7)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at
> >> >>> > java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> >> >>> > 28-11-2014 17:15:08.044 TRACE [ActiveMQ Session Task-1]
> >> >>> >
> >> >>> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> >> >>> > handleResponse - Callback:
> >> >>> > org.apache.cxf.jaxws.JaxwsClientCallback$2@cc6f8c
> >> >>> > 28-11-2014 17:15:08.044 ERROR [ActiveMQ Session Task-1]
> >> >>> >
> >> >>> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> >> >>> > handleResponse - catching
> >> >>> > java.util.concurrent.ExecutionException:
> >> >>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> >> >>> > processing.
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.jaxws.JaxwsClientCallback$2.get(JaxwsClientCallback.java:99)
> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl.handleResponse(OAServerTestAsyncCallback.java:81)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.jaxws.JaxwsClientCallback.handleException(JaxwsClientCallback.java:87)
> >> >>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:821)
> >> >>> > [cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> >> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> >> >>> > [activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> >> >>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred
> >> >>> > while
> >> >>> > processing.
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     ... 11 more
> >> >>> > 28-11-2014 17:15:08.045 ERROR
> >> >>> > [x.x.outside.test.multispeak.OAServerTestAsyncCallback-1]
> >> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback run -
> catching
> >> >>> > java.util.concurrent.ExecutionException:
> >> >>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> >> >>> > processing.
> >> >>> >     at
> >> >>> >
> org.apache.cxf.endpoint.ClientCallback.get(ClientCallback.java:169)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.jaxws.JaxwsResponseCallback.get(JaxwsResponseCallback.java:54)
> >> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$1.run(OAServerTestAsyncCallback.java:52)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> x.x.outside.test.multispeak.spi.AbstractMultispeakServerTest$2.run(AbstractMultispeakServerTest.java:112)
> >> >>> > [classes/:?]
> >> >>> >     at
> >> >>> >
> >> >>> >
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at
> >> >>> > java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> >> >>> > [?:1.6.0_33]
> >> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> >> >>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred
> >> >>> > while
> >> >>> > processing.
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> >> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> >> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> >> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     at
> >> >>> >
> >> >>> >
> >> >>> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> >> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
> >> >>> >     ... 3 more
> >> >>> >
> >> >>> > Is this a configuration problem? Am I doing something stupid?
> >> >>> > Thanks!
> >> >>> >
> >> >>> > Regards,
> >> >>> >
> >> >>> > André Costa Lima
> >> >>
> >> >>
> >> >
> >
> >
>

Re: NPE at HolderOutInterceptor / Holder.value is null

Posted by Aki Yoshida <el...@gmail.com>.
I just created one project that combines the soap_header and
jaxws_async samples. And this is working fine as one expects.

Since this project is straightforward and will add not much value to
the current sample collection but rather make the collection more
crowded with overlapping samples, so I am not planning to add it to
the cxf's samples.

I uploaded this project to my dropbox here. So you can compare it to
your example.
https://www.dropbox.com/s/hexnh3jgy9o8c61/cxf_samples_jaxws_async_soap_header.tar.gz?dl=0

regards, aki

2014-12-02 17:31 GMT+01:00 André Costa Lima <an...@gmail.com>:
> Alright. Yes, the sync case works perfectly. Should I submit a bug in JIRA?
>
> André Costa Lima
>
>
> 2014-12-02 16:27 GMT+00:00 Aki Yoshida <el...@gmail.com>:
>>
>> Hi André,
>> I thought you were getting no value returned for the synchronous case
>> and when using the async mode, getting an NPE from one of the
>> interceptors.
>> So I wanted to have the first issue fixed that might fix the second issue.
>>
>> But if you didn't have any issue with the sync Holder case, I have to
>> look into the async case. It looks like there is some mismatch in the
>> defined operations and the values passed in the context. I can't tell
>> what is causing this issue. I have to take a look at it.
>>
>> regards, aki
>>
>> 2014-12-02 13:57 GMT+01:00 André Costa Lima <an...@gmail.com>:
>> > I just noticed that the sample you linked me to refers only to
>> > synchronous
>> > invocations only. The sample jaxws_async shows how to do generate async
>> > invariants of the methods and how to invoke them, but does not
>> > demonstrate
>> > how to use Holder<T> in this case. So, maybe, I'm doing it all wrong
>> > because
>> > CXF might not support this? Holder<T> works just fine in synchronous
>> > invocations.
>> >
>> > My SEI was not generated correctly anyways. According to the sample,
>> > when
>> > the method receives a SOAP header and produces one, wsdl2java generates
>> > a
>> > SEI with an Holder with Mode.INOUT. I guess the option
>> > -autoNameResolution
>> > was forcing the creation of an extra input parameter in the method. I
>> > had no
>> > conflicts, so I removed the option and now the Holder with Mode.INOUT is
>> > generated. I fixed all my methods in the SEI implementation accordingly.
>> >
>> > I tested my invocations again. Now the Holder receives in the
>> > constructor
>> > the input header. Without @UseAsyncMethod:
>> >
>> > Holder<MultiSpeakMsgHeader> headerOut = new
>> > Holder<MultiSpeakMsgHeader>(new
>> > MultiSpeakMsgHeader());
>> > Future<?> future = mServer.odEventNotificationAsync(new
>> > ArrayOfOutageDetectionEvent(), "0", headerOut, new
>> > AsyncHandlerImpl(headerOut));
>> >
>> > Still does not work. When the client reads the value field, it does not
>> > get
>> > the new header object created by the server.
>> > With @UseAsyncMethod still throws the NPE in the same line.
>> >
>> > When I invoked the argumentless method, again without @UseAsyncMethod:
>> >
>> > Holder<MultiSpeakMsgHeader> headerOut = new
>> > Holder<MultiSpeakMsgHeader>(new
>> > MultiSpeakMsgHeader());
>> > Future<?> future = mServer.pingURLAsync(headerOut, new
>> > AsyncHandlerImpl(headerOut));
>> >
>> > I get another exception, this time in HolderInInterceptor. (I've updated
>> > to
>> > 3.0.2) The stacktrace is below:
>> >
>> > 02-12-2014 12:48:28.643 WARN  [ActiveMQ Session Task-2]
>> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for
>> >
>> > {http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}PingURL
>> > has thrown exception, unwinding now
>> > java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
>> >     at java.util.ArrayList.rangeCheck(ArrayList.java:571) ~[?:1.6.0_33]
>> >     at java.util.ArrayList.get(ArrayList.java:349) ~[?:1.6.0_33]
>> >     at
>> >
>> > org.apache.cxf.jaxws.interceptors.HolderInInterceptor.handleMessage(HolderInInterceptor.java:67)
>> > ~[cxf-rt-frontend-jaxws-3.0.2.jar:3.0.2]
>> >     at
>> >
>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> > [cxf-core-3.0.2.jar:3.0.2]
>> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
>> > [cxf-core-3.0.2.jar:3.0.2]
>> >     at
>> >
>> > org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
>> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
>> >     at
>> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
>> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
>> >     at
>> >
>> > org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
>> > [cxf-rt-transports-jms-3.0.2.jar:3.0.2]
>> >     at
>> >
>> > org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> > org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> > org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> > org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> > org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> > [?:1.6.0_33]
>> >     at
>> >
>> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> > [?:1.6.0_33]
>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> >
>> > So maybe there is an issue when manipulating Holder objects in async
>> > invocations of methods with arguments?
>> >
>> > André Costa Lima
>> >
>> >
>> > 2014-12-01 15:44 GMT+00:00 André Costa Lima <an...@gmail.com>:
>> >>
>> >> Thanks for your response. I'll narrow it down to the necessary.
>> >>
>> >> SEI implementation:
>> >>
>> >> @WebService(
>> >>         serviceName = "OA_Server",
>> >>         portName = "OA_ServerSoap",
>> >>         targetNamespace =
>> >> "http://www.multispeak.org/Version_4.1_Release",
>> >>         wsdlLocation = "classpath:OA_Server.wsdl",
>> >>         endpointInterface = "org.multispeak.version_4_1_6.
>> >> OA.OAServerSoap")
>> >> public class OAServerSoapImpl implements OAServerSoap {
>> >>
>> >> ...
>> >>
>> >> @Override
>> >>     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
>> >> multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1)
>> >> {
>> >>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >>         try {
>> >>             Preconditions.checkNotNull(multiSpeakMsgHeader);
>> >>             Preconditions.checkNotNull(multiSpeakMsgHeader1);
>> >>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
>> >> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >>
>> >> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >>             return
>> >> LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
>> >>         } catch (Throwable t) {
>> >>             throw LOG.throwing(Throwables.unchecked(t));
>> >>         }
>> >>     }
>> >>
>> >> @Override
>> >> @UseAsyncMethod
>> >> public ArrayOfErrorObject odEventNotification(
>> >> ArrayOfOutageDetectionEvent odEvents, String transactionID,
>> >> MultiSpeakMsgHeader multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
>> >> multiSpeakMsgHeader1) {
>> >>
>> >>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> >> multiSpeakMsgHeader1);
>> >>         try {
>> >>             Preconditions.checkNotNull(odEvents, "odEvents");
>> >>             Preconditions.checkNotNull(transactionID, "transactionID");
>> >>             Preconditions.checkNotNull(multiSpeakMsgHeader,
>> >> "multiSpeakMsgHeader");
>> >>             Preconditions.checkNotNull(multiSpeakMsgHeader1,
>> >> "multiSpeakMsgHeader1");
>> >>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
>> >> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >>
>> >> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >>             return
>> >>
>> >> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
>> >> transactionID, mspkHeader)));
>> >>         } catch (Throwable t) {
>> >>             throw LOG.throwing(Throwables.unchecked(t));
>> >>         }
>> >>     }
>> >>
>> >>     @Override
>> >>     public Future<?> pingURLAsync(MultiSpeakMsgHeader
>> >> multiSpeakMsgHeader,
>> >> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >> AsyncHandler<PingURLResponse> asyncHandler) {
>> >>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
>> >> asyncHandler);
>> >>         try {
>> >>             PingURLAsync response = new PingURLAsync(this,
>> >> multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>> >>             mExecutor.submit(response);
>> >>             return LOG.exit(response.getServerAsyncResponse());
>> >>         } catch (Throwable t) {
>> >>             throw LOG.throwing(Throwables.unchecked(t));
>> >>         }
>> >>     }
>> >>
>> >> @Override
>> >>     public Future<?>
>> >> odEventNotificationAsync(ArrayOfOutageDetectionEvent
>> >> odEvents, String transactionID, MultiSpeakMsgHeader
>> >> multiSpeakMsgHeader,
>> >> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >> AsyncHandler<ODEventNotificationResponse> asyncHandler) {
>> >>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> >> multiSpeakMsgHeader1);
>> >>         try {
>> >>             OdEventNotificationAsync response = new
>> >> OdEventNotificationAsync(this, odEvents, transactionID,
>> >> multiSpeakMsgHeader,
>> >> multiSpeakMsgHeader1, asyncHandler);
>> >>             mExecutor.submit(response);
>> >>             return LOG.exit(response.getServerAsyncResponse());
>> >>         } catch (Throwable t) {
>> >>             throw LOG.throwing(Throwables.unchecked(t));
>> >>         }
>> >>     }
>> >>
>> >> ...
>> >>
>> >> }
>> >>
>> >> To make it clear, I'll add the code to the MultiSpeakInOutHeader class:
>> >>
>> >> public final class MultiSpeakInOutHeader<T> {
>> >>
>> >>     private final T mIn;
>> >>     private final Holder<T> mOut;
>> >>
>> >>     private MultiSpeakInOutHeader(T in, Holder<T> out) {
>> >>         Preconditions.checkNotNull(in);
>> >>         Preconditions.checkNotNull(out);
>> >>         mIn = in;
>> >>         mOut = out;
>> >>     }
>> >>
>> >>     public T getInbound() {
>> >>         return mIn;
>> >>     }
>> >>
>> >>     public T getOutbound() {
>> >>         return getHolder().value;
>> >>     }
>> >>
>> >>     public void setOutbound(T out) {
>> >>         getHolder().value = out;
>> >>     }
>> >>
>> >>     private Holder<T> getHolder() {
>> >>         return mOut;
>> >>     }
>> >>
>> >>     public static <T> MultiSpeakInOutHeader<T> of(T inbound, Holder<T>
>> >> outbound) {
>> >>         return new MultiSpeakInOutHeader<T>(inbound, outbound);
>> >>     }
>> >> }
>> >>
>> >> When I invoke:
>> >>
>> >> Holder<MultiSpeakMsgHeader> headerOut = new
>> >> Holder<MultiSpeakMsgHeader>();
>> >> Future<?> future = mServer.odEventNotificationAsync(new
>> >> ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
>> >> headerOut,
>> >> new AsyncHandlerImpl(headerOut));
>> >>
>> >> an NPE is thrown at HolderOutInterceptor If I use @UseAsyncMethod or
>> >> headerOut.value is null if I don't. Now, when I invoke:
>> >>
>> >> Holder<MultiSpeakMsgHeader> headerOut = new
>> >> Holder<MultiSpeakMsgHeader>();
>> >> Future<?> future = mServer.pingURLAsync(new MultiSpeakMsgHeader(),
>> >> headerOut, new AsyncHandlerImpl(headerOut));
>> >>
>> >> it works. The client can see the value field / no NPE is thrown.
>> >>
>> >> Comparing my code to the sample, I believe I'm doing it correctly:
>> >>
>> >> 1. The client creates the Holder object and passes it down to the
>> >> method
>> >> invocation
>> >> 2. The server assigns the value field before returning
>> >>
>> >> It's rather strange that one invocation works and the other does not.
>> >> The
>> >> only difference between them is that pingURL has no arguments and
>> >> odEventNotification has one (ArrayOfOutageDetectionEvent). I have
>> >> another
>> >> argumentless method that works just fine as well and another with
>> >> arguments
>> >> that does not, so I think the problem lies in the number of arguments
>> >> somehow or how the Holder types are manipulated.
>> >>
>> >> If the test that you linked me to works in the current release of CXF,
>> >> maybe I have something wrong with my configuration?
>> >> I will run that same test in my machine to see how it goes.
>> >>
>> >> Thanks.
>> >>
>> >> Regards,
>> >>
>> >>
>> >> André Costa Lima
>> >>
>> >>
>> >> 2014-12-01 15:04 GMT+00:00 Aki Yoshida <el...@gmail.com>:
>> >>>
>> >>> Your post is kind of too long and I am not really seeing how your
>> >>> client is calling the method and how your service is setting the
>> >>> value,
>> >>> Could you compare that to the cxf's sample code at
>> >>> samples/soap_header/src/main/java/demo/soap_header/(client|server)?
>> >>>
>> >>>
>> >>> 2014-11-28 18:21 GMT+01:00 André Costa Lima <an...@gmail.com>:
>> >>> > Hello,
>> >>> >
>> >>> > I am a new CXF (v3.0.0) user. Actually, I am new to the whole JAX-WS
>> >>> > thing.
>> >>> > :)
>> >>> > I have set up a JAX-WS service, SOAP over JMS with ActiveMQ. The
>> >>> > server
>> >>> > methods invocations are working fine, but I am having some trouble
>> >>> > regarding the Holder class.
>> >>> > I am using the holder class as a container for the outgoing SOAP
>> >>> > header
>> >>> > for
>> >>> > all web methods, as specified in the WSDL.
>> >>> > I started from WSDL first with Spring configuration for both clients
>> >>> > and
>> >>> > servers.
>> >>> > I have provided an async binding to the wsdl2java tool to generate
>> >>> > the
>> >>> > async method signatures, because I want to use those instead of the
>> >>> > sync
>> >>> > ones.
>> >>> >
>> >>> > The problem is that when I pass the Holder object to the client
>> >>> > method
>> >>> > and
>> >>> > assign the value field in the server, the client sees it as null but
>> >>> > no
>> >>> > exception is thrown.
>> >>> > Further, if I put the @UseAsyncMethod annotation to command CXF to
>> >>> > use
>> >>> > the
>> >>> > pure async method I have implemented, CXF throws NPE at
>> >>> > HolderOutInterceptor class.
>> >>> > I noticed that if the web method has no arguments besides the SOAP
>> >>> > headers
>> >>> > everything works just fine, otherwise what I have described above
>> >>> > happens.
>> >>> >
>> >>> > Below there are my configurations.
>> >>> >
>> >>> > Maven plugin:
>> >>> >
>> >>> > <plugin>
>> >>> > <groupId>org.apache.cxf</groupId>
>> >>> >           <artifactId>cxf-codegen-plugin</artifactId>
>> >>> >           <executions>
>> >>> >           <execution>
>> >>> >                     <id>generate-sources</id>
>> >>> >                               <phase>generate-sources</phase>
>> >>> >                               <configuration>
>> >>> >                               <defaultOptions>
>> >>> >                                         <bindingFiles>
>> >>> >
>> >>> >
>> >>> >
>> >>> > <bindingFile>${basedir}/src/main/resources/oa_types-binding.xml</bindingFile>
>> >>> >
>> >>> >
>> >>> >
>> >>> > <bindingFile>${basedir}/src/main/resources/oa_async-binding.xml</bindingFile>
>> >>> >                                         </bindingFiles>
>> >>> >
>> >>> > <noAddressBinding>true</noAddressBinding>
>> >>> >                                     </defaultOptions>
>> >>> >                                     <sourceRoot>
>> >>> >
>> >>> > ${basedir}/target/generated-sources/cxf
>> >>> >                                     </sourceRoot>
>> >>> >                                     <wsdlOptions>
>> >>> >                                         <wsdlOption>
>> >>> >
>> >>> > <wsdl>${basedir}/src/main/resources/OA_Server.wsdl</wsdl>
>> >>> >
>> >>> > <wsdlLocation>classpath:OA_Server.wsdl</wsdlLocation>
>> >>> >                                             <extraargs>
>> >>> >
>> >>> > <extraarg>-p</extraarg>
>> >>> >                                                 <extraarg>
>> >>> >
>> >>> >
>> >>> > http://www.multispeak.org/Version_4.1_Release=org.multispeak.version_4_1_6.OA
>> >>> > </extraarg>
>> >>> >
>> >>> > <extraarg>-p</extraarg>
>> >>> >
>> >>> > <extraarg>cpsm_V4.1_Release=org.cspm.version_4_1.OA</extraarg>
>> >>> >
>> >>> > <extraarg>-p</extraarg>
>> >>> >
>> >>> > <extraarg>gml_V4.1_Release=org.gml.version_4_1.OA</extraarg>
>> >>> >
>> >>> > <extraarg>-p</extraarg>
>> >>> >                                                 <extraarg>
>> >>> > http://www.w3.org/1999/xlink=org.w3.xlink.OA</extraarg>
>> >>> >
>> >>> > <extraarg>-p</extraarg>
>> >>> >                                                 <extraarg>
>> >>> > http://www.w3.org/2001/XMLSchema=org.w3.xmlschema.OA</extraarg>
>> >>> >                                                 <!--
>> >>> > <extraarg>-p</extraarg> -->
>> >>> >                                                 <!--
>> >>> > <extraarg>org.multispeak.version_4_1_6.OA</extraarg> -->
>> >>> >                                                 <!--
>> >>> > <extraarg>-impl</extraarg> -->
>> >>> >                                                 <!--
>> >>> > <extraarg>-server</extraarg> -->
>> >>> >                                                 <!--
>> >>> > <extraarg>-client</extraarg> -->
>> >>> >
>> >>> > <extraarg>-autoNameResolution</extraarg>
>> >>> >
>> >>> > <extraarg>-fe</extraarg>
>> >>> >
>> >>> > <extraarg>jaxws21</extraarg>
>> >>> >
>> >>> > <extraarg>-exsh</extraarg>
>> >>> >
>> >>> > <extraarg>true</extraarg>
>> >>> >                                             </extraargs>
>> >>> >                                         </wsdlOption>
>> >>> >                                     </wsdlOptions>
>> >>> >                                 </configuration>
>> >>> >                                 <goals>
>> >>> >                                     <goal>wsdl2java</goal>
>> >>> >                                 </goals>
>> >>> > </execution>
>> >>> > </executions>
>> >>> > </plugin>
>> >>> >
>> >>> > Spring:
>> >>> >
>> >>> >     <beans:bean id="connection-factory"
>> >>> > class="org.apache.activemq.ActiveMQConnectionFactory">
>> >>> >         <beans:property name="brokerURL"
>> >>> > value="${outside.multispeak.jms.broker}"/>
>> >>> >     </beans:bean>
>> >>> >
>> >>> >     <beans:bean id="pooled-connection-factory"
>> >>> > class="org.apache.activemq.pool.PooledConnectionFactory"
>> >>> > destroy-method="stop">
>> >>> >         <beans:constructor-arg index="0" ref="connection-factory"/>
>> >>> >         <beans:property name="expiryTimeout"
>> >>> > value="${outside.multispeak.jms.pool.expiryTimeout}"/>
>> >>> >     </beans:bean>
>> >>> >
>> >>> > <!-- multispeak call handling interface (OA) -->
>> >>> >
>> >>> >         <!-- client side -->
>> >>> >
>> >>> >         <jaxws:client
>> >>> >             id="multispeak-oa-client"
>> >>> >             xmlns:ns="http://www.multispeak.org/Version_4.1_Release"
>> >>> >
>> >>> > serviceClass="org.multispeak.version_4_1_6.OA.OAServerSoap"
>> >>> >             serviceName="ns:OA_Server"
>> >>> >             endpointName="ns:OA_ServerSoap"
>> >>> >             address="#{'jms:queue:'
>> >>> >                 + '${outside.multispeak.oa.jms.queue}'
>> >>> >                 + '?timeToLive=' +
>> >>> > '${outside.multispeak.jms.timeToLive}'
>> >>> >                 + '&amp;requestTimeout' +
>> >>> > '${outside.multispeak.jms.receiveTimeout}'}"
>> >>> >             wsdlLocation="classpath:OA_Server.wsdl">
>> >>> >             <jaxws:features>
>> >>> >                 <beans:bean
>> >>> > class="org.apache.cxf.feature.LoggingFeature "/>
>> >>> >                 <beans:bean
>> >>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
>> >>> >                     <beans:constructor-arg index="0"
>> >>> > ref="pooled-connection-factory"/>
>> >>> >                 </beans:bean>
>> >>> >             </jaxws:features>
>> >>> >            </jaxws:client>
>> >>> >
>> >>> >         <!-- server side -->
>> >>> >
>> >>> >         <beans:bean id="forwarding-oa-server"
>> >>> > class="${outside.multispeak.oa.server}" />
>> >>> >         <beans:bean id="multispeak-oa-obj-factory"
>> >>> > class="org.multispeak.version_4_1_6.OA.ObjectFactory" />
>> >>> >
>> >>> >         <jaxws:endpoint
>> >>> >             id="multispeak-oa-server"
>> >>> >
>> >>> > xmlns:tns="http://www.multispeak.org/Version_4.1_Release"
>> >>> >
>> >>> > implementor="x.x.outside.multispeak.oa.server.OAServerSoapImpl"
>> >>> >             serviceName="tns:OA_Server"
>> >>> >             endpointName="tns:OA_ServerSoap"
>> >>> >             address="#{'jms:queue:' +
>> >>> > '${outside.multispeak.oa.jms.queue}'
>> >>> > + ''}"
>> >>> >             publish="false"
>> >>> >             wsdlLocation="classpath:OA_Server.wsdl">
>> >>> >             <jaxws:features>
>> >>> >                 <beans:bean
>> >>> > class="org.apache.cxf.feature.LoggingFeature "/>
>> >>> >                 <beans:bean
>> >>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
>> >>> >                     <beans:constructor-arg index="0"
>> >>> > ref="pooled-connection-factory"/>
>> >>> >                 </beans:bean>
>> >>> >             </jaxws:features>
>> >>> >         </jaxws:endpoint>
>> >>> >
>> >>> > The Service Endpoint Interface generated.
>> >>> > There are two methods: pingURL and odEventNotification.
>> >>> > pingURLAsync, as it has no arguments besides the headers, works just
>> >>> > fine,
>> >>> > but odEventNotificationAsync does not.
>> >>> > Note that I am using an AsyncHandler of course. In case of
>> >>> > pingURLAsync
>> >>> > I
>> >>> > can get Holder.value in the handleResponse(Response<T>) callback
>> >>> > without
>> >>> > any problems.
>> >>> >
>> >>> > @WebService(targetNamespace =
>> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >>> > name = "OA_ServerSoap")
>> >>> > @XmlSeeAlso({ObjectFactory.class,
>> >>> > org.w3.xlink.OA.ObjectFactory.class,
>> >>> > org.gml.version_4_1.OA.ObjectFactory.class,
>> >>> > org.cspm.version_4_1.OA.ObjectFactory.class})
>> >>> > public interface OAServerSoap {
>> >>> >
>> >>> > ...
>> >>> >
>> >>> > @RequestWrapper(localName = "PingURL", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >>> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace
>> >>> > = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >>> >     @WebMethod(operationName = "PingURL")
>> >>> >     public Response<org.multispeak.version_4_1_6.OA.PingURLResponse>
>> >>> > pingURLAsync(
>> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >>> > "MultiSpeakMsgHeader",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > header =
>> >>> > true)
>> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >>> > multiSpeakMsgHeader1
>> >>> >     );
>> >>> >
>> >>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >>> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace
>> >>> > = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >>> >     @WebMethod(operationName = "PingURL")
>> >>> >     public Future<?> pingURLAsync(
>> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >>> > "MultiSpeakMsgHeader",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > header =
>> >>> > true)
>> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >>> > multiSpeakMsgHeader1,
>> >>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
>> >>> >
>> >>> > AsyncHandler<org.multispeak.version_4_1_6.OA.PingURLResponse>
>> >>> > asyncHandler
>> >>> >     );
>> >>> >
>> >>> >     /**
>> >>> >      * Requester pings URL of OA to see if it is alive.  Returns
>> >>> > errorObject(s) as necessary to communicate application status.
>> >>> >      */
>> >>> >     @WebResult(name = "PingURLResult", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >>> >     @WebMethod(operationName = "PingURL", action = "
>> >>> > http://www.multispeak.org/Version_4.1_Release/PingURL")
>> >>> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace
>> >>> > = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
>> >>> > pingURL(
>> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >>> > "MultiSpeakMsgHeader",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > header =
>> >>> > true)
>> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >>> > multiSpeakMsgHeader1
>> >>> >     );
>> >>> >
>> >>> > @RequestWrapper(localName = "ODEventNotification", targetNamespace =
>> >>> > "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > className =
>> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >>> >     @WebMethod(operationName = "ODEventNotification")
>> >>> >     public
>> >>> >
>> >>> > Response<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
>> >>> > odEventNotificationAsync(
>> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >>> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> >>> > odEvents,
>> >>> >         @WebParam(name = "transactionID", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >>> >         java.lang.String transactionID,
>> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >>> > "MultiSpeakMsgHeader",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > header =
>> >>> > true)
>> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >>> > multiSpeakMsgHeader1
>> >>> >     );
>> >>> >
>> >>> >     @RequestWrapper(localName = "ODEventNotification",
>> >>> > targetNamespace
>> >>> > = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > className =
>> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >>> >     @WebMethod(operationName = "ODEventNotification")
>> >>> >     public Future<?> odEventNotificationAsync(
>> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >>> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> >>> > odEvents,
>> >>> >         @WebParam(name = "transactionID", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >>> >         java.lang.String transactionID,
>> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >>> > "MultiSpeakMsgHeader",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > header =
>> >>> > true)
>> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >>> > multiSpeakMsgHeader1,
>> >>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
>> >>> >
>> >>> >
>> >>> >
>> >>> > AsyncHandler<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
>> >>> > asyncHandler
>> >>> >     );
>> >>> >
>> >>> >     /**
>> >>> >      * Publisher notifies OA of a change in OutageDetectionEvents by
>> >>> > sending an array of changed OutageDetectionEvent objects.  OA
>> >>> > returns
>> >>> > information about failed transactions using an array of
>> >>> > errorObjects.
>> >>> > The
>> >>> > message header attribute 'registrationID' should be added to all
>> >>> > publish
>> >>> > messages to indicate to the subscriber under which registrationID
>> >>> > they
>> >>> > received this notification data.
>> >>> >      */
>> >>> >     @WebResult(name = "ODEventNotificationResult", targetNamespace =
>> >>> > "
>> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >>> >     @RequestWrapper(localName = "ODEventNotification",
>> >>> > targetNamespace
>> >>> > = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", className =
>> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >>> >     @WebMethod(operationName = "ODEventNotification", action = "
>> >>> > http://www.multispeak.org/Version_4.1_Release/ODEventNotification")
>> >>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > className =
>> >>> > "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
>> >>> > odEventNotification(
>> >>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >>> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> >>> > odEvents,
>> >>> >         @WebParam(name = "transactionID", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release")
>> >>> >         java.lang.String transactionID,
>> >>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> >>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> >>> > "MultiSpeakMsgHeader",
>> >>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> >>> > header =
>> >>> > true)
>> >>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader>
>> >>> > multiSpeakMsgHeader1
>> >>> >     );
>> >>> >
>> >>> > ...
>> >>> >
>> >>> > The SEI implementation.
>> >>> > Both pingURL and odEventNotification simply forward the call to a
>> >>> > delegate.
>> >>> > Both inbound and outbound headers are placed in a common container
>> >>> > and
>> >>> > handed over to the delegate.
>> >>> > The async methods simply execute the calls in background and end up
>> >>> > calling
>> >>> > the sync methods internally.
>> >>> > The line
>> >>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >>> > simply calls multiSpeakMsgHeader1.value = ...
>> >>> >
>> >>> > @WebService(
>> >>> >         serviceName = "OA_Server",
>> >>> >         portName = "OA_ServerSoap",
>> >>> >         targetNamespace =
>> >>> > "http://www.multispeak.org/Version_4.1_Release",
>> >>> >         wsdlLocation = "classpath:OA_Server.wsdl",
>> >>> >         endpointInterface =
>> >>> > "org.multispeak.version_4_1_6.OA.OAServerSoap")
>> >>> > public class OAServerSoapImpl implements OAServerSoap {
>> >>> >
>> >>> > ...
>> >>> >
>> >>> > @Override
>> >>> >     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
>> >>> > multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
>> >>> > multiSpeakMsgHeader1)
>> >>> > {
>> >>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >>> >         try {
>> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader);
>> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1);
>> >>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
>> >>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >>> >
>> >>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >>> >             return
>> >>> > LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
>> >>> >         } catch (Throwable t) {
>> >>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >>> >         }
>> >>> >     }
>> >>> >
>> >>> > @Override
>> >>> > @UseAsyncMethod
>> >>> > public ArrayOfErrorObject
>> >>> > odEventNotification(ArrayOfOutageDetectionEvent
>> >>> > odEvents, String transactionID, MultiSpeakMsgHeader
>> >>> > multiSpeakMsgHeader,
>> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
>> >>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> >>> > multiSpeakMsgHeader1);
>> >>> >         try {
>> >>> >             Preconditions.checkNotNull(odEvents, "odEvents");
>> >>> >             Preconditions.checkNotNull(transactionID,
>> >>> > "transactionID");
>> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader,
>> >>> > "multiSpeakMsgHeader");
>> >>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1,
>> >>> > "multiSpeakMsgHeader1");
>> >>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
>> >>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >>> >
>> >>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >>> >             return
>> >>> >
>> >>> >
>> >>> > LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
>> >>> > transactionID, mspkHeader)));
>> >>> >         } catch (Throwable t) {
>> >>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >>> >         }
>> >>> >     }
>> >>> >
>> >>> >     @Override
>> >>> >     public Future<?> pingURLAsync(MultiSpeakMsgHeader
>> >>> > multiSpeakMsgHeader,
>> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >>> > AsyncHandler<PingURLResponse> asyncHandler) {
>> >>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
>> >>> > asyncHandler);
>> >>> >         try {
>> >>> >             PingURLAsync response = new PingURLAsync(this,
>> >>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>> >>> >             mExecutor.submit(response);
>> >>> >             return LOG.exit(response.getServerAsyncResponse());
>> >>> >         } catch (Throwable t) {
>> >>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >>> >         }
>> >>> >     }
>> >>> >
>> >>> > @Override
>> >>> >     public Future<?>
>> >>> > odEventNotificationAsync(ArrayOfOutageDetectionEvent
>> >>> > odEvents, String transactionID, MultiSpeakMsgHeader
>> >>> > multiSpeakMsgHeader,
>> >>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >>> > AsyncHandler<ODEventNotificationResponse> asyncHandler) {
>> >>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> >>> > multiSpeakMsgHeader1);
>> >>> >         try {
>> >>> >             OdEventNotificationAsync response = new
>> >>> > OdEventNotificationAsync(this, odEvents, transactionID,
>> >>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>> >>> >             mExecutor.submit(response);
>> >>> >             return LOG.exit(response.getServerAsyncResponse());
>> >>> >         } catch (Throwable t) {
>> >>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >>> >         }
>> >>> >     }
>> >>> >
>> >>> > ...
>> >>> >
>> >>> > The invocation test.
>> >>> >
>> >>> > ...
>> >>> > Holder<MultiSpeakMsgHeader> headerOut = new
>> >>> > Holder<MultiSpeakMsgHeader>();
>> >>> > Future<?> future = mServer.odEventNotificationAsync(new
>> >>> > ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
>> >>> > headerOut,
>> >>> > new AsyncHandlerImpl(headerOut));
>> >>> > ...
>> >>> > private static class AsyncHandlerImpl implements
>> >>> > AsyncHandler<ODEventNotificationResponse> {
>> >>> >
>> >>> >         private static final XLogger LOG =
>> >>> > XLoggerFactory.getXLogger(AsyncHandlerImpl.class);
>> >>> >
>> >>> >         private final Holder<MultiSpeakMsgHeader> mHeaderOut;
>> >>> >
>> >>> >         public AsyncHandlerImpl(Holder<MultiSpeakMsgHeader>
>> >>> > headerOut)
>> >>> > {
>> >>> >             mHeaderOut = headerOut;
>> >>> >         }
>> >>> >
>> >>> >         @Override
>> >>> >         public void
>> >>> > handleResponse(Response<ODEventNotificationResponse>
>> >>> > res) {
>> >>> >             try {
>> >>> >                 if (LOG.isTraceEnabled()) {
>> >>> >                     LOG.trace("Callback: {}", res.toString());
>> >>> >                 }
>> >>> >                 ODEventNotificationResponse mspkRsp = res.get();
>> >>> >                 if (LOG.isTraceEnabled()) {
>> >>> >                     LOG.trace("OA odEventNotificationAsync() >>
>> >>> > callback:
>> >>> > {} > multispeak header: {}", mspkRsp.toString(), mHeaderOut.value);
>> >>> > //                    for (Entry<String, Object> entry :
>> >>> > res.getContext().entrySet()) {
>> >>> > //                        LOG.trace("Response context >> string > {}
>> >>> > >>
>> >>> > object > {}", entry.getKey(), entry.getValue());
>> >>> > //                    }
>> >>> >                 }
>> >>> >             } catch (Exception e) {
>> >>> >                 LOG.catching(e);
>> >>> >             }
>> >>> >         }
>> >>> >     }
>> >>> >
>> >>> > As I said above, a NPE is thrown in HolderOutInterceptor when the
>> >>> > response
>> >>> > is returned to the client if I use the pure async method with
>> >>> > @UseAsyncMethod,
>> >>> > or mHeaderOut.value is null if I don't. Now, the stacktrace:
>> >>> >
>> >>> > 28-11-2014 17:15:07.997 WARN  [OA Thread-#1]
>> >>> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for {
>> >>> >
>> >>> >
>> >>> > http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}ODEventNotification
>> >>> > has thrown exception, unwinding now
>> >>> > java.lang.NullPointerException
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.jaxws.interceptors.HolderOutInterceptor.handleMessage(HolderOutInterceptor.java:90)
>> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:81)
>> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)
>> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
>> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.transport.jms.continuations.JMSContinuation.doResume(JMSContinuation.java:109)
>> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.transport.jms.continuations.JMSContinuation.resume(JMSContinuation.java:98)
>> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker$JaxwsServerHandler.handleResponse(AbstractJAXWSMethodInvoker.java:193)
>> >>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireResult(AbstractAsyncResponseHandler.java:55)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireAsyncResult(AbstractAsyncResponseHandler.java:46)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.postProcess(AbstractAsyncResponseHandler.java:41)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.common.util.ConditionEnforcerHandlerRunnable$1.invoke(ConditionEnforcerHandlerRunnable.java:10)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.common.util.ConditionEnforcerHandler$2.invoke(ConditionEnforcerHandler.java:25)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.common.util.ExceptionHandler.handle(ExceptionHandler.java:7)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.common.util.ConditionEnforcerHandler.handle(ConditionEnforcerHandler.java:20)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.common.util.ConditionEnforcerHandlerRunnable.run(ConditionEnforcerHandlerRunnable.java:7)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>> >>> > [?:1.6.0_33]
>> >>> >     at
>> >>> > java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>> >>> > [?:1.6.0_33]
>> >>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>> >>> > [?:1.6.0_33]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> >>> > [?:1.6.0_33]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> >>> > [?:1.6.0_33]
>> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> >>> > 28-11-2014 17:15:08.044 TRACE [ActiveMQ Session Task-1]
>> >>> >
>> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
>> >>> > handleResponse - Callback:
>> >>> > org.apache.cxf.jaxws.JaxwsClientCallback$2@cc6f8c
>> >>> > 28-11-2014 17:15:08.044 ERROR [ActiveMQ Session Task-1]
>> >>> >
>> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
>> >>> > handleResponse - catching
>> >>> > java.util.concurrent.ExecutionException:
>> >>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while
>> >>> > processing.
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.jaxws.JaxwsClientCallback$2.get(JaxwsClientCallback.java:99)
>> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl.handleResponse(OAServerTestAsyncCallback.java:81)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.jaxws.JaxwsClientCallback.handleException(JaxwsClientCallback.java:87)
>> >>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:821)
>> >>> > [cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
>> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
>> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
>> >>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
>> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>> >>> > [activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> >>> > [?:1.6.0_33]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> >>> > [?:1.6.0_33]
>> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> >>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred
>> >>> > while
>> >>> > processing.
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     ... 11 more
>> >>> > 28-11-2014 17:15:08.045 ERROR
>> >>> > [x.x.outside.test.multispeak.OAServerTestAsyncCallback-1]
>> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback run - catching
>> >>> > java.util.concurrent.ExecutionException:
>> >>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while
>> >>> > processing.
>> >>> >     at
>> >>> > org.apache.cxf.endpoint.ClientCallback.get(ClientCallback.java:169)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.jaxws.JaxwsResponseCallback.get(JaxwsResponseCallback.java:54)
>> >>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$1.run(OAServerTestAsyncCallback.java:52)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > x.x.outside.test.multispeak.spi.AbstractMultispeakServerTest$2.run(AbstractMultispeakServerTest.java:112)
>> >>> > [classes/:?]
>> >>> >     at
>> >>> >
>> >>> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>> >>> > [?:1.6.0_33]
>> >>> >     at
>> >>> > java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>> >>> > [?:1.6.0_33]
>> >>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>> >>> > [?:1.6.0_33]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> >>> > [?:1.6.0_33]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> >>> > [?:1.6.0_33]
>> >>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> >>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred
>> >>> > while
>> >>> > processing.
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
>> >>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> > org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
>> >>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
>> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
>> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
>> >>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
>> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >>> >     at
>> >>> >
>> >>> >
>> >>> > org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>> >>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >>> >     ... 3 more
>> >>> >
>> >>> > Is this a configuration problem? Am I doing something stupid?
>> >>> > Thanks!
>> >>> >
>> >>> > Regards,
>> >>> >
>> >>> > André Costa Lima
>> >>
>> >>
>> >
>
>

Re: NPE at HolderOutInterceptor / Holder.value is null

Posted by André Costa Lima <an...@gmail.com>.
I just noticed that the sample you linked me to refers only to synchronous
invocations only. The sample jaxws_async shows how to do generate async
invariants of the methods and how to invoke them, but does not demonstrate
how to use Holder<T> in this case. So, maybe, I'm doing it all wrong
because CXF might not support this? Holder<T> works just fine in
synchronous invocations.

My SEI was not generated correctly anyways. According to the sample, when
the method receives a SOAP header and produces one, wsdl2java generates a
SEI with an Holder with Mode.INOUT. I guess the option -autoNameResolution
was forcing the creation of an extra input parameter in the method. I had
no conflicts, so I removed the option and now the Holder with Mode.INOUT is
generated. I fixed all my methods in the SEI implementation accordingly.

I tested my invocations again. Now the Holder receives in the constructor
the input header. Without @UseAsyncMethod:

Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>(new
MultiSpeakMsgHeader());
Future<?> future = mServer.odEventNotificationAsync(new
ArrayOfOutageDetectionEvent(), "0", headerOut, new
AsyncHandlerImpl(headerOut));

Still does not work. When the client reads the value field, it does not get
the new header object created by the server.
With @UseAsyncMethod still throws the NPE in the same line.

When I invoked the argumentless method, again without @UseAsyncMethod:

Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>(new
MultiSpeakMsgHeader());
Future<?> future = mServer.pingURLAsync(headerOut, new
AsyncHandlerImpl(headerOut));

I get another exception, this time in HolderInInterceptor. (I've updated to
3.0.2) The stacktrace is below:

02-12-2014 12:48:28.643 WARN  [ActiveMQ Session Task-2]
org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for {
http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}PingURL
has thrown exception, unwinding now
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:571) ~[?:1.6.0_33]
    at java.util.ArrayList.get(ArrayList.java:349) ~[?:1.6.0_33]
    at
org.apache.cxf.jaxws.interceptors.HolderInInterceptor.handleMessage(HolderInInterceptor.java:67)
~[cxf-rt-frontend-jaxws-3.0.2.jar:3.0.2]
    at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
[cxf-core-3.0.2.jar:3.0.2]
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
[cxf-core-3.0.2.jar:3.0.2]
    at
org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
[cxf-rt-transports-jms-3.0.2.jar:3.0.2]
    at
org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
[cxf-rt-transports-jms-3.0.2.jar:3.0.2]
    at
org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
[cxf-rt-transports-jms-3.0.2.jar:3.0.2]
    at
org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
[activemq-client-5.9.1.jar:5.9.1]
    at
org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
[activemq-client-5.9.1.jar:5.9.1]
    at
org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
[activemq-client-5.9.1.jar:5.9.1]
    at
org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
[activemq-client-5.9.1.jar:5.9.1]
    at
org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
[activemq-client-5.9.1.jar:5.9.1]
    at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
[?:1.6.0_33]
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
[?:1.6.0_33]
    at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]

So maybe there is an issue when manipulating Holder objects in async
invocations of methods with arguments?

André Costa Lima


2014-12-01 15:44 GMT+00:00 André Costa Lima <an...@gmail.com>:

> Thanks for your response. I'll narrow it down to the necessary.
>
> SEI implementation:
>
> @WebService(
>         serviceName = "OA_Server",
>         portName = "OA_ServerSoap",
>         targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>         wsdlLocation = "classpath:OA_Server.wsdl",
>         endpointInterface = "org.multispeak.version_4_1_6.
> OA.OAServerSoap")
> public class OAServerSoapImpl implements OAServerSoap {
>
> ...
>
> @Override
>     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
> multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>         try {
>             Preconditions.checkNotNull(multiSpeakMsgHeader);
>             Preconditions.checkNotNull(multiSpeakMsgHeader1);
>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>             return
> LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
>         } catch (Throwable t) {
>             throw LOG.throwing(Throwables.unchecked(t));
>         }
>     }
>
> @Override
> @UseAsyncMethod
> public ArrayOfErrorObject odEventNotification(
> ArrayOfOutageDetectionEvent odEvents, String transactionID,
> MultiSpeakMsgHeader multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
> multiSpeakMsgHeader1) {
>
>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> multiSpeakMsgHeader1);
>         try {
>             Preconditions.checkNotNull(odEvents, "odEvents");
>             Preconditions.checkNotNull(transactionID, "transactionID");
>             Preconditions.checkNotNull(multiSpeakMsgHeader,
> "multiSpeakMsgHeader");
>             Preconditions.checkNotNull(multiSpeakMsgHeader1,
> "multiSpeakMsgHeader1");
>             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>
> mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>             return
> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
> transactionID, mspkHeader)));
>         } catch (Throwable t) {
>             throw LOG.throwing(Throwables.unchecked(t));
>         }
>     }
>
>     @Override
>     public Future<?> pingURLAsync(MultiSpeakMsgHeader multiSpeakMsgHeader,
> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> AsyncHandler<PingURLResponse> asyncHandler) {
>         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>         try {
>             PingURLAsync response = new PingURLAsync(this,
> multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>             mExecutor.submit(response);
>             return LOG.exit(response.getServerAsyncResponse());
>         } catch (Throwable t) {
>             throw LOG.throwing(Throwables.unchecked(t));
>         }
>     }
>
> @Override
>     public Future<?> odEventNotificationAsync(ArrayOfOutageDetectionEvent
> odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
> Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> AsyncHandler<ODEventNotificationResponse> asyncHandler) {
>         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> multiSpeakMsgHeader1);
>         try {
>             OdEventNotificationAsync response = new
> OdEventNotificationAsync(this, odEvents, transactionID,
> multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>             mExecutor.submit(response);
>             return LOG.exit(response.getServerAsyncResponse());
>         } catch (Throwable t) {
>             throw LOG.throwing(Throwables.unchecked(t));
>         }
>     }
>
> ...
>
> }
>
> To make it clear, I'll add the code to the MultiSpeakInOutHeader class:
>
> public final class MultiSpeakInOutHeader<T> {
>
>     private final T mIn;
>     private final Holder<T> mOut;
>
>     private MultiSpeakInOutHeader(T in, Holder<T> out) {
>         Preconditions.checkNotNull(in);
>         Preconditions.checkNotNull(out);
>         mIn = in;
>         mOut = out;
>     }
>
>     public T getInbound() {
>         return mIn;
>     }
>
>     public T getOutbound() {
>         return getHolder().value;
>     }
>
>     public void setOutbound(T out) {
>         getHolder().value = out;
>     }
>
>     private Holder<T> getHolder() {
>         return mOut;
>     }
>
>     public static <T> MultiSpeakInOutHeader<T> of(T inbound, Holder<T>
> outbound) {
>         return new MultiSpeakInOutHeader<T>(inbound, outbound);
>     }
> }
>
> When I invoke:
>
> Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>();
> Future<?> future = mServer.odEventNotificationAsync(new
> ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(), headerOut,
> new AsyncHandlerImpl(headerOut));
>
> an NPE is thrown at HolderOutInterceptor If I use @UseAsyncMethod or
> headerOut.value is null if I don't. Now, when I invoke:
>
> Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>();
> Future<?> future = mServer.pingURLAsync(new MultiSpeakMsgHeader(),
> headerOut, new AsyncHandlerImpl(headerOut));
>
> it works. The client can see the value field / no NPE is thrown.
>
> Comparing my code to the sample, I believe I'm doing it correctly:
>
> 1. The client creates the Holder object and passes it down to the method
> invocation
> 2. The server assigns the value field before returning
>
> It's rather strange that one invocation works and the other does not. The
> only difference between them is that pingURL has no arguments and
> odEventNotification has one (ArrayOfOutageDetectionEvent). I have another
> argumentless method that works just fine as well and another with arguments
> that does not, so I think the problem lies in the number of arguments
> somehow or how the Holder types are manipulated.
>
> If the test that you linked me to works in the current release of CXF,
> maybe I have something wrong with my configuration?
> I will run that same test in my machine to see how it goes.
>
> Thanks.
>
> Regards,
>
>
> André Costa Lima
>
>
> 2014-12-01 15:04 GMT+00:00 Aki Yoshida <el...@gmail.com>:
>
>> Your post is kind of too long and I am not really seeing how your
>> client is calling the method and how your service is setting the
>> value,
>> Could you compare that to the cxf's sample code at
>> samples/soap_header/src/main/java/demo/soap_header/(client|server)?
>>
>>
>> 2014-11-28 18:21 GMT+01:00 André Costa Lima <an...@gmail.com>:
>> > Hello,
>> >
>> > I am a new CXF (v3.0.0) user. Actually, I am new to the whole JAX-WS
>> thing.
>> > :)
>> > I have set up a JAX-WS service, SOAP over JMS with ActiveMQ. The server
>> > methods invocations are working fine, but I am having some trouble
>> > regarding the Holder class.
>> > I am using the holder class as a container for the outgoing SOAP header
>> for
>> > all web methods, as specified in the WSDL.
>> > I started from WSDL first with Spring configuration for both clients and
>> > servers.
>> > I have provided an async binding to the wsdl2java tool to generate the
>> > async method signatures, because I want to use those instead of the sync
>> > ones.
>> >
>> > The problem is that when I pass the Holder object to the client method
>> and
>> > assign the value field in the server, the client sees it as null but no
>> > exception is thrown.
>> > Further, if I put the @UseAsyncMethod annotation to command CXF to use
>> the
>> > pure async method I have implemented, CXF throws NPE at
>> > HolderOutInterceptor class.
>> > I noticed that if the web method has no arguments besides the SOAP
>> headers
>> > everything works just fine, otherwise what I have described above
>> happens.
>> >
>> > Below there are my configurations.
>> >
>> > Maven plugin:
>> >
>> > <plugin>
>> > <groupId>org.apache.cxf</groupId>
>> >           <artifactId>cxf-codegen-plugin</artifactId>
>> >           <executions>
>> >           <execution>
>> >                     <id>generate-sources</id>
>> >                               <phase>generate-sources</phase>
>> >                               <configuration>
>> >                               <defaultOptions>
>> >                                         <bindingFiles>
>> >
>> >
>> <bindingFile>${basedir}/src/main/resources/oa_types-binding.xml</bindingFile>
>> >
>> >
>> <bindingFile>${basedir}/src/main/resources/oa_async-binding.xml</bindingFile>
>> >                                         </bindingFiles>
>> >
>> > <noAddressBinding>true</noAddressBinding>
>> >                                     </defaultOptions>
>> >                                     <sourceRoot>
>> >
>> > ${basedir}/target/generated-sources/cxf
>> >                                     </sourceRoot>
>> >                                     <wsdlOptions>
>> >                                         <wsdlOption>
>> >
>> > <wsdl>${basedir}/src/main/resources/OA_Server.wsdl</wsdl>
>> >
>> > <wsdlLocation>classpath:OA_Server.wsdl</wsdlLocation>
>> >                                             <extraargs>
>> >                                                 <extraarg>-p</extraarg>
>> >                                                 <extraarg>
>> >
>> http://www.multispeak.org/Version_4.1_Release=org.multispeak.version_4_1_6.OA
>> > </extraarg>
>> >                                                 <extraarg>-p</extraarg>
>> >
>> > <extraarg>cpsm_V4.1_Release=org.cspm.version_4_1.OA</extraarg>
>> >                                                 <extraarg>-p</extraarg>
>> >
>> > <extraarg>gml_V4.1_Release=org.gml.version_4_1.OA</extraarg>
>> >                                                 <extraarg>-p</extraarg>
>> >                                                 <extraarg>
>> > http://www.w3.org/1999/xlink=org.w3.xlink.OA</extraarg>
>> >                                                 <extraarg>-p</extraarg>
>> >                                                 <extraarg>
>> > http://www.w3.org/2001/XMLSchema=org.w3.xmlschema.OA</extraarg>
>> >                                                 <!--
>> > <extraarg>-p</extraarg> -->
>> >                                                 <!--
>> > <extraarg>org.multispeak.version_4_1_6.OA</extraarg> -->
>> >                                                 <!--
>> > <extraarg>-impl</extraarg> -->
>> >                                                 <!--
>> > <extraarg>-server</extraarg> -->
>> >                                                 <!--
>> > <extraarg>-client</extraarg> -->
>> >
>> > <extraarg>-autoNameResolution</extraarg>
>> >                                                 <extraarg>-fe</extraarg>
>> >
>>  <extraarg>jaxws21</extraarg>
>> >
>>  <extraarg>-exsh</extraarg>
>> >
>>  <extraarg>true</extraarg>
>> >                                             </extraargs>
>> >                                         </wsdlOption>
>> >                                     </wsdlOptions>
>> >                                 </configuration>
>> >                                 <goals>
>> >                                     <goal>wsdl2java</goal>
>> >                                 </goals>
>> > </execution>
>> > </executions>
>> > </plugin>
>> >
>> > Spring:
>> >
>> >     <beans:bean id="connection-factory"
>> > class="org.apache.activemq.ActiveMQConnectionFactory">
>> >         <beans:property name="brokerURL"
>> > value="${outside.multispeak.jms.broker}"/>
>> >     </beans:bean>
>> >
>> >     <beans:bean id="pooled-connection-factory"
>> > class="org.apache.activemq.pool.PooledConnectionFactory"
>> > destroy-method="stop">
>> >         <beans:constructor-arg index="0" ref="connection-factory"/>
>> >         <beans:property name="expiryTimeout"
>> > value="${outside.multispeak.jms.pool.expiryTimeout}"/>
>> >     </beans:bean>
>> >
>> > <!-- multispeak call handling interface (OA) -->
>> >
>> >         <!-- client side -->
>> >
>> >         <jaxws:client
>> >             id="multispeak-oa-client"
>> >             xmlns:ns="http://www.multispeak.org/Version_4.1_Release"
>> >             serviceClass="org.multispeak.version_4_1_6.OA.OAServerSoap"
>> >             serviceName="ns:OA_Server"
>> >             endpointName="ns:OA_ServerSoap"
>> >             address="#{'jms:queue:'
>> >                 + '${outside.multispeak.oa.jms.queue}'
>> >                 + '?timeToLive=' +
>> '${outside.multispeak.jms.timeToLive}'
>> >                 + '&amp;requestTimeout' +
>> > '${outside.multispeak.jms.receiveTimeout}'}"
>> >             wsdlLocation="classpath:OA_Server.wsdl">
>> >             <jaxws:features>
>> >                 <beans:bean
>> class="org.apache.cxf.feature.LoggingFeature "/>
>> >                 <beans:bean
>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
>> >                     <beans:constructor-arg index="0"
>> > ref="pooled-connection-factory"/>
>> >                 </beans:bean>
>> >             </jaxws:features>
>> >            </jaxws:client>
>> >
>> >         <!-- server side -->
>> >
>> >         <beans:bean id="forwarding-oa-server"
>> > class="${outside.multispeak.oa.server}" />
>> >         <beans:bean id="multispeak-oa-obj-factory"
>> > class="org.multispeak.version_4_1_6.OA.ObjectFactory" />
>> >
>> >         <jaxws:endpoint
>> >             id="multispeak-oa-server"
>> >             xmlns:tns="http://www.multispeak.org/Version_4.1_Release"
>> >
>>  implementor="x.x.outside.multispeak.oa.server.OAServerSoapImpl"
>> >             serviceName="tns:OA_Server"
>> >             endpointName="tns:OA_ServerSoap"
>> >             address="#{'jms:queue:' +
>> '${outside.multispeak.oa.jms.queue}'
>> > + ''}"
>> >             publish="false"
>> >             wsdlLocation="classpath:OA_Server.wsdl">
>> >             <jaxws:features>
>> >                 <beans:bean
>> class="org.apache.cxf.feature.LoggingFeature "/>
>> >                 <beans:bean
>> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
>> >                     <beans:constructor-arg index="0"
>> > ref="pooled-connection-factory"/>
>> >                 </beans:bean>
>> >             </jaxws:features>
>> >         </jaxws:endpoint>
>> >
>> > The Service Endpoint Interface generated.
>> > There are two methods: pingURL and odEventNotification.
>> > pingURLAsync, as it has no arguments besides the headers, works just
>> fine,
>> > but odEventNotificationAsync does not.
>> > Note that I am using an AsyncHandler of course. In case of pingURLAsync
>> I
>> > can get Holder.value in the handleResponse(Response<T>) callback without
>> > any problems.
>> >
>> > @WebService(targetNamespace = "
>> http://www.multispeak.org/Version_4.1_Release",
>> > name = "OA_ServerSoap")
>> > @XmlSeeAlso({ObjectFactory.class, org.w3.xlink.OA.ObjectFactory.class,
>> > org.gml.version_4_1.OA.ObjectFactory.class,
>> > org.cspm.version_4_1.OA.ObjectFactory.class})
>> > public interface OAServerSoap {
>> >
>> > ...
>> >
>> > @RequestWrapper(localName = "PingURL", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >     @WebMethod(operationName = "PingURL")
>> >     public Response<org.multispeak.version_4_1_6.OA.PingURLResponse>
>> > pingURLAsync(
>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> "MultiSpeakMsgHeader",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> header =
>> > true)
>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
>> >     );
>> >
>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >     @WebMethod(operationName = "PingURL")
>> >     public Future<?> pingURLAsync(
>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> "MultiSpeakMsgHeader",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> header =
>> > true)
>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
>> >         AsyncHandler<org.multispeak.version_4_1_6.OA.PingURLResponse>
>> > asyncHandler
>> >     );
>> >
>> >     /**
>> >      * Requester pings URL of OA to see if it is alive.  Returns
>> > errorObject(s) as necessary to communicate application status.
>> >      */
>> >     @WebResult(name = "PingURLResult", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release")
>> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.PingURL")
>> >     @WebMethod(operationName = "PingURL", action = "
>> > http://www.multispeak.org/Version_4.1_Release/PingURL")
>> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject pingURL(
>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> "MultiSpeakMsgHeader",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> header =
>> > true)
>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
>> >     );
>> >
>> > @RequestWrapper(localName = "ODEventNotification", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> > className =
>> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >     @WebMethod(operationName = "ODEventNotification")
>> >     public
>> > Response<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
>> > odEventNotificationAsync(
>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release")
>> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> > odEvents,
>> >         @WebParam(name = "transactionID", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release")
>> >         java.lang.String transactionID,
>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> "MultiSpeakMsgHeader",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> header =
>> > true)
>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
>> >     );
>> >
>> >     @RequestWrapper(localName = "ODEventNotification", targetNamespace
>> = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> > className =
>> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >     @WebMethod(operationName = "ODEventNotification")
>> >     public Future<?> odEventNotificationAsync(
>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release")
>> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> > odEvents,
>> >         @WebParam(name = "transactionID", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release")
>> >         java.lang.String transactionID,
>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> "MultiSpeakMsgHeader",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> header =
>> > true)
>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> >         @WebParam(name = "asyncHandler", targetNamespace = "")
>> >
>> >
>> AsyncHandler<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
>> > asyncHandler
>> >     );
>> >
>> >     /**
>> >      * Publisher notifies OA of a change in OutageDetectionEvents by
>> > sending an array of changed OutageDetectionEvent objects.  OA returns
>> > information about failed transactions using an array of errorObjects.
>> The
>> > message header attribute 'registrationID' should be added to all publish
>> > messages to indicate to the subscriber under which registrationID they
>> > received this notification data.
>> >      */
>> >     @WebResult(name = "ODEventNotificationResult", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release")
>> >     @RequestWrapper(localName = "ODEventNotification", targetNamespace
>> = "
>> > http://www.multispeak.org/Version_4.1_Release", className =
>> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
>> >     @WebMethod(operationName = "ODEventNotification", action = "
>> > http://www.multispeak.org/Version_4.1_Release/ODEventNotification")
>> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> > className =
>> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
>> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
>> > odEventNotification(
>> >         @WebParam(name = "ODEvents", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release")
>> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
>> > odEvents,
>> >         @WebParam(name = "transactionID", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release")
>> >         java.lang.String transactionID,
>> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
>> > http://www.multispeak.org/Version_4.1_Release", header = true)
>> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
>> >         @WebParam(mode = WebParam.Mode.OUT, name =
>> "MultiSpeakMsgHeader",
>> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
>> header =
>> > true)
>> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
>> >     );
>> >
>> > ...
>> >
>> > The SEI implementation.
>> > Both pingURL and odEventNotification simply forward the call to a
>> delegate.
>> > Both inbound and outbound headers are placed in a common container and
>> > handed over to the delegate.
>> > The async methods simply execute the calls in background and end up
>> calling
>> > the sync methods internally.
>> > The line
>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> > simply calls multiSpeakMsgHeader1.value = ...
>> >
>> > @WebService(
>> >         serviceName = "OA_Server",
>> >         portName = "OA_ServerSoap",
>> >         targetNamespace = "
>> http://www.multispeak.org/Version_4.1_Release",
>> >         wsdlLocation = "classpath:OA_Server.wsdl",
>> >         endpointInterface =
>> "org.multispeak.version_4_1_6.OA.OAServerSoap")
>> > public class OAServerSoapImpl implements OAServerSoap {
>> >
>> > ...
>> >
>> > @Override
>> >     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
>> > multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >         try {
>> >             Preconditions.checkNotNull(multiSpeakMsgHeader);
>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1);
>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >
>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >             return
>> > LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
>> >         } catch (Throwable t) {
>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >         }
>> >     }
>> >
>> > @Override
>> > @UseAsyncMethod
>> > public ArrayOfErrorObject
>> odEventNotification(ArrayOfOutageDetectionEvent
>> > odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> > multiSpeakMsgHeader1);
>> >         try {
>> >             Preconditions.checkNotNull(odEvents, "odEvents");
>> >             Preconditions.checkNotNull(transactionID, "transactionID");
>> >             Preconditions.checkNotNull(multiSpeakMsgHeader,
>> > "multiSpeakMsgHeader");
>> >             Preconditions.checkNotNull(multiSpeakMsgHeader1,
>> > "multiSpeakMsgHeader1");
>> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
>> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
>> >
>> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
>> >             return
>> >
>> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
>> > transactionID, mspkHeader)));
>> >         } catch (Throwable t) {
>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >         }
>> >     }
>> >
>> >     @Override
>> >     public Future<?> pingURLAsync(MultiSpeakMsgHeader
>> multiSpeakMsgHeader,
>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> > AsyncHandler<PingURLResponse> asyncHandler) {
>> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
>> asyncHandler);
>> >         try {
>> >             PingURLAsync response = new PingURLAsync(this,
>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>> >             mExecutor.submit(response);
>> >             return LOG.exit(response.getServerAsyncResponse());
>> >         } catch (Throwable t) {
>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >         }
>> >     }
>> >
>> > @Override
>> >     public Future<?>
>> odEventNotificationAsync(ArrayOfOutageDetectionEvent
>> > odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
>> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
>> > AsyncHandler<ODEventNotificationResponse> asyncHandler) {
>> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
>> > multiSpeakMsgHeader1);
>> >         try {
>> >             OdEventNotificationAsync response = new
>> > OdEventNotificationAsync(this, odEvents, transactionID,
>> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
>> >             mExecutor.submit(response);
>> >             return LOG.exit(response.getServerAsyncResponse());
>> >         } catch (Throwable t) {
>> >             throw LOG.throwing(Throwables.unchecked(t));
>> >         }
>> >     }
>> >
>> > ...
>> >
>> > The invocation test.
>> >
>> > ...
>> > Holder<MultiSpeakMsgHeader> headerOut = new
>> Holder<MultiSpeakMsgHeader>();
>> > Future<?> future = mServer.odEventNotificationAsync(new
>> > ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(),
>> headerOut,
>> > new AsyncHandlerImpl(headerOut));
>> > ...
>> > private static class AsyncHandlerImpl implements
>> > AsyncHandler<ODEventNotificationResponse> {
>> >
>> >         private static final XLogger LOG =
>> > XLoggerFactory.getXLogger(AsyncHandlerImpl.class);
>> >
>> >         private final Holder<MultiSpeakMsgHeader> mHeaderOut;
>> >
>> >         public AsyncHandlerImpl(Holder<MultiSpeakMsgHeader> headerOut) {
>> >             mHeaderOut = headerOut;
>> >         }
>> >
>> >         @Override
>> >         public void handleResponse(Response<ODEventNotificationResponse>
>> > res) {
>> >             try {
>> >                 if (LOG.isTraceEnabled()) {
>> >                     LOG.trace("Callback: {}", res.toString());
>> >                 }
>> >                 ODEventNotificationResponse mspkRsp = res.get();
>> >                 if (LOG.isTraceEnabled()) {
>> >                     LOG.trace("OA odEventNotificationAsync() >>
>> callback:
>> > {} > multispeak header: {}", mspkRsp.toString(), mHeaderOut.value);
>> > //                    for (Entry<String, Object> entry :
>> > res.getContext().entrySet()) {
>> > //                        LOG.trace("Response context >> string > {} >>
>> > object > {}", entry.getKey(), entry.getValue());
>> > //                    }
>> >                 }
>> >             } catch (Exception e) {
>> >                 LOG.catching(e);
>> >             }
>> >         }
>> >     }
>> >
>> > As I said above, a NPE is thrown in HolderOutInterceptor when the
>> response
>> > is returned to the client if I use the pure async method with
>> > @UseAsyncMethod,
>> > or mHeaderOut.value is null if I don't. Now, the stacktrace:
>> >
>> > 28-11-2014 17:15:07.997 WARN  [OA Thread-#1]
>> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for {
>> >
>> http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}ODEventNotification
>> > has thrown exception, unwinding now
>> > java.lang.NullPointerException
>> >     at
>> >
>> org.apache.cxf.jaxws.interceptors.HolderOutInterceptor.handleMessage(HolderOutInterceptor.java:90)
>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> > [cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:81)
>> > [cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> > [cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)
>> > [cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
>> > [cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.transport.jms.continuations.JMSContinuation.doResume(JMSContinuation.java:109)
>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.transport.jms.continuations.JMSContinuation.resume(JMSContinuation.java:98)
>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker$JaxwsServerHandler.handleResponse(AbstractJAXWSMethodInvoker.java:193)
>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >     at
>> >
>> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireResult(AbstractAsyncResponseHandler.java:55)
>> > [classes/:?]
>> >     at
>> >
>> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireAsyncResult(AbstractAsyncResponseHandler.java:46)
>> > [classes/:?]
>> >     at
>> >
>> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.postProcess(AbstractAsyncResponseHandler.java:41)
>> > [classes/:?]
>> >     at
>> >
>> x.x.outside.common.util.ConditionEnforcerHandlerRunnable$1.invoke(ConditionEnforcerHandlerRunnable.java:10)
>> > [classes/:?]
>> >     at
>> >
>> x.x.outside.common.util.ConditionEnforcerHandler$2.invoke(ConditionEnforcerHandler.java:25)
>> > [classes/:?]
>> >     at
>> > x.x.outside.common.util.ExceptionHandler.handle(ExceptionHandler.java:7)
>> > [classes/:?]
>> >     at
>> >
>> x.x.outside.common.util.ConditionEnforcerHandler.handle(ConditionEnforcerHandler.java:20)
>> > [classes/:?]
>> >     at
>> >
>> x.x.outside.common.util.ConditionEnforcerHandlerRunnable.run(ConditionEnforcerHandlerRunnable.java:7)
>> > [classes/:?]
>> >     at
>> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>> > [?:1.6.0_33]
>> >     at
>> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>> > [?:1.6.0_33]
>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>> [?:1.6.0_33]
>> >     at
>> >
>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> > [?:1.6.0_33]
>> >     at
>> >
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> > [?:1.6.0_33]
>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> > 28-11-2014 17:15:08.044 TRACE [ActiveMQ Session Task-1]
>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
>> > handleResponse - Callback:
>> org.apache.cxf.jaxws.JaxwsClientCallback$2@cc6f8c
>> > 28-11-2014 17:15:08.044 ERROR [ActiveMQ Session Task-1]
>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
>> > handleResponse - catching
>> > java.util.concurrent.ExecutionException:
>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while processing.
>> >     at
>> >
>> org.apache.cxf.jaxws.JaxwsClientCallback$2.get(JaxwsClientCallback.java:99)
>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >     at
>> >
>> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl.handleResponse(OAServerTestAsyncCallback.java:81)
>> > [classes/:?]
>> >     at
>> >
>> org.apache.cxf.jaxws.JaxwsClientCallback.handleException(JaxwsClientCallback.java:87)
>> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:821)
>> > [cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >     at
>> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
>> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>> > [activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> > [?:1.6.0_33]
>> >     at
>> >
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> > [?:1.6.0_33]
>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred while
>> > processing.
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     ... 11 more
>> > 28-11-2014 17:15:08.045 ERROR
>> > [x.x.outside.test.multispeak.OAServerTestAsyncCallback-1]
>> > x.x.outside.test.multispeak.OAServerTestAsyncCallback run - catching
>> > java.util.concurrent.ExecutionException:
>> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while processing.
>> >     at
>> org.apache.cxf.endpoint.ClientCallback.get(ClientCallback.java:169)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.jaxws.JaxwsResponseCallback.get(JaxwsResponseCallback.java:54)
>> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
>> >     at
>> >
>> x.x.outside.test.multispeak.OAServerTestAsyncCallback$1.run(OAServerTestAsyncCallback.java:52)
>> > [classes/:?]
>> >     at
>> >
>> x.x.outside.test.multispeak.spi.AbstractMultispeakServerTest$2.run(AbstractMultispeakServerTest.java:112)
>> > [classes/:?]
>> >     at
>> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>> > [?:1.6.0_33]
>> >     at
>> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>> > [?:1.6.0_33]
>> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>> [?:1.6.0_33]
>> >     at
>> >
>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
>> > [?:1.6.0_33]
>> >     at
>> >
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>> > [?:1.6.0_33]
>> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
>> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred while
>> > processing.
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
>> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
>> > ~[cxf-core-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >     at
>> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
>> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
>> >     at
>> >
>> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >     at
>> >
>> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>> > ~[activemq-client-5.9.1.jar:5.9.1]
>> >     ... 3 more
>> >
>> > Is this a configuration problem? Am I doing something stupid?
>> > Thanks!
>> >
>> > Regards,
>> >
>> > André Costa Lima
>>
>
>

Re: NPE at HolderOutInterceptor / Holder.value is null

Posted by André Costa Lima <an...@gmail.com>.
Thanks for your response. I'll narrow it down to the necessary.

SEI implementation:

@WebService(
        serviceName = "OA_Server",
        portName = "OA_ServerSoap",
        targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
        wsdlLocation = "classpath:OA_Server.wsdl",
        endpointInterface = "org.multispeak.version_4_1_6.
OA.OAServerSoap")
public class OAServerSoapImpl implements OAServerSoap {

...

@Override
    public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
        LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
        try {
            Preconditions.checkNotNull(multiSpeakMsgHeader);
            Preconditions.checkNotNull(multiSpeakMsgHeader1);
            MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);

mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
            return
LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
        } catch (Throwable t) {
            throw LOG.throwing(Throwables.unchecked(t));
        }
    }

@Override
@UseAsyncMethod
public ArrayOfErrorObject odEventNotification(
ArrayOfOutageDetectionEvent odEvents, String transactionID,
MultiSpeakMsgHeader multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader>
multiSpeakMsgHeader1) {
        LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
multiSpeakMsgHeader1);
        try {
            Preconditions.checkNotNull(odEvents, "odEvents");
            Preconditions.checkNotNull(transactionID, "transactionID");
            Preconditions.checkNotNull(multiSpeakMsgHeader,
"multiSpeakMsgHeader");
            Preconditions.checkNotNull(multiSpeakMsgHeader1,
"multiSpeakMsgHeader1");
            MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);

mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
            return
LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
transactionID, mspkHeader)));
        } catch (Throwable t) {
            throw LOG.throwing(Throwables.unchecked(t));
        }
    }

    @Override
    public Future<?> pingURLAsync(MultiSpeakMsgHeader multiSpeakMsgHeader,
Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
AsyncHandler<PingURLResponse> asyncHandler) {
        LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
        try {
            PingURLAsync response = new PingURLAsync(this,
multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
            mExecutor.submit(response);
            return LOG.exit(response.getServerAsyncResponse());
        } catch (Throwable t) {
            throw LOG.throwing(Throwables.unchecked(t));
        }
    }

@Override
    public Future<?> odEventNotificationAsync(ArrayOfOutageDetectionEvent
odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
AsyncHandler<ODEventNotificationResponse> asyncHandler) {
        LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
multiSpeakMsgHeader1);
        try {
            OdEventNotificationAsync response = new
OdEventNotificationAsync(this, odEvents, transactionID,
multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
            mExecutor.submit(response);
            return LOG.exit(response.getServerAsyncResponse());
        } catch (Throwable t) {
            throw LOG.throwing(Throwables.unchecked(t));
        }
    }

...

}

To make it clear, I'll add the code to the MultiSpeakInOutHeader class:

public final class MultiSpeakInOutHeader<T> {

    private final T mIn;
    private final Holder<T> mOut;

    private MultiSpeakInOutHeader(T in, Holder<T> out) {
        Preconditions.checkNotNull(in);
        Preconditions.checkNotNull(out);
        mIn = in;
        mOut = out;
    }

    public T getInbound() {
        return mIn;
    }

    public T getOutbound() {
        return getHolder().value;
    }

    public void setOutbound(T out) {
        getHolder().value = out;
    }

    private Holder<T> getHolder() {
        return mOut;
    }

    public static <T> MultiSpeakInOutHeader<T> of(T inbound, Holder<T>
outbound) {
        return new MultiSpeakInOutHeader<T>(inbound, outbound);
    }
}

When I invoke:

Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>();
Future<?> future = mServer.odEventNotificationAsync(new
ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(), headerOut,
new AsyncHandlerImpl(headerOut));

an NPE is thrown at HolderOutInterceptor If I use @UseAsyncMethod or
headerOut.value is null if I don't. Now, when I invoke:

Holder<MultiSpeakMsgHeader> headerOut = new Holder<MultiSpeakMsgHeader>();
Future<?> future = mServer.pingURLAsync(new MultiSpeakMsgHeader(),
headerOut, new AsyncHandlerImpl(headerOut));

it works. The client can see the value field / no NPE is thrown.

Comparing my code to the sample, I believe I'm doing it correctly:

1. The client creates the Holder object and passes it down to the method
invocation
2. The server assigns the value field before returning

It's rather strange that one invocation works and the other does not. The
only difference between them is that pingURL has no arguments and
odEventNotification has one (ArrayOfOutageDetectionEvent). I have another
argumentless method that works just fine as well and another with arguments
that does not, so I think the problem lies in the number of arguments
somehow or how the Holder types are manipulated.

If the test that you linked me to works in the current release of CXF,
maybe I have something wrong with my configuration?
I will run that same test in my machine to see how it goes.

Thanks.

Regards,


André Costa Lima


2014-12-01 15:04 GMT+00:00 Aki Yoshida <el...@gmail.com>:

> Your post is kind of too long and I am not really seeing how your
> client is calling the method and how your service is setting the
> value,
> Could you compare that to the cxf's sample code at
> samples/soap_header/src/main/java/demo/soap_header/(client|server)?
>
>
> 2014-11-28 18:21 GMT+01:00 André Costa Lima <an...@gmail.com>:
> > Hello,
> >
> > I am a new CXF (v3.0.0) user. Actually, I am new to the whole JAX-WS
> thing.
> > :)
> > I have set up a JAX-WS service, SOAP over JMS with ActiveMQ. The server
> > methods invocations are working fine, but I am having some trouble
> > regarding the Holder class.
> > I am using the holder class as a container for the outgoing SOAP header
> for
> > all web methods, as specified in the WSDL.
> > I started from WSDL first with Spring configuration for both clients and
> > servers.
> > I have provided an async binding to the wsdl2java tool to generate the
> > async method signatures, because I want to use those instead of the sync
> > ones.
> >
> > The problem is that when I pass the Holder object to the client method
> and
> > assign the value field in the server, the client sees it as null but no
> > exception is thrown.
> > Further, if I put the @UseAsyncMethod annotation to command CXF to use
> the
> > pure async method I have implemented, CXF throws NPE at
> > HolderOutInterceptor class.
> > I noticed that if the web method has no arguments besides the SOAP
> headers
> > everything works just fine, otherwise what I have described above
> happens.
> >
> > Below there are my configurations.
> >
> > Maven plugin:
> >
> > <plugin>
> > <groupId>org.apache.cxf</groupId>
> >           <artifactId>cxf-codegen-plugin</artifactId>
> >           <executions>
> >           <execution>
> >                     <id>generate-sources</id>
> >                               <phase>generate-sources</phase>
> >                               <configuration>
> >                               <defaultOptions>
> >                                         <bindingFiles>
> >
> >
> <bindingFile>${basedir}/src/main/resources/oa_types-binding.xml</bindingFile>
> >
> >
> <bindingFile>${basedir}/src/main/resources/oa_async-binding.xml</bindingFile>
> >                                         </bindingFiles>
> >
> > <noAddressBinding>true</noAddressBinding>
> >                                     </defaultOptions>
> >                                     <sourceRoot>
> >
> > ${basedir}/target/generated-sources/cxf
> >                                     </sourceRoot>
> >                                     <wsdlOptions>
> >                                         <wsdlOption>
> >
> > <wsdl>${basedir}/src/main/resources/OA_Server.wsdl</wsdl>
> >
> > <wsdlLocation>classpath:OA_Server.wsdl</wsdlLocation>
> >                                             <extraargs>
> >                                                 <extraarg>-p</extraarg>
> >                                                 <extraarg>
> >
> http://www.multispeak.org/Version_4.1_Release=org.multispeak.version_4_1_6.OA
> > </extraarg>
> >                                                 <extraarg>-p</extraarg>
> >
> > <extraarg>cpsm_V4.1_Release=org.cspm.version_4_1.OA</extraarg>
> >                                                 <extraarg>-p</extraarg>
> >
> > <extraarg>gml_V4.1_Release=org.gml.version_4_1.OA</extraarg>
> >                                                 <extraarg>-p</extraarg>
> >                                                 <extraarg>
> > http://www.w3.org/1999/xlink=org.w3.xlink.OA</extraarg>
> >                                                 <extraarg>-p</extraarg>
> >                                                 <extraarg>
> > http://www.w3.org/2001/XMLSchema=org.w3.xmlschema.OA</extraarg>
> >                                                 <!--
> > <extraarg>-p</extraarg> -->
> >                                                 <!--
> > <extraarg>org.multispeak.version_4_1_6.OA</extraarg> -->
> >                                                 <!--
> > <extraarg>-impl</extraarg> -->
> >                                                 <!--
> > <extraarg>-server</extraarg> -->
> >                                                 <!--
> > <extraarg>-client</extraarg> -->
> >
> > <extraarg>-autoNameResolution</extraarg>
> >                                                 <extraarg>-fe</extraarg>
> >
>  <extraarg>jaxws21</extraarg>
> >
>  <extraarg>-exsh</extraarg>
> >                                                 <extraarg>true</extraarg>
> >                                             </extraargs>
> >                                         </wsdlOption>
> >                                     </wsdlOptions>
> >                                 </configuration>
> >                                 <goals>
> >                                     <goal>wsdl2java</goal>
> >                                 </goals>
> > </execution>
> > </executions>
> > </plugin>
> >
> > Spring:
> >
> >     <beans:bean id="connection-factory"
> > class="org.apache.activemq.ActiveMQConnectionFactory">
> >         <beans:property name="brokerURL"
> > value="${outside.multispeak.jms.broker}"/>
> >     </beans:bean>
> >
> >     <beans:bean id="pooled-connection-factory"
> > class="org.apache.activemq.pool.PooledConnectionFactory"
> > destroy-method="stop">
> >         <beans:constructor-arg index="0" ref="connection-factory"/>
> >         <beans:property name="expiryTimeout"
> > value="${outside.multispeak.jms.pool.expiryTimeout}"/>
> >     </beans:bean>
> >
> > <!-- multispeak call handling interface (OA) -->
> >
> >         <!-- client side -->
> >
> >         <jaxws:client
> >             id="multispeak-oa-client"
> >             xmlns:ns="http://www.multispeak.org/Version_4.1_Release"
> >             serviceClass="org.multispeak.version_4_1_6.OA.OAServerSoap"
> >             serviceName="ns:OA_Server"
> >             endpointName="ns:OA_ServerSoap"
> >             address="#{'jms:queue:'
> >                 + '${outside.multispeak.oa.jms.queue}'
> >                 + '?timeToLive=' + '${outside.multispeak.jms.timeToLive}'
> >                 + '&amp;requestTimeout' +
> > '${outside.multispeak.jms.receiveTimeout}'}"
> >             wsdlLocation="classpath:OA_Server.wsdl">
> >             <jaxws:features>
> >                 <beans:bean class="org.apache.cxf.feature.LoggingFeature
> "/>
> >                 <beans:bean
> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
> >                     <beans:constructor-arg index="0"
> > ref="pooled-connection-factory"/>
> >                 </beans:bean>
> >             </jaxws:features>
> >            </jaxws:client>
> >
> >         <!-- server side -->
> >
> >         <beans:bean id="forwarding-oa-server"
> > class="${outside.multispeak.oa.server}" />
> >         <beans:bean id="multispeak-oa-obj-factory"
> > class="org.multispeak.version_4_1_6.OA.ObjectFactory" />
> >
> >         <jaxws:endpoint
> >             id="multispeak-oa-server"
> >             xmlns:tns="http://www.multispeak.org/Version_4.1_Release"
> >
>  implementor="x.x.outside.multispeak.oa.server.OAServerSoapImpl"
> >             serviceName="tns:OA_Server"
> >             endpointName="tns:OA_ServerSoap"
> >             address="#{'jms:queue:' +
> '${outside.multispeak.oa.jms.queue}'
> > + ''}"
> >             publish="false"
> >             wsdlLocation="classpath:OA_Server.wsdl">
> >             <jaxws:features>
> >                 <beans:bean class="org.apache.cxf.feature.LoggingFeature
> "/>
> >                 <beans:bean
> > class="org.apache.cxf.transport.jms.ConnectionFactoryFeature">
> >                     <beans:constructor-arg index="0"
> > ref="pooled-connection-factory"/>
> >                 </beans:bean>
> >             </jaxws:features>
> >         </jaxws:endpoint>
> >
> > The Service Endpoint Interface generated.
> > There are two methods: pingURL and odEventNotification.
> > pingURLAsync, as it has no arguments besides the headers, works just
> fine,
> > but odEventNotificationAsync does not.
> > Note that I am using an AsyncHandler of course. In case of pingURLAsync I
> > can get Holder.value in the handleResponse(Response<T>) callback without
> > any problems.
> >
> > @WebService(targetNamespace = "
> http://www.multispeak.org/Version_4.1_Release",
> > name = "OA_ServerSoap")
> > @XmlSeeAlso({ObjectFactory.class, org.w3.xlink.OA.ObjectFactory.class,
> > org.gml.version_4_1.OA.ObjectFactory.class,
> > org.cspm.version_4_1.OA.ObjectFactory.class})
> > public interface OAServerSoap {
> >
> > ...
> >
> > @RequestWrapper(localName = "PingURL", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.PingURL")
> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >     @WebMethod(operationName = "PingURL")
> >     public Response<org.multispeak.version_4_1_6.OA.PingURLResponse>
> > pingURLAsync(
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
> >     );
> >
> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.PingURL")
> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >     @WebMethod(operationName = "PingURL")
> >     public Future<?> pingURLAsync(
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >         @WebParam(name = "asyncHandler", targetNamespace = "")
> >         AsyncHandler<org.multispeak.version_4_1_6.OA.PingURLResponse>
> > asyncHandler
> >     );
> >
> >     /**
> >      * Requester pings URL of OA to see if it is alive.  Returns
> > errorObject(s) as necessary to communicate application status.
> >      */
> >     @WebResult(name = "PingURLResult", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release")
> >     @RequestWrapper(localName = "PingURL", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.PingURL")
> >     @WebMethod(operationName = "PingURL", action = "
> > http://www.multispeak.org/Version_4.1_Release/PingURL")
> >     @ResponseWrapper(localName = "PingURLResponse", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.PingURLResponse")
> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject pingURL(
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
> >     );
> >
> > @RequestWrapper(localName = "ODEventNotification", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> > className =
> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >     @WebMethod(operationName = "ODEventNotification")
> >     public
> > Response<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> > odEventNotificationAsync(
> >         @WebParam(name = "ODEvents", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release")
> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> > odEvents,
> >         @WebParam(name = "transactionID", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release")
> >         java.lang.String transactionID,
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
> >     );
> >
> >     @RequestWrapper(localName = "ODEventNotification", targetNamespace =
> "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> > className =
> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >     @WebMethod(operationName = "ODEventNotification")
> >     public Future<?> odEventNotificationAsync(
> >         @WebParam(name = "ODEvents", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release")
> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> > odEvents,
> >         @WebParam(name = "transactionID", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release")
> >         java.lang.String transactionID,
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> >         @WebParam(name = "asyncHandler", targetNamespace = "")
> >
> > AsyncHandler<org.multispeak.version_4_1_6.OA.ODEventNotificationResponse>
> > asyncHandler
> >     );
> >
> >     /**
> >      * Publisher notifies OA of a change in OutageDetectionEvents by
> > sending an array of changed OutageDetectionEvent objects.  OA returns
> > information about failed transactions using an array of errorObjects. The
> > message header attribute 'registrationID' should be added to all publish
> > messages to indicate to the subscriber under which registrationID they
> > received this notification data.
> >      */
> >     @WebResult(name = "ODEventNotificationResult", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release")
> >     @RequestWrapper(localName = "ODEventNotification", targetNamespace =
> "
> > http://www.multispeak.org/Version_4.1_Release", className =
> > "org.multispeak.version_4_1_6.OA.ODEventNotification")
> >     @WebMethod(operationName = "ODEventNotification", action = "
> > http://www.multispeak.org/Version_4.1_Release/ODEventNotification")
> >     @ResponseWrapper(localName = "ODEventNotificationResponse",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> > className =
> "org.multispeak.version_4_1_6.OA.ODEventNotificationResponse")
> >     public org.multispeak.version_4_1_6.OA.ArrayOfErrorObject
> > odEventNotification(
> >         @WebParam(name = "ODEvents", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release")
> >         org.multispeak.version_4_1_6.OA.ArrayOfOutageDetectionEvent
> > odEvents,
> >         @WebParam(name = "transactionID", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release")
> >         java.lang.String transactionID,
> >         @WebParam(name = "MultiSpeakMsgHeader", targetNamespace = "
> > http://www.multispeak.org/Version_4.1_Release", header = true)
> >         MultiSpeakMsgHeader multiSpeakMsgHeader,
> >         @WebParam(mode = WebParam.Mode.OUT, name = "MultiSpeakMsgHeader",
> > targetNamespace = "http://www.multispeak.org/Version_4.1_Release",
> header =
> > true)
> >         javax.xml.ws.Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1
> >     );
> >
> > ...
> >
> > The SEI implementation.
> > Both pingURL and odEventNotification simply forward the call to a
> delegate.
> > Both inbound and outbound headers are placed in a common container and
> > handed over to the delegate.
> > The async methods simply execute the calls in background and end up
> calling
> > the sync methods internally.
> > The line
> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> > simply calls multiSpeakMsgHeader1.value = ...
> >
> > @WebService(
> >         serviceName = "OA_Server",
> >         portName = "OA_ServerSoap",
> >         targetNamespace = "http://www.multispeak.org/Version_4.1_Release
> ",
> >         wsdlLocation = "classpath:OA_Server.wsdl",
> >         endpointInterface =
> "org.multispeak.version_4_1_6.OA.OAServerSoap")
> > public class OAServerSoapImpl implements OAServerSoap {
> >
> > ...
> >
> > @Override
> >     public ArrayOfErrorObject pingURL(MultiSpeakMsgHeader
> > multiSpeakMsgHeader, Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >         try {
> >             Preconditions.checkNotNull(multiSpeakMsgHeader);
> >             Preconditions.checkNotNull(multiSpeakMsgHeader1);
> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >
> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >             return
> > LOG.exit(Preconditions.checkNotNull(mDelegate.pingURL(mspkHeader)));
> >         } catch (Throwable t) {
> >             throw LOG.throwing(Throwables.unchecked(t));
> >         }
> >     }
> >
> > @Override
> > @UseAsyncMethod
> > public ArrayOfErrorObject odEventNotification(ArrayOfOutageDetectionEvent
> > odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1) {
> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> > multiSpeakMsgHeader1);
> >         try {
> >             Preconditions.checkNotNull(odEvents, "odEvents");
> >             Preconditions.checkNotNull(transactionID, "transactionID");
> >             Preconditions.checkNotNull(multiSpeakMsgHeader,
> > "multiSpeakMsgHeader");
> >             Preconditions.checkNotNull(multiSpeakMsgHeader1,
> > "multiSpeakMsgHeader1");
> >             MultiSpeakInOutHeader<MultiSpeakMsgHeader> mspkHeader =
> > MultiSpeakInOutHeader.of(multiSpeakMsgHeader, multiSpeakMsgHeader1);
> >
> > mspkHeader.setOutbound(mObjectFactory.createMultiSpeakMsgHeader());
> >             return
> >
> LOG.exit(Preconditions.checkNotNull(mDelegate.odEventNotification(odEvents,
> > transactionID, mspkHeader)));
> >         } catch (Throwable t) {
> >             throw LOG.throwing(Throwables.unchecked(t));
> >         }
> >     }
> >
> >     @Override
> >     public Future<?> pingURLAsync(MultiSpeakMsgHeader
> multiSpeakMsgHeader,
> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> > AsyncHandler<PingURLResponse> asyncHandler) {
> >         LOG.entry(multiSpeakMsgHeader, multiSpeakMsgHeader1,
> asyncHandler);
> >         try {
> >             PingURLAsync response = new PingURLAsync(this,
> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >             mExecutor.submit(response);
> >             return LOG.exit(response.getServerAsyncResponse());
> >         } catch (Throwable t) {
> >             throw LOG.throwing(Throwables.unchecked(t));
> >         }
> >     }
> >
> > @Override
> >     public Future<?> odEventNotificationAsync(ArrayOfOutageDetectionEvent
> > odEvents, String transactionID, MultiSpeakMsgHeader multiSpeakMsgHeader,
> > Holder<MultiSpeakMsgHeader> multiSpeakMsgHeader1,
> > AsyncHandler<ODEventNotificationResponse> asyncHandler) {
> >         LOG.entry(odEvents, transactionID, multiSpeakMsgHeader,
> > multiSpeakMsgHeader1);
> >         try {
> >             OdEventNotificationAsync response = new
> > OdEventNotificationAsync(this, odEvents, transactionID,
> > multiSpeakMsgHeader, multiSpeakMsgHeader1, asyncHandler);
> >             mExecutor.submit(response);
> >             return LOG.exit(response.getServerAsyncResponse());
> >         } catch (Throwable t) {
> >             throw LOG.throwing(Throwables.unchecked(t));
> >         }
> >     }
> >
> > ...
> >
> > The invocation test.
> >
> > ...
> > Holder<MultiSpeakMsgHeader> headerOut = new
> Holder<MultiSpeakMsgHeader>();
> > Future<?> future = mServer.odEventNotificationAsync(new
> > ArrayOfOutageDetectionEvent(), "0", new MultiSpeakMsgHeader(), headerOut,
> > new AsyncHandlerImpl(headerOut));
> > ...
> > private static class AsyncHandlerImpl implements
> > AsyncHandler<ODEventNotificationResponse> {
> >
> >         private static final XLogger LOG =
> > XLoggerFactory.getXLogger(AsyncHandlerImpl.class);
> >
> >         private final Holder<MultiSpeakMsgHeader> mHeaderOut;
> >
> >         public AsyncHandlerImpl(Holder<MultiSpeakMsgHeader> headerOut) {
> >             mHeaderOut = headerOut;
> >         }
> >
> >         @Override
> >         public void handleResponse(Response<ODEventNotificationResponse>
> > res) {
> >             try {
> >                 if (LOG.isTraceEnabled()) {
> >                     LOG.trace("Callback: {}", res.toString());
> >                 }
> >                 ODEventNotificationResponse mspkRsp = res.get();
> >                 if (LOG.isTraceEnabled()) {
> >                     LOG.trace("OA odEventNotificationAsync() >> callback:
> > {} > multispeak header: {}", mspkRsp.toString(), mHeaderOut.value);
> > //                    for (Entry<String, Object> entry :
> > res.getContext().entrySet()) {
> > //                        LOG.trace("Response context >> string > {} >>
> > object > {}", entry.getKey(), entry.getValue());
> > //                    }
> >                 }
> >             } catch (Exception e) {
> >                 LOG.catching(e);
> >             }
> >         }
> >     }
> >
> > As I said above, a NPE is thrown in HolderOutInterceptor when the
> response
> > is returned to the client if I use the pure async method with
> > @UseAsyncMethod,
> > or mHeaderOut.value is null if I don't. Now, the stacktrace:
> >
> > 28-11-2014 17:15:07.997 WARN  [OA Thread-#1]
> > org.apache.cxf.phase.PhaseInterceptorChain doLog - Interceptor for {
> >
> http://www.multispeak.org/Version_4.1_Release}OA_Server#{http://www.multispeak.org/Version_4.1_Release}ODEventNotification
> > has thrown exception, unwinding now
> > java.lang.NullPointerException
> >     at
> >
> org.apache.cxf.jaxws.interceptors.HolderOutInterceptor.handleMessage(HolderOutInterceptor.java:90)
> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:81)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:277)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.continuations.JMSContinuation.doResume(JMSContinuation.java:109)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.continuations.JMSContinuation.resume(JMSContinuation.java:98)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker$JaxwsServerHandler.handleResponse(AbstractJAXWSMethodInvoker.java:193)
> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at
> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireResult(AbstractAsyncResponseHandler.java:55)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.fireAsyncResult(AbstractAsyncResponseHandler.java:46)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.ws.cxf.endpoint.server.AbstractAsyncResponseHandler.postProcess(AbstractAsyncResponseHandler.java:41)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable$1.invoke(ConditionEnforcerHandlerRunnable.java:10)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.util.ConditionEnforcerHandler$2.invoke(ConditionEnforcerHandler.java:25)
> > [classes/:?]
> >     at
> > x.x.outside.common.util.ExceptionHandler.handle(ExceptionHandler.java:7)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.util.ConditionEnforcerHandler.handle(ConditionEnforcerHandler.java:20)
> > [classes/:?]
> >     at
> >
> x.x.outside.common.util.ConditionEnforcerHandlerRunnable.run(ConditionEnforcerHandlerRunnable.java:7)
> > [classes/:?]
> >     at
> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> > [?:1.6.0_33]
> >     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> > [?:1.6.0_33]
> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> > [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> > [?:1.6.0_33]
> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> > 28-11-2014 17:15:08.044 TRACE [ActiveMQ Session Task-1]
> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> > handleResponse - Callback:
> org.apache.cxf.jaxws.JaxwsClientCallback$2@cc6f8c
> > 28-11-2014 17:15:08.044 ERROR [ActiveMQ Session Task-1]
> > x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl
> > handleResponse - catching
> > java.util.concurrent.ExecutionException:
> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while processing.
> >     at
> >
> org.apache.cxf.jaxws.JaxwsClientCallback$2.get(JaxwsClientCallback.java:99)
> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at
> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$AsyncHandlerImpl.handleResponse(OAServerTestAsyncCallback.java:81)
> > [classes/:?]
> >     at
> >
> org.apache.cxf.jaxws.JaxwsClientCallback.handleException(JaxwsClientCallback.java:87)
> > [cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:821)
> > [cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> > [cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> > [activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> > [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> > [?:1.6.0_33]
> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> > processing.
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     ... 11 more
> > 28-11-2014 17:15:08.045 ERROR
> > [x.x.outside.test.multispeak.OAServerTestAsyncCallback-1]
> > x.x.outside.test.multispeak.OAServerTestAsyncCallback run - catching
> > java.util.concurrent.ExecutionException:
> > org.apache.cxf.binding.soap.SoapFault: Fault occurred while processing.
> >     at
> org.apache.cxf.endpoint.ClientCallback.get(ClientCallback.java:169)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.jaxws.JaxwsResponseCallback.get(JaxwsResponseCallback.java:54)
> > ~[cxf-rt-frontend-jaxws-3.0.0.jar:3.0.0]
> >     at
> >
> x.x.outside.test.multispeak.OAServerTestAsyncCallback$1.run(OAServerTestAsyncCallback.java:52)
> > [classes/:?]
> >     at
> >
> x.x.outside.test.multispeak.spi.AbstractMultispeakServerTest$2.run(AbstractMultispeakServerTest.java:112)
> > [classes/:?]
> >     at
> > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
> > [?:1.6.0_33]
> >     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
> > [?:1.6.0_33]
> >     at java.util.concurrent.FutureTask.run(FutureTask.java:166)
> [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
> > [?:1.6.0_33]
> >     at
> >
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> > [?:1.6.0_33]
> >     at java.lang.Thread.run(Thread.java:701) [?:1.6.0_33]
> > Caused by: org.apache.cxf.binding.soap.SoapFault: Fault occurred while
> > processing.
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
> > ~[cxf-rt-bindings-soap-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:780)
> > ~[cxf-core-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.JMSConduit.processReplyMessage(JMSConduit.java:413)
> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> > org.apache.cxf.transport.jms.JMSConduit.onMessage(JMSConduit.java:380)
> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.cxf.transport.jms.util.MessageListenerContainer$LocalTransactionalMessageListener.onMessage(MessageListenerContainer.java:120)
> > ~[cxf-rt-transports-jms-3.0.0.jar:3.0.0]
> >     at
> >
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1361)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     at
> >
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
> > ~[activemq-client-5.9.1.jar:5.9.1]
> >     ... 3 more
> >
> > Is this a configuration problem? Am I doing something stupid?
> > Thanks!
> >
> > Regards,
> >
> > André Costa Lima
>