List of usage examples for org.springframework.util.concurrent ListenableFuture addCallback
void addCallback(ListenableFutureCallback<? super T> callback);
From source file:at.ac.tuwien.infosys.DeviceManager.java
/** * Invoked by the ArtifactBuilder to notify the Manager that a new device * update is available.//w w w . j a v a 2 s . c om * * @param deviceId * @param imageId * @param attachment * @return */ // TODO get rid of deviceId since Image contains id or set of ids already! @RequestMapping(value = "/update", method = RequestMethod.POST) public ResponseEntity<String> update(@RequestBody Image image) { logger.info("Received request to update device(s): " + image.getDeviceIds() + " with image: " + image); deviceStore.addUpdate(image); // if (force){ //invoke API manager for (String deviceId : image.getDeviceIds()) { ListenableFuture<ResponseEntity<String>> result = asyncRestTemplate .getForEntity("http://localhost:8080/APIManager/invokeAgent/" + deviceId, String.class); result.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() { @Override public void onSuccess(ResponseEntity<String> result) { // LOGGER.info("Received result from node: " // + result.getBody()); // // Add to a queue // endTS = System.currentTimeMillis(); // LOGGER.info("Invocation time was: " + startTime + "," // + endTS); } @Override public void onFailure(Throwable t) { // LOGGER.info("Error contacting device: " // + t.getMessage()); } }); } // } return new ResponseEntity<String>("Successfully stored image!", HttpStatus.OK); }
From source file:at.ac.tuwien.infosys.Balancer.java
@RequestMapping(value = "/provision/{nrOfDevices}/{componentName}/{version}", method = RequestMethod.GET) public ResponseEntity<String> startProvisioning(@PathVariable Integer nrOfDevices, @PathVariable String componentName, @PathVariable String version) { logger.info("Start provisioning of " + nrOfDevices + " device(s)!"); if (nrOfDevices <= 0) return new ResponseEntity<String>(HttpStatus.BAD_REQUEST); // get List of devices to provision List<ProvisionRequest> toProvision = nodeManager.provision(nrOfDevices); logger.info("Selected devices to be provisioned: " + toProvision); List<String> fullDeviceList = new ArrayList<String>(); // save time stamp before provisioning is triggered long startedProvisiong = System.currentTimeMillis(); // invoke each node to start provisioning logger.info("Start contacting nodes and send provisioning request!"); for (ProvisionRequest request : toProvision) { List<String> deviceIds = request.getDevices(); String builderUrl = "http://" + request.getNode() + ":" + builderPort + builderContext + builderPath; logger.info("Contact node: " + builderUrl + " to provision: " + deviceIds); DeviceUpdateRequest updateRequest = new DeviceUpdateRequest(deviceIds, componentName, version); updateRequest.setPush(true);//w w w .j av a 2s.c o m // use asynchronous rest-template to not block ListenableFuture<ResponseEntity<String>> result = asyncRestTemplate.postForEntity(builderUrl, new HttpEntity<DeviceUpdateRequest>(new DeviceUpdateRequest(deviceIds, componentName, version)), String.class); result.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() { @Override public void onSuccess(ResponseEntity<String> result) { logger.info("Received result from node: " + result.getBody()); } @Override public void onFailure(Throwable t) { logger.severe("Error occured while contacting node: " + t.getMessage()); } }); // add currently provisioned devices to the overall list fullDeviceList.addAll(deviceIds); } logger.info("Finished contacting nodes!"); // initiate the tracking phase of the provisioning provisioningLogger.startLogging(fullDeviceList, startedProvisiong); return new ResponseEntity<String>( "Successfully triggered provisioning of: " + fullDeviceList.size() + " devices!", HttpStatus.ACCEPTED); }
From source file:io.getlime.push.service.PushMessageSenderService.java
private void sendMessageToAndroid(final FcmClient fcmClient, final PushMessageBody pushMessageBody, final PushMessageAttributes attributes, final String pushToken, final PushSendingCallback callback) throws PushServerException { FcmSendRequest request = new FcmSendRequest(); request.setTo(pushToken);/* www .j a v a2s . co m*/ request.setData(pushMessageBody.getExtras()); request.setCollapseKey(pushMessageBody.getCollapseKey()); if (attributes == null || !attributes.getSilent()) { // if there are no attributes, assume the message is not silent FcmNotification notification = new FcmNotification(); notification.setTitle(pushMessageBody.getTitle()); notification.setBody(pushMessageBody.getBody()); notification.setIcon(pushMessageBody.getIcon()); notification.setSound(pushMessageBody.getSound()); notification.setTag(pushMessageBody.getCategory()); request.setNotification(notification); } final ListenableFuture<ResponseEntity<FcmSendResponse>> future = fcmClient.exchange(request); future.addCallback(new ListenableFutureCallback<ResponseEntity<FcmSendResponse>>() { @Override public void onFailure(Throwable throwable) { Logger.getLogger(PushMessageSenderService.class.getName()).log(Level.SEVERE, "Notification rejected by the FCM gateway: " + throwable.getLocalizedMessage()); callback.didFinishSendingMessage(PushSendingCallback.Result.FAILED, null); } @Override public void onSuccess(ResponseEntity<FcmSendResponse> response) { for (FcmResult fcmResult : response.getBody().getFcmResults()) { if (fcmResult.getMessageId() != null) { // no issues, straight sending if (fcmResult.getRegistrationId() == null) { Logger.getLogger(PushMessageSenderService.class.getName()).log(Level.INFO, "Notification sent"); callback.didFinishSendingMessage(PushSendingCallback.Result.OK, null); } else { // no issues, straight sending + update token (pass it via context) Logger.getLogger(PushMessageSenderService.class.getName()).log(Level.INFO, "Notification sent and token has been updated"); Map<String, Object> contextData = new HashMap<>(); contextData.put(FcmResult.KEY_UPDATE_TOKEN, fcmResult.getRegistrationId()); callback.didFinishSendingMessage(PushSendingCallback.Result.OK, contextData); } } else { if (fcmResult.getFcmError() != null) { switch (fcmResult.getFcmError().toLowerCase()) { // make sure to account for case issues // token doesn't exist, remove device registration case "notregistered": Logger.getLogger(PushMessageSenderService.class.getName()).log(Level.SEVERE, "Notification rejected by the FCM gateway, invalid token, will be deleted: "); callback.didFinishSendingMessage(PushSendingCallback.Result.FAILED_DELETE, null); break; // retry to send later case "unavailable": Logger.getLogger(PushMessageSenderService.class.getName()).log(Level.SEVERE, "Notification rejected by the FCM gateway, will retry to send: "); callback.didFinishSendingMessage(PushSendingCallback.Result.PENDING, null); break; // non-recoverable error, remove device registration default: Logger.getLogger(PushMessageSenderService.class.getName()).log(Level.SEVERE, "Notification rejected by the FCM gateway, non-recoverable error, will be deleted: "); callback.didFinishSendingMessage(PushSendingCallback.Result.FAILED_DELETE, null); break; } } } } } }); }
From source file:org.apache.servicecomb.demo.springmvc.tests.SpringMvcIntegrationTestBase.java
@Test public void ableToSetCustomHeader() { HttpHeaders headers = new HttpHeaders(); headers.set("name", "world"); HttpEntity<?> requestEntity = new HttpEntity<>(headers); ResponseEntity<String> result = restTemplate.exchange(controllerUrl + "sayhei", GET, requestEntity, String.class); assertThat(jsonOf(result.getBody(), String.class), is("hei world")); ListenableFuture<ResponseEntity<String>> listenableFuture = asyncRestTemplate .exchange(controllerUrl + "sayhei", GET, requestEntity, String.class); // ResponseEntity<String> responseEntity = listenableFuture.get(); listenableFuture.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() { @Override// w w w .ja va2 s.c om public void onFailure(Throwable ex) { } @Override public void onSuccess(ResponseEntity<String> result) { assertThat(jsonOf(result.getBody(), String.class), is("hei world")); } }); }
From source file:org.springframework.cloud.sleuth.instrument.web.client.TraceAsyncRestTemplate.java
@Override protected <T> ListenableFuture<T> doExecute(URI url, HttpMethod method, AsyncRequestCallback requestCallback, ResponseExtractor<T> responseExtractor) throws RestClientException { final ListenableFuture<T> future = super.doExecute(url, method, requestCallback, responseExtractor); final Span span = this.tracer.getCurrentSpan(); future.addCallback(new TraceListenableFutureCallback<>(this.tracer, span)); // potential race can happen here if (span != null && span.equals(this.tracer.getCurrentSpan())) { this.tracer.detach(span); }//from w w w .j ava2s . c o m return new ListenableFuture<T>() { @Override public boolean cancel(boolean mayInterruptIfRunning) { return future.cancel(mayInterruptIfRunning); } @Override public boolean isCancelled() { return future.isCancelled(); } @Override public boolean isDone() { return future.isDone(); } @Override public T get() throws InterruptedException, ExecutionException { return future.get(); } @Override public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return future.get(timeout, unit); } @Override public void addCallback(ListenableFutureCallback<? super T> callback) { future.addCallback(new TraceListenableFutureCallbackWrapper<>(TraceAsyncRestTemplate.this.tracer, span, callback)); } @Override public void addCallback(SuccessCallback<? super T> successCallback, FailureCallback failureCallback) { future.addCallback( new TraceSuccessCallback<>(TraceAsyncRestTemplate.this.tracer, span, successCallback), new TraceFailureCallback(TraceAsyncRestTemplate.this.tracer, span, failureCallback)); } }; }
From source file:org.springframework.cloud.stream.binder.kafka.streams.KafkaStreamsDlqDispatch.java
@SuppressWarnings("unchecked") public void sendToDlq(byte[] key, byte[] value, int partittion) { ProducerRecord<byte[], byte[]> producerRecord = new ProducerRecord<>(this.dlqName, partittion, key, value, null);//from w w w . j a v a2 s . c o m StringBuilder sb = new StringBuilder().append(" a message with key='") .append(toDisplayString(ObjectUtils.nullSafeToString(key))).append("'").append(" and payload='") .append(toDisplayString(ObjectUtils.nullSafeToString(value))).append("'").append(" received from ") .append(partittion); ListenableFuture<SendResult<byte[], byte[]>> sentDlq = null; try { sentDlq = this.kafkaTemplate.send(producerRecord); sentDlq.addCallback(new ListenableFutureCallback<SendResult<byte[], byte[]>>() { @Override public void onFailure(Throwable ex) { KafkaStreamsDlqDispatch.this.logger.error("Error sending to DLQ " + sb.toString(), ex); } @Override public void onSuccess(SendResult<byte[], byte[]> result) { if (KafkaStreamsDlqDispatch.this.logger.isDebugEnabled()) { KafkaStreamsDlqDispatch.this.logger.debug("Sent to DLQ " + sb.toString()); } } }); } catch (Exception ex) { if (sentDlq == null) { KafkaStreamsDlqDispatch.this.logger.error("Error sending to DLQ " + sb.toString(), ex); } } }
From source file:org.springframework.integration.samples.async.gateway.ListenableFutureTest.java
@Test public void testAsyncGateway() throws Exception { Random random = new Random(); int[] numbers = new int[100]; int expectedResults = 0; for (int i = 0; i < 100; i++) { numbers[i] = random.nextInt(200); if (numbers[i] > 100) { expectedResults++;/*from w ww.j a v a2 s .c o m*/ } } final CountDownLatch latch = new CountDownLatch(expectedResults); final AtomicInteger failures = new AtomicInteger(); for (int i = 0; i < 100; i++) { final int number = numbers[i]; ListenableFuture<Integer> result = gateway.multiplyByTwo(number); ListenableFutureCallback<Integer> callback = new ListenableFutureCallback<Integer>() { @Override public void onSuccess(Integer result) { logger.info("Result of multiplication of " + number + " by 2 is " + result); latch.countDown(); } @Override public void onFailure(Throwable t) { failures.incrementAndGet(); logger.error("Unexpected exception for " + number, t); latch.countDown(); } }; result.addCallback(callback); } assertTrue(latch.await(60, TimeUnit.SECONDS)); assertEquals(0, failures.get()); logger.info("Finished"); }
From source file:org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.java
protected void handleMatch(T mapping, HandlerMethod handlerMethod, String lookupDestination, Message<?> message) {//from ww w . ja v a 2 s.c om if (logger.isDebugEnabled()) { logger.debug("Invoking " + handlerMethod.getShortLogMessage()); } handlerMethod = handlerMethod.createWithResolvedBean(); InvocableHandlerMethod invocable = new InvocableHandlerMethod(handlerMethod); invocable.setMessageMethodArgumentResolvers(this.argumentResolvers); try { Object returnValue = invocable.invoke(message); MethodParameter returnType = handlerMethod.getReturnType(); if (void.class == returnType.getParameterType()) { return; } if (returnValue != null && this.returnValueHandlers.isAsyncReturnValue(returnValue, returnType)) { ListenableFuture<?> future = this.returnValueHandlers.toListenableFuture(returnValue, returnType); if (future != null) { future.addCallback(new ReturnValueListenableFutureCallback(invocable, message)); } } else { this.returnValueHandlers.handleReturnValue(returnValue, returnType, message); } } catch (Exception ex) { processHandlerMethodException(handlerMethod, ex, message); } catch (Throwable ex) { if (logger.isErrorEnabled()) { logger.error("Error while processing message " + message, ex); } } }