Example usage for org.springframework.web.context.request.async DeferredResult setResultHandler

List of usage examples for org.springframework.web.context.request.async DeferredResult setResultHandler

Introduction

In this page you can find the example usage for org.springframework.web.context.request.async DeferredResult setResultHandler.

Prototype

public final void setResultHandler(DeferredResultHandler resultHandler) 

Source Link

Document

Provide a handler to use to handle the result value.

Usage

From source file:com.opopov.cloud.image.DecodeImageTest.java

@Test
public void testLoadImage() throws Exception {
    ImageStitchingConfiguration config = new ImageStitchingConfiguration();
    config.setRowCount(3);//from  ww  w  . j  av a 2s  . c  o m
    config.setColumnCount(3);
    config.setSourceHeight(256);
    config.setSourceWidth(256);

    String[][] imageUrls = new String[][] {
            //rows left to right, top to bottom
            { "z15/9/x9650/5/y5596", "z15/9/x9650/5/y5597", "z15/9/x9650/5/y5598" },
            { "z15/9/x9651/5/y5596", "z15/9/x9651/5/y5597", "z15/9/x9651/5/y5598" },
            { "z15/9/x9652/5/y5596", "z15/9/x9652/5/y5597", "z15/9/x9652/5/y5598" } };

    String pattern = "http://www.opopov.com/osmtopo1/%s.png";
    for (String[] row : imageUrls) {
        for (String cell : row) {
            config.getUrlList().add(String.format(pattern, cell));
        }
    }

    final AtomicReference<byte[]> buffer = new AtomicReference<>();
    DeferredResult<ResponseEntity<?>> result = service.getStitchedImage(config);
    result.setResultHandler(new DeferredResult.DeferredResultHandler() {
        @Override
        public void handleResult(Object result) {
            ResponseEntity<byte[]> responseEntity = (ResponseEntity<byte[]>) result;
            buffer.set(responseEntity.getBody());

        }
    });

    Thread.sleep(TIMEOUT_MILLIS);

    InputStream is = getClass().getResourceAsStream("/horizontal-stitched-test-1-frame.png");
    byte[] expectedBytes = IOUtils.toByteArray(is);
    //        Uncomment the lines below to see the generated stitched image
    //        FileOutputStream fos = new FileOutputStream("/tmp/horizontal-stitched-test-1-frame.png");
    //        IOUtils.write(buffer.get(), fos);
    //        fos.close();

    Assert.assertTrue("Image data of stitched PNG image", Arrays.equals(expectedBytes, buffer.get()));

}

From source file:com.kixeye.chassis.transport.websocket.ActionInvokingWebSocket.java

public void onWebSocketBinary(byte[] payload, int offset, int length) {
    try {//from   www  . j ava 2 s .  co m
        // don't accept empty frames
        if (payload == null || length < 1) {
            throw new WebSocketServiceException(new ServiceError("EMPTY_ENVELOPE", "Empty envelope!"),
                    "UNKNOWN", null);
        }

        // check if we need to do psk encryption
        byte[] processedPayload = pskFrameProcessor.processIncoming(payload, offset, length);

        if (processedPayload != payload) {
            payload = processedPayload;
            offset = 0;
            length = payload.length;
        }

        // get the envelope
        final WebSocketEnvelope envelope = new WebSocketEnvelope(
                serDe.deserialize(payload, offset, length, Envelope.class));

        // gets all the actions
        Collection<WebSocketAction> actions = mappingRegistry.getActionMethods(envelope.getAction());

        final AtomicInteger invokedActions = new AtomicInteger(0);

        // invokes them
        for (final WebSocketAction action : actions) {
            // get and validate type ID
            Class<?> messageClass = null;

            if (StringUtils.isNotBlank(envelope.getTypeId())) {
                messageClass = messageRegistry.getClassByTypeId(envelope.getTypeId());
            }

            // validate if action has a payload class that it needs
            if (action.getPayloadClass() != null && messageClass == null) {
                throw new WebSocketServiceException(new ServiceError("INVALID_TYPE_ID", "Unknown type ID!"),
                        envelope.getAction(), envelope.getTransactionId());
            }

            // invoke this action if allowed
            if (action.canInvoke(webSocketSession, messageClass)) {
                invokedActions.incrementAndGet();

                final Object handler = handlerCache.get(action.getHandlerClass().getName());
                final Class<?> finalMessageClass = messageClass;

                ListenableFuture<DeferredResult<?>> invocation = serviceExecutor
                        .submit(new Callable<DeferredResult<?>>() {
                            @Override
                            public DeferredResult<?> call() throws Exception {
                                // then invoke
                                return action.invoke(
                                        handler, new RawWebSocketMessage<>(envelope.getPayload(),
                                                finalMessageClass, messageValidator, serDe),
                                        envelope, webSocketSession);
                            }
                        });

                Futures.addCallback(invocation, new FutureCallback<DeferredResult<?>>() {
                    public void onSuccess(DeferredResult<?> result) {
                        if (result != null) {
                            result.setResultHandler(new DeferredResultHandler() {
                                @Override
                                public void handleResult(Object result) {
                                    if (result instanceof Exception) {
                                        onFailure((Exception) result);
                                        return;
                                    }

                                    sendResponse(result);
                                }
                            });
                        }
                    }

                    public void onFailure(Throwable t) {
                        if (t instanceof InvocationTargetException) {
                            t = ((InvocationTargetException) t).getTargetException();
                        }

                        ServiceError error = ExceptionServiceErrorMapper.mapException(t);

                        if (error != null
                                && !ExceptionServiceErrorMapper.VALIDATION_ERROR_CODE.equals(error.code)) {
                            logger.error("Unexpected exception throw while executing action [{}]",
                                    envelope.getAction(), t);
                        }

                        sendResponse(error);
                    }

                    public Future<Void> sendResponse(Object response) {
                        try {
                            return sendMessage(envelope.getAction(), envelope.getTransactionId(), response);
                        } catch (IOException | GeneralSecurityException e) {
                            logger.error("Unable to send message to channel", e);

                            return Futures.immediateFuture(null);
                        }
                    }

                }, responseExecutor);
            }
        }

        // make sure we actually invoked something
        if (invokedActions.get() < 1) {
            throw new WebSocketServiceException(
                    new ServiceError("INVALID_ACTION_MAPPING", "No actions invoked."), envelope.getAction(),
                    envelope.getTransactionId());
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

From source file:org.springframework.web.context.request.async.WebAsyncManager.java

/**
 * Start concurrent request processing and initialize the given
 * {@link DeferredResult} with a {@link DeferredResultHandler} that saves
 * the result and dispatches the request to resume processing of that
 * result. The {@code AsyncWebRequest} is also updated with a completion
 * handler that expires the {@code DeferredResult} and a timeout handler
 * assuming the {@code DeferredResult} has a default timeout result.
 * @param deferredResult the DeferredResult instance to initialize
 * @param processingContext additional context to save that can be accessed
 * via {@link #getConcurrentResultContext()}
 * @throws Exception if concurrent processing failed to start
 * @see #getConcurrentResult()/*from   www  . j a v  a  2 s  . co m*/
 * @see #getConcurrentResultContext()
 */
public void startDeferredResultProcessing(final DeferredResult<?> deferredResult, Object... processingContext)
        throws Exception {

    Assert.notNull(deferredResult, "DeferredResult must not be null");
    Assert.state(this.asyncWebRequest != null, "AsyncWebRequest must not be null");

    Long timeout = deferredResult.getTimeoutValue();
    if (timeout != null) {
        this.asyncWebRequest.setTimeout(timeout);
    }

    List<DeferredResultProcessingInterceptor> interceptors = new ArrayList<>();
    interceptors.add(deferredResult.getInterceptor());
    interceptors.addAll(this.deferredResultInterceptors.values());
    interceptors.add(timeoutDeferredResultInterceptor);

    final DeferredResultInterceptorChain interceptorChain = new DeferredResultInterceptorChain(interceptors);

    this.asyncWebRequest.addTimeoutHandler(() -> {
        try {
            interceptorChain.triggerAfterTimeout(this.asyncWebRequest, deferredResult);
        } catch (Throwable ex) {
            setConcurrentResultAndDispatch(ex);
        }
    });

    this.asyncWebRequest.addErrorHandler(ex -> {
        try {
            if (!interceptorChain.triggerAfterError(this.asyncWebRequest, deferredResult, ex)) {
                return;
            }
            deferredResult.setErrorResult(ex);
        } catch (Throwable interceptorEx) {
            setConcurrentResultAndDispatch(interceptorEx);
        }
    });

    this.asyncWebRequest.addCompletionHandler(
            () -> interceptorChain.triggerAfterCompletion(this.asyncWebRequest, deferredResult));

    interceptorChain.applyBeforeConcurrentHandling(this.asyncWebRequest, deferredResult);
    startAsyncProcessing(processingContext);

    try {
        interceptorChain.applyPreProcess(this.asyncWebRequest, deferredResult);
        deferredResult.setResultHandler(result -> {
            result = interceptorChain.applyPostProcess(this.asyncWebRequest, deferredResult, result);
            setConcurrentResultAndDispatch(result);
        });
    } catch (Throwable ex) {
        setConcurrentResultAndDispatch(ex);
    }
}