AWS Lambda - теплые функции, повторная отправка кода, как мне это остановить? - PullRequest
0 голосов
/ 20 октября 2018

Таким образом, мой код выполняется несколько раз, почти как он возвращается в код и как-то выполняет его заново ...

Этот код выполняется в Intent

@Override
public void onIntent(SpeechletRequestEnvelope<IntentRequest> requestEnvelope, Intent intent, String name) {
    IntentRequest request = requestEnvelope.getRequest();
    switch (request.getDialogState()) {
        case STARTED:
            this.speechletResponse = Response.getDialogueResponse(intent, true);
            break;
        case IN_PROGRESS:
            this.speechletResponse = Response.getDialogueResponse(intent, false);
            break;
        case COMPLETED:
            String numberString = intent.getSlot(SlotTitle.ID).getValue();
            if (!NumberUtils.isCreatable(numberString)) {
                this.speechletResponse = Response.ERROR;
                break;
            }

            Member member = Info.GUILD.getMemberById(numberString);
            User sender = UserDB.getUser(member);

            Future<Ticket> commissionTicket = new CommissionTicket(sender).create();
            try {
                commissionTicket.get(10000, TimeUnit.MILLISECONDS);
            } catch (Exception e) {
                e.printStackTrace();
            }

            SpeechletResponse resp = Response.NEW_TICKED_CREATED;
            resp.setNullableShouldEndSession(true);

            this.speechletResponse = resp;
            break;
    }
}

Это Ticket #Метод create, который запускается несколько раз на одном и том же блоке

public Future<Ticket> create() {
    GuildController guildController = Info.GUILD.getController();
    RequestFuture<Channel> channelRequestFuture = guildController.createTextChannel(ticketType.name().toLowerCase() + "-" + creator.getName() + "-" + id.value()).submit();
    try {
        Channel channel = channelRequestFuture.get(10000, TimeUnit.MILLISECONDS);
        ChannelManager channelManager = channel.getManager();
        GuildManager guildManager = channelManager.getGuild().getManager();
        List<Member> members = guildManager.getGuild().getMembers();
        List<Member> admins = new ArrayList<>();

        for (Member member : members) {
            for (Role role : member.getRoles()) {
                if (!role.getName().equalsIgnoreCase(Info.ADMIN_STRING)) continue;
                admins.add(member);
            }
        }

        for (Member member : members) {
            if (member.equals(creator.getMember())) continue;
            channel.createPermissionOverride(member).setDeny(Permission.MESSAGE_READ).queue();
        }


        for (Member admin : admins) {
            if (admin.equals(creator.getMember())) continue;
            channel.createPermissionOverride(admin).setAllow(Permission.MESSAGE_READ).queue();
        }


        BotMessage botMessage = new BotMessage();
        botMessage
                .setTitle("New Ticket! User: " + creator.getName())
                .setColour(Color.CYAN)
                .setDescription("Please enter your full request here! \n" +
                        "Make sure to let us know whether you are looking for a quote/timeframe,\n" +
                        "or have a budget in mind, and we will work around you!\n\n" +
                        "A sales representative will be with you as soon as possible!")
                .send((TextChannel) channel);


        this.textChannel = (TextChannel) channel;

        TicketDB.addTicket(this);

    } catch (Exception e) {
        e.printStackTrace();
    }

    if (!userIsInTicket(creator)) users.add(creator);
    Future<Ticket> future = ConcurrentUtils.constantFuture(this);
    return future;

}

Итак, когда запускается код Ticket # create, он создает новый текстовый канал, уникальный и отправляет сообщение этому каналу.Это все нормально, однако затем, после создания канала, я снова вызываю лямбда-функцию, поэтому она «тёплая» и создает новый уникальный текстовый канал, как и ожидалось, НО также отправляет это сообщение в созданном канале.ранее еще два раза по неизвестной причине.Если бы я мог получить помощь, почему это было бы очень ценно.Спасибо

https://gyazo.com/2432b101a051ce2dc6521e939d8a8690

1 Ответ

0 голосов
/ 24 октября 2018

Я считаю, что суть вашей проблемы в том, что некоторые переменные (канал) находятся вне вашей функции-обработчика.

AWS Lambda - это просто контейнер Docker.Контейнер иногда перезагружается ... но обычно, когда он запускается и инициализируется, единственное, что происходит, когда вы вызываете "теплую" лямбду, - это то, что ваша функция-обработчик вызывается (какой-то внешней вещью AWS) внутри вашего существующего и работающегоcontainer ...

Следовательно, все, что находится за пределами вашей функции-обработчика и вызывается только тогда, когда код инициализируется в первый раз и будет сохранять свое начальное значение в последующих вызовах.

Trythis out (пример Python):

from datetime import datetime

now = str(datetime.now())

def lambda_handler(event, context):
    return now

Этот фрагмент кода будет находиться в модуле с именем lambda_function.py.Когда вы впервые вызываете лямбду, будет запущен контейнер Docker с интерпретатором Python, который загрузит ваш модуль lambda_function и вызовет функцию lambda_handler().

Однако при вызове функции secondвремя, модуль уже был загружен.Таким образом, переменная now уже инициализирована и имеет предыдущее значение.Последующие вызовы lambda_handler() (или, если хотите, «вызовов лямбда-функций») будут просто передавать то же значение, которое было создано при первой инициализации модуля.

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