Search in sources :

Example 1 with FiberContextSwitchInterceptorFactory

use of com.sun.xml.ws.api.pipe.FiberContextSwitchInterceptorFactory in project metro-jax-ws by eclipse-ee4j.

the class Stub method processAsync.

/**
 * Passes a message through a {@link Tube}line for processing. The processing happens
 * asynchronously and when the response is available, Fiber.CompletionCallback is
 * called. The processing could happen on multiple threads.
 *
 * <p>
 * Unlike {@link Tube} instances,
 * this method is thread-safe and can be invoked from
 * multiple threads concurrently.
 *
 * @param receiver       The {@link Response} implementation
 * @param request         The message to be sent to the server
 * @param requestContext The {@link RequestContext} when this invocation is originally scheduled.
 *                       This must be the same object as {@link #requestContext} for synchronous
 *                       invocations, but for asynchronous invocations, it needs to be a snapshot
 *                       captured at the point of invocation, to correctly satisfy the spec requirement.
 * @param completionCallback Once the processing is done, the callback is invoked.
 */
protected final void processAsync(AsyncResponseImpl<?> receiver, Packet request, RequestContext requestContext, final Fiber.CompletionCallback completionCallback) {
    // fill in Packet
    request.component = this;
    configureRequestPacket(request, requestContext);
    final Pool<Tube> pool = tubes;
    if (pool == null) {
        // TODO: i18n
        throw new WebServiceException("close method has already been invoked");
    }
    final Fiber fiber = engine.createFiber();
    configureFiber(fiber);
    receiver.setCancelable(fiber);
    // check race condition on cancel
    if (receiver.isCancelled()) {
        return;
    }
    FiberContextSwitchInterceptorFactory fcsif = owner.getSPI(FiberContextSwitchInterceptorFactory.class);
    if (fcsif != null) {
        fiber.addInterceptor(fcsif.create());
    }
    // then send it away!
    final Tube tube = pool.take();
    Fiber.CompletionCallback fiberCallback = new Fiber.CompletionCallback() {

        @Override
        public void onCompletion(@NotNull Packet response) {
            pool.recycle(tube);
            completionCallback.onCompletion(response);
        }

        @Override
        public void onCompletion(@NotNull Throwable error) {
            // let's not reuse tubes as they might be in a wrong state, so not
            // calling pool.recycle()
            completionCallback.onCompletion(error);
        }
    };
    // Check for SyncStartForAsyncInvokeFeature
    fiber.start(tube, request, fiberCallback, getBinding().isFeatureEnabled(SyncStartForAsyncFeature.class) && !requestContext.containsKey(PREVENT_SYNC_START_FOR_ASYNC_INVOKE));
}
Also used : FiberContextSwitchInterceptorFactory(com.sun.xml.ws.api.pipe.FiberContextSwitchInterceptorFactory) Packet(com.sun.xml.ws.api.message.Packet) Tube(com.sun.xml.ws.api.pipe.Tube) WebServiceException(jakarta.xml.ws.WebServiceException) Fiber(com.sun.xml.ws.api.pipe.Fiber) NotNull(com.sun.istack.NotNull)

Aggregations

NotNull (com.sun.istack.NotNull)1 Packet (com.sun.xml.ws.api.message.Packet)1 Fiber (com.sun.xml.ws.api.pipe.Fiber)1 FiberContextSwitchInterceptorFactory (com.sun.xml.ws.api.pipe.FiberContextSwitchInterceptorFactory)1 Tube (com.sun.xml.ws.api.pipe.Tube)1 WebServiceException (jakarta.xml.ws.WebServiceException)1