Search in sources :

Example 1 with Fiber

use of com.sun.xml.ws.api.pipe.Fiber 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)

Example 2 with Fiber

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

the class NonAnonymousResponseProcessor method process.

/**
 * Send a response to a non-anonymous address. Also closes the transport back channel
 * of {@link Packet} if it's not closed already.
 *
 * @param packet
 *      The response from our server, which will be delivered to the destination.
 * @return The response packet that should be used to complete the tubeline response processing
 */
public Packet process(Packet packet) {
    Fiber.CompletionCallback fiberCallback = null;
    Fiber currentFiber = Fiber.getCurrentIfSet();
    if (currentFiber != null) {
        // Link completion of the current fiber to the new fiber that will
        // deliver the async response. This allows access to the response
        // packet that may be generated by sending a new message for the
        // current async response.
        final Fiber.CompletionCallback currentFiberCallback = currentFiber.getCompletionCallback();
        if (currentFiberCallback != null) {
            fiberCallback = new Fiber.CompletionCallback() {

                public void onCompletion(@NotNull Packet response) {
                    currentFiberCallback.onCompletion(response);
                }

                public void onCompletion(@NotNull Throwable error) {
                    currentFiberCallback.onCompletion(error);
                }
            };
            currentFiber.setCompletionCallback(null);
        }
    }
    // we need to assemble a pipeline to talk to this endpoint.
    WSEndpoint<?> endpoint = packet.endpoint;
    WSBinding binding = endpoint.getBinding();
    Tube transport = TransportTubeFactory.create(Thread.currentThread().getContextClassLoader(), new ClientTubeAssemblerContext(packet.endpointAddress, endpoint.getPort(), (WSService) null, binding, endpoint.getContainer(), ((BindingImpl) binding).createCodec(), null, null));
    Fiber fiber = endpoint.getEngine().createFiber();
    fiber.start(transport, packet, fiberCallback);
    // then we'll proceed the rest like one-way.
    Packet copy = packet.copy(false);
    copy.endpointAddress = null;
    return copy;
}
Also used : Packet(com.sun.xml.ws.api.message.Packet) WSBinding(com.sun.xml.ws.api.WSBinding) BindingImpl(com.sun.xml.ws.binding.BindingImpl) Tube(com.sun.xml.ws.api.pipe.Tube) WSService(com.sun.xml.ws.api.WSService) Fiber(com.sun.xml.ws.api.pipe.Fiber) ClientTubeAssemblerContext(com.sun.xml.ws.api.pipe.ClientTubeAssemblerContext)

Example 3 with Fiber

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

the class RequestSender method sendAsync.

public void sendAsync(Packet request, final Fiber.CompletionCallback completionCallback) {
    if (tubelinePool == null)
        // TODO: i18n
        throw new WebServiceException("close method has already been invoked");
    Fiber fiber = engine.createFiber();
    final Tube tube = tubelinePool.take();
    fiber.start(tube, request, new Fiber.CompletionCallback() {

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

        public void onCompletion(@NotNull Throwable error) {
            // let's not reuse tubes as they might be in a wrong state, so not
            // calling tubePool.recycle()
            completionCallback.onCompletion(error);
        }
    });
}
Also used : 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)

Example 4 with Fiber

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

the class Stub method process.

/**
 * Passes a message to a pipe for processing.
 * <p>
 * Unlike {@link Tube} instances,
 * this method is thread-safe and can be invoked from
 * multiple threads concurrently.
 *
 * @param packet         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 receiver       Receives the {@link ResponseContext}. Since the spec requires
 *                       that the asynchronous invocations must not update response context,
 *                       depending on the mode of invocation they have to go to different places.
 *                       So we take a setter that abstracts that away.
 */
protected final Packet process(Packet packet, RequestContext requestContext, ResponseContextReceiver receiver) {
    packet.isSynchronousMEP = true;
    packet.component = this;
    configureRequestPacket(packet, requestContext);
    Pool<Tube> pool = tubes;
    if (pool == null) {
        // TODO: i18n
        throw new WebServiceException("close method has already been invoked");
    }
    Fiber fiber = engine.createFiber();
    configureFiber(fiber);
    // then send it away!
    Tube tube = pool.take();
    try {
        return fiber.runSync(tube, packet);
    } finally {
        // this allows us to capture the packet even when the call failed with an exception.
        // when the call fails with an exception it's no longer a 'reply' but it may provide some information
        // about what went wrong.
        // note that Packet can still be updated after
        // ResponseContext is created.
        Packet reply = (fiber.getPacket() == null) ? packet : fiber.getPacket();
        receiver.setResponseContext(new ResponseContext(reply));
        pool.recycle(tube);
    }
}
Also used : 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)

Aggregations

Packet (com.sun.xml.ws.api.message.Packet)4 Fiber (com.sun.xml.ws.api.pipe.Fiber)4 Tube (com.sun.xml.ws.api.pipe.Tube)4 WebServiceException (jakarta.xml.ws.WebServiceException)3 NotNull (com.sun.istack.NotNull)1 WSBinding (com.sun.xml.ws.api.WSBinding)1 WSService (com.sun.xml.ws.api.WSService)1 ClientTubeAssemblerContext (com.sun.xml.ws.api.pipe.ClientTubeAssemblerContext)1 FiberContextSwitchInterceptorFactory (com.sun.xml.ws.api.pipe.FiberContextSwitchInterceptorFactory)1 BindingImpl (com.sun.xml.ws.binding.BindingImpl)1