Azure функций, сбой задачи azureFunctionsPackage с java .lang.NullPointerException - PullRequest
0 голосов
/ 26 марта 2020

У меня есть приложение функции azure, которое является EventGridTrigger, и я использую Gradle. Я могу построить свой код и тесты пройдены. Однако при запуске задачи для пакета моих azure функций задача не выполняется, и я получаю это исключение в терминале:

Execution failed for task ':functionsPackage'.
    > java.lang.NullPointerException (no error message)

Один из старших инженеров, с которыми я работаю, сказал мне он видел ошибку раньше, и это была ошибка. Он сказал, что обычно это происходит с лямбдами API java 8 streams, и мне нужно будет найти каждую лямбду и заменить ее раздражающим классом, так что я сделал это. Я прокомментировал весь код приложений приложений azure и по частям заново вводил каждую строку кода, пока не обнаружил, какая из них нарушает задачу azureFunctionsPackage, и обнаружил, что это следующий метод:

private boolean isHandledSubject(SchedulerEventSubject schSubject)
    {
        // Handle our subscriber ID
        //if(SubscriberIds.SWITCH_DMS_ID.equals(schSubject.getSubscriberId()))
        //{
        //    return true;
       // }

        // If the subscriber ID is ALL and it's a switch or network element
//        if(SubscriberIds.ALL_ID.equals(schSubject.getSubscriberId()))
//        {
//            return ElementType.SWITCH.equals(schSubject.getElementType()) ||
//                    ElementType.NETWORK.equals(schSubject.getElementType());
//        }
//
        return false;
    }

Как видите, даже когда я полностью закомментировал все тело метода, он нарушает код и вызывает исключение NullPointerException, которое меня смущает, потому что я ожидал, что это будет хотя бы один из методов внутри? Даже если я сделаю метод void или верну true, он все равно сломается. Этот метод вызывается 1 раз внутри моей основной функции EventGridTrigger, которая называется handleEvent (я не писал ни один из этого кода, поэтому я надеялся избежать каких-либо серьезных изменений, чтобы не сломать что-либо). Я вставлю код ниже, но кто-нибудь видел это раньше? Я немного озадачен. Я внес изменения в эту кодовую базу в своей собственной ветке, и ветвь разработки прекрасно компилируется / собирается.

@FunctionName("genericEventHandler")
    public void handleEvent(@EventGridTrigger(name = "event") String content) {
        try {
            if (content == null)
                return;

            ObjectMapper objMap = new ObjectMapper();
            objMap.registerModule(new JodaModule());
            EventGridEvent event = SchedulerIcdKt.fromSchedulerEventJson(content);

            log.info("EventObject {} ", event);

            String schedulerTopic = keyProvider.get(
                    SCHEDULER_EVENT_GRID_TOPIC_FULL_PATH);

            // Check for nulls
            if (isBlank(schedulerTopic) || isBlank(event.topic())) {
                log.error("Event Grid Topic was NULL! KeyVault:{} Event Topic:{}", schedulerTopic, event.topic());
                return;
            }

            // First check if we even have an event from the Scheduler
            if (!event.topic().equalsIgnoreCase(schedulerTopic))
                return;

            SchedulerEventSubject schSubject = new SchedulerEventSubject(event.subject());

            @SuppressWarnings("unchecked")
            List<SchedulerEvent> schedulerEventList = (List<SchedulerEvent>) event.data(); //unsafe cast

            if (!isHandledSubject(schSubject))
                return;

            schedulerEventList.stream().forEach(new Consumer<SchedulerEvent>() {
                @Override
                public void accept(SchedulerEvent schedEvent) {
                    String networkId;
                    SnmpCred cred = new SnmpCred();

                    if (schedEvent.getActionType().equals(SchedulerEventActionType.NetworkCreate)) {
                        NetworkCreate network_create = (NetworkCreate) schedEvent;
                        networkId = network_create.getNetworkId();
                    } else if (schedEvent.getActionType().equals(SchedulerEventActionType.NetworkUpdate)) {
                        NetworkUpdate network_update = (NetworkUpdate) schedEvent;
                        networkId = network_update.getNetworkId();
                    } else {
                        log.info("Unhandled scheduler data: {}", schedEvent);
                        return;
                    }

                    try {
                        Optional<Network> network = DataGatewayFactory.getInstance().getNetworkCrud().get(networkId);

                        if (!network.isPresent()) {
                            log.error("Error trying to retreive Network with ID {} from the database.", networkId);
                            return;
                        }

                        boolean status;

                        // If Deployment Type is DEMO, ONLY call deployPtpConfigBlob (no switch config)
                        if (network.get().getDeploymentType().equals(DeploymentType.DEMO)) {
                            status = deployPtpConfigBlob(network.get());
                        } else {
                            createOrGetNetworkSnmpPassword(network.get(), cred);

                            if ((status = deploySwitchConfigBlob(network.get(), cred.getAuth(), cred.getPriv()))) {
                                status = deployPtpConfigBlob(network.get());
                            }
                        }

                        // Return the same scheduler subject with the subject Id set to switch dms
                        schSubject.setSubscriberId(SubscriberIds.SWITCH_DMS_ID);
                        EventGridFunctions.this.publishDmsStatus(schSubject, status, schedEvent);
                    } catch (Exception de) {
                        log.error("Exception while trying to retreive the network {}.", networkId, de);
                    }
                }
            });
        } catch (Exception e) {
            log.error("EventObject {} ", content, e);
        }
    }

1 Ответ

0 голосов
/ 27 марта 2020

ОК, я смог «исправить» это, комментируя весь код в Azure функциях, оставляя другой код в моем проекте без комментариев и мог запускаться. Я построил проект, и он был успешным. Это дало мне знать, что проблема была на 100% с моими функциями azure.

Затем я закомментировал весь код в функциях azure и построчно раскомментировал и пересобрал, чтобы увидеть, когда это сломалось бы.

Когда я нажимаю на метод, такой как метод "isHandledSubject", который я опубликовал выше, сборка прерывается с исключением NullPointerException. Даже с пустым телом метода и пустым типом возвращаемого значения. Я увидел ClassPath = null при выводе информации --scan при запуске класса azureFunctionsPackage, поэтому я решил переместить метод за пределы этого класса (т. Е. Я создал новый класс с именем "HelperFunctions. java" и поместил там методы. ).

Смотри, сборка прошла успешно. Затем я поместил все остальные методы, которые были в тех же файлах java, что и функции Azure (EventGridTriggers, QueueTriggers, HttpTriggers et c ..), и переместил их за пределы рассматриваемых классов и поместил их в функции HelperFunctions. java и все собрано нормально.

Я до сих пор не совсем понимаю причину этой ошибки, но сборка также была успешно выполнена в облаке (azure devops), поэтому я счастлив: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...