BufferingResponseListener и getContentAsString добавляют ранее извлеченный контент - PullRequest
0 голосов
/ 02 декабря 2018

Я запускаю собственный WebSocketServlet для Jetty, который отправляет короткие текстовые push-уведомления (для асинхронного мобильного и настольная игра в слова ) на многие платформы (Facebook, Vk.com, Mail.ru, Ok.ru).также Firebase и Amazon для обмена сообщениями) с использованием экземпляра Jetty HttpClient:

public class MyServlet extends WebSocketServlet {
    private final SslContextFactory mSslFactory = new SslContextFactory();
    private final HttpClient mHttpClient = new HttpClient(mSslFactory);

    @Override
    public void init() throws ServletException {
        super.init();

        try {
            mHttpClient.start();
        } catch (Exception ex) {
            throw new ServletException(ex);
        }

        mFcm      = new Fcm(mHttpClient);    // Firebase
        mAdm      = new Adm(mHttpClient);    // Amazon
        mApns     = new Apns(mHttpClient);   // Apple
        mFacebook = new Facebook(mHttpClient);
        mMailru   = new Mailru(mHttpClient);
        mOk       = new Ok(mHttpClient);
        mVk       = new Vk(mHttpClient);
    }

Это очень хорошо работало в прошлом году, но с тех пор, как я недавно обновил свой WAR-файл для использования Jetty 9.4.14.v20181114,проблема началась -

public class Facebook {
    private final static String APP_ID      = "XXXXX";
    private final static String APP_SECRET  = "XXXXX";
    private final static String MESSAGE_URL = "https://graph.facebook.com/%s/notifications?" +
            // the app access token is: "app id | app secret"
            "access_token=%s%%7C%s" +
            "&template=%s";

    private final HttpClient mHttpClient;

    public Facebook(HttpClient httpClient) {
        mHttpClient = httpClient;
    }

    private final BufferingResponseListener mMessageListener = new BufferingResponseListener() {
        @Override
        public void onComplete(Result result) {
            if (!result.isSucceeded()) {
                LOG.warn("facebook failure: {}", result.getFailure());
                return;
            }

            try {
                // THE jsonStr SUDDENLY CONTAINS PREVIOUS CONTENT!
                String jsonStr = getContentAsString(StandardCharsets.UTF_8);
                LOG.info("facebook success: {}", jsonStr);
            } catch (Exception ex) {
                LOG.warn("facebook exception: ", ex);
            }
        }
    };

    public void postMessage(int uid, String sid, String body) {
        String url = String.format(MESSAGE_URL, sid, APP_ID, APP_SECRET, UrlEncoded.encodeString(body));
        mHttpClient.POST(url).send(mMessageListener);
    }
}

Внезапно метод getContentAsString, вызванный для успешных вызовов HttpClient, начал доставлять строки, которые были извлечены ранее - с добавлением к фактической строке результата.

Что это может быть, изменилось ли поведение BufferingResponseListener или, может быть, какая-то неочевидная причуда Java?

1 Ответ

0 голосов
/ 03 декабря 2018

BufferingResponseListener никогда не предназначался для повторного использования в запросах.

Просто выделите новый BufferingResponseListener для каждого запроса / ответа.

...