Example usage for org.springframework.util.concurrent ListenableFuture addCallback

List of usage examples for org.springframework.util.concurrent ListenableFuture addCallback

Introduction

In this page you can find the example usage for org.springframework.util.concurrent ListenableFuture addCallback.

Prototype

void addCallback(ListenableFutureCallback<? super T> callback);

Source Link

Document

Register the given ListenableFutureCallback .

Usage

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);
        }
    }
}