Как вызвать метод asyncBatchAnnotate Google в приложении Spring Boot? - PullRequest
0 голосов
/ 05 июня 2019

Я работаю с Обнаружение текста документа PDF / TIFF , выпущенным несколько месяцев назад.Когда я пытаюсь вызвать метод asyncBatchAnnotate, я получаю сообщение об ошибке, это происходит только в Spring Boot.Когда я запускаю тот же код в автономном приложении, он работает хорошо.Я уже установил свойства Async в классе Config и классе компонентов.

PS: я почти уверен, что код хорошо работает в приложениях, не поддерживающих загрузку.

У меня есть служба.

    @Service
    public class PDFGoogleService {

    Feature feature;
    Bucket bucket;
    Storage storage;
    String bucketName;


    @Autowired
    public PDFGoogleService() {
        super();
        bucketName = "documentoscamaracomercio";
        feature = Feature.newBuilder().setType(Feature.Type.DOCUMENT_TEXT_DETECTION).build();
        storage = StorageOptions.getDefaultInstance().getService();
        bucket = storage.get(bucketName);       
    }

    public String ocrService(MultipartFile input) {
        try {
            uploadDocumentGcs(input);
            return detectDocumentsGcs("gs://documentoscamaracomercio/documentos/"+input.getOriginalFilename(), "gs://documentoscamaracomercio/resultados/"+1+"/");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    public void uploadDocumentGcs(MultipartFile input) throws IOException {
        bucket.create("documentos/"+input.getOriginalFilename(), input.getInputStream(), "application/pdf");
    }

    @Async
    public String detectDocumentsGcs(String gcsSourcePath, String gcsDestinationPath) throws Exception {
        try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
            List<AsyncAnnotateFileRequest> requests = new ArrayList<>();

            GcsSource gcsSource = GcsSource.newBuilder().setUri(gcsSourcePath).build();

            InputConfig inputConfig = InputConfig.newBuilder().setMimeType("application/pdf").setGcsSource(gcsSource)
                    .build();


            GcsDestination gcsDestination = GcsDestination.newBuilder().setUri(gcsDestinationPath).build();

            OutputConfig outputConfig = OutputConfig.newBuilder().setBatchSize(2).setGcsDestination(gcsDestination)
                    .build();


            // Build the OCR request
            AsyncAnnotateFileRequest request = AsyncAnnotateFileRequest.newBuilder().addFeatures(feature)
                    .setInputConfig(inputConfig).setOutputConfig(outputConfig).build();

            requests.add(request);

            // Perform the OCR request
            OperationFuture<AsyncBatchAnnotateFilesResponse, OperationMetadata> response = client
                    .asyncBatchAnnotateFilesAsync(requests);

            System.out.println("Waiting for the operation to finish.");

            // Wait for the request to finish. (The result is not used, since the API saves
            // the result to
            // the specified location on GCS.)
            response.get(180, TimeUnit.SECONDS).getResponsesList();

            // Get the destination location from the gcsDestinationPath
            Pattern pattern = Pattern.compile("gs://([^/]+)/(.+)");
            Matcher matcher = pattern.matcher(gcsDestinationPath);

            if (matcher.find()) {
                String prefix = matcher.group(2); 
                com.google.api.gax.paging.Page<Blob> pageList = bucket.list(BlobListOption.prefix(prefix));

                Blob outputFile = null;
                String texto = "";

                for (Blob blob : pageList.iterateAll()) {
                    String nameBlob;
                    if ((nameBlob = blob.getName()).lastIndexOf(".") != -1) {
                        outputFile = blob;
                        String jsonContents = new String(outputFile.getContent());
                        Builder builder = AnnotateFileResponse.newBuilder();
                        JsonFormat.parser().merge(jsonContents, builder);
                        AnnotateFileResponse annotateFileResponse = builder.build();
                        AnnotateImageResponse annotateImageResponse = annotateFileResponse.getResponses(0);
                        texto += annotateImageResponse.getFullTextAnnotation().getText();
                    }

                }

                return texto;
            } else {
                System.out.println("No MATCH");
            }
        }
        return null;
    }
}

У меня есть класс Config

    @Configuration
    @EnableAsync
    public class MvcConfig {

    }

Я вызываю службу из контроллера

    @Controller
    public class DataGatherController {

    @Autowired
    PDFGoogleService pdfService;

    @PostMapping("uploadMultiple")
    public String uploadMultipleFiles(@RequestParam("files") List<MultipartFile> files,
            RedirectAttributes redirectAttributes, Model model) {
        ....
            String text=pdfService.ocrService(multipartFile);
    ....    
    }

Я получил эту ошибку:

    java.lang.AbstractMethodError: null
    at com.google.api.gax.retrying.BasicRetryingFuture.handleAttempt(BasicRetryingFuture.java:142) ~[gax-1.44.0.jar:1.44.0]
    at com.google.api.gax.retrying.CallbackChainRetryingFuture$AttemptCompletionListener.handle(CallbackChainRetryingFuture.java:135) ~[gax-1.44.0.jar:1.44.0]
    at com.google.api.gax.retrying.CallbackChainRetryingFuture$AttemptCompletionListener.run(CallbackChainRetryingFuture.java:117) ~[gax-1.44.0.jar:1.44.0]
    at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30) ~[guava-27.1-android.jar:na]
    at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1139) ~[guava-27.1-android.jar:na]
    at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:707) ~[guava-27.1-android.jar:na]
    at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.addListener(AbstractFuture.java:112) ~[guava-27.1-android.jar:na]
    at com.google.common.util.concurrent.ForwardingListenableFuture.addListener(ForwardingListenableFuture.java:45) ~[guava-27.1-android.jar:na]
    at com.google.api.gax.retrying.CallbackChainRetryingFuture.setAttemptFuture(CallbackChainRetryingFuture.java:93) ~[gax-1.44.0.jar:1.44.0]
    at com.google.api.gax.rpc.AttemptCallable.call(AttemptCallable.java:89) ~[gax-1.44.0.jar:1.44.0]
    at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:63) ~[gax-1.44.0.jar:1.44.0]
    at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:41) ~[gax-1.44.0.jar:1.44.0]
    at com.google.api.gax.grpc.GrpcOperationSnapshotCallable.futureCall(GrpcOperationSnapshotCallable.java:58) ~[gax-grpc-1.34.0.jar:1.34.0]
    at com.google.api.gax.rpc.OperationCallableImpl.futureCall(OperationCallableImpl.java:82) ~[gax-1.44.0.jar:1.44.0]
    at com.google.api.gax.rpc.OperationCallable$1.futureCall(OperationCallable.java:150) ~[gax-1.44.0.jar:1.44.0]
    at com.google.api.gax.rpc.OperationCallable.futureCall(OperationCallable.java:67) ~[gax-1.44.0.jar:1.44.0]
    at com.google.cloud.vision.v1.ImageAnnotatorClient.asyncBatchAnnotateFilesAsync(ImageAnnotatorClient.java:293) ~[google-cloud-vision-1.51.0.jar:na]
    at com.google.cloud.vision.v1.ImageAnnotatorClient.asyncBatchAnnotateFilesAsync(ImageAnnotatorClient.java:263) ~[google-cloud-vision-1.51.0.jar:na]
    at com.xirius.springboot.app.services.TextExtractor.PDFGoogleService.detectDocumentsGcs(PDFGoogleService.java:95) ~[classes/:na]
    at com.xirius.springboot.app.services.TextExtractor.PDFGoogleService.ocrService(PDFGoogleService.java:58) ~[classes/:na]
    at com.xirius.springboot.app.services.TextExtractor.PDFGoogleService$$FastClassBySpringCGLIB$$f079d5d0.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684) ~[spring-aop-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at com.xirius.springboot.app.services.TextExtractor.PDFGoogleService$$EnhancerBySpringCGLIB$$3fa3646a.ocrService(<generated>) ~[classes/:na]
    at com.xirius.springboot.app.controllers.DataGatherController.uploadMultipleFiles(DataGatherController.java:75) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_211]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_211]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_211]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_211]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:215) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:142) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:998) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:901) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875) ~[spring-webmvc-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_211]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_211]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.12.jar:9.0.12]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_211]
...