List of usage examples for org.springframework.web.context.request.async DeferredResult setResultHandler
public final void setResultHandler(DeferredResultHandler resultHandler)
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); } }