Мои сообщения не отправляются в правильном порядке в BotFramework - Java - PullRequest
2 голосов
/ 31 октября 2019

У меня в главном контроллере есть два основных метода:

public synchronized void sendQuestion(Activity activity, PostQuestion pq) {
    Map<String, Object> map = allConversations.get(activity.getConversation().getId());
    map.put("command", pq.getQuestionId()); //It will run a command at next user input
    allConversations.put(activity.getConversation().getId(), map); //Store all conversation data
    sendMessage(activity, pq.getQuestionLabel()); //QuestionLabel is a string
}

public boolean sendMessage(Activity activity, String msg) {
    Activity reply = activity.createReply(msg);
    try {
        this.connector.getConversations()
                .sendToConversation(
                        activity.getConversation().getId(),
                        reply);
        return true;
    } catch (Exception e) {
        return false;
    }
}

Мой бот - это базовый бот QnA. Он извлекает данные из API и отправляет результаты. Он задает вопросы после ответов. Моя проблема: если я отправляю, например, два сообщения с методом sendMessage, а затем сообщение с sendQuestion (кто отправляет сообщение тоже):

sendMessage(activity, "Hello"); sendMessage(activity, "World!"); sendQuestion(activity, PostQuestion.askHello())

иногда случается, что у меня естьследующий порядок «Сообщение - Вопрос (сообщение) - Сообщение» вместо «Сообщение - Сообщение - Вопрос».

Есть ли у меня проблема с потоками? (Я не делаю многопоточность в моем приложении). Я пытался использовать синхронизированное ключевое слово для двух моих методов, но моя проблема все еще здесь.

Спасибо за помощь!

1 Ответ

1 голос
/ 01 ноября 2019

Поскольку бот - это веб-приложение, и вы будете иметь дело с вызовами API REST и т. Д., На самом деле нет никакого способа не иметь асинхронность. Например, каждый раз, когда вы используете sendToConversation для отправки пользователю сообщения от бота, это асинхронная операция. В Bot Builder Java SDK для выполнения асинхронности используется завершаемое будущее, и вы тоже должны это делать. Взгляните на пример Welcome User , чтобы узнать, как можно использовать завершаемые фьючерсы, чтобы убедиться, что асинхронные операции выполняются одна за другой, ожидая завершения каждой из них по очереди:

/**
 * This will prompt for a user name, after which it will send info about the conversation.  After sending
 * information, the cycle restarts.
 *
 * @param turnContext The context object for this turn.
 * @return A future task.
 */
@Override
protected CompletableFuture<Void> onMessageActivity(TurnContext turnContext) {
    // Get state data from UserState.
    StatePropertyAccessor<WelcomeUserState> stateAccessor = userState.createProperty("WelcomeUserState");
    CompletableFuture<WelcomeUserState> stateFuture = stateAccessor.get(turnContext, WelcomeUserState::new);

    return stateFuture.thenApply(thisUserState -> {
        if (!thisUserState.getDidBotWelcomeUser()) {
            thisUserState.setDidBotWelcomeUser(true);

            String userName = turnContext.getActivity().getFrom().getName();
            return turnContext.sendActivities(
                MessageFactory.text(FIRST_WELCOME_ONE),
                MessageFactory.text(String.format(FIRST_WELCOME_TWO, userName))
            );
        } else {
            String text = turnContext.getActivity().getText().toLowerCase();
            switch (text) {
                case "hello":
                case "hi":
                    return turnContext.sendActivities(MessageFactory.text("You said " + text));

                case "intro":
                case "help":
                    return sendIntroCard(turnContext);

                default:
                    return turnContext.sendActivity(WELCOMEMESSAGE);
            }
        }
    })
        // make the return value happy.
        .thenApply(resourceResponse -> null);
}

Также помните, что Java SDK все еще находится в режиме предварительного просмотра, и поэтому вы рискуете столкнуться с проблемами, даже если вы все сделаете правильно.

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