Evernote Java API java.lang.OutOfMemoryError: spazio heap Java quando si chiama listNotebooks


Sto cercando di ottenere un elenco di note per la mia app web. Sto usando NoteStoreClient per ottenere l'elenco sui notebook, quindi l'elenco delle note per ogni notebook trovato.

Ecco il mio metodo di constucting del client (in realtà il wrapper del client, ma sono solo i dettagli dell'implementazione):

private DatesAwareNoteStoreClient fromAccessToken(EvernoteAccount evernoteAccount) throws TException, EDAMUserException, EDAMSystemException {
    // Set up the UserStore client and check that we can speak to the server
    synchronized (this) {
        EvernoteAuth evernoteAuth = new EvernoteAuth(EvernoteService.SANDBOX, evernoteAccount.getAccessToken());
        evernoteAuth.setNoteStoreUrl(evernoteAccount.getNoteStoreUrl());

        com.evernote.clients.ClientFactory factory = new com.evernote.clients.ClientFactory(evernoteAuth);

        // Set up the NoteStore client
        return new DatesAwareNoteStoreClient(factory.createNoteStoreClient());
    }
}

Tutto funziona bene, sto ottenendo il token di accesso prima, la costruzione di NoteStoreClient va con successo. Ma quando chiamo listNotebooks () ottengo un errore molto strano per me:

[INFO] [talledLocalContainer] Exception in thread "http-bio-2990-exec-11" java.lang.OutOfMemoryError: Java heap space
[INFO] [talledLocalContainer]   at com.evernote.thrift.protocol.TBinaryProtocol.readStringBody(TBinaryProtocol.java:388)
[INFO] [talledLocalContainer]   at com.evernote.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:236)
[INFO] [talledLocalContainer]   at com.evernote.edam.notestore.NoteStore$Client.recv_listNotebooks(NoteStore.java:337)
[INFO] [talledLocalContainer]   at com.evernote.edam.notestore.NoteStore$Client.listNotebooks(NoteStore.java:322)
[INFO] [talledLocalContainer]   at com.evernote.clients.NoteStoreClient.listNotebooks(NoteStoreClient.java:173)
[INFO] [talledLocalContainer]   at com.room606.jira.activenotes.evernote.EvernoteManager.listNotesByQuery(EvernoteManager.java:130)
[INFO] [talledLocalContainer]   at com.room606.jira.activenotes.evernote.EvernoteManager.listNotes(EvernoteManager.java:117)
[INFO] [talledLocalContainer]   at com.room606.jira.activenotes.action.StartReindexAction.doReindex(StartReindexAction.java:79)
[INFO] [talledLocalContainer]   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[INFO] [talledLocalContainer]   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[INFO] [talledLocalContainer]   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[INFO] [talledLocalContainer]   at java.lang.reflect.Method.invoke(Method.java:597)
[INFO] [talledLocalContainer]   at webwork.util.InjectionUtils$DefaultInjectionImpl.invoke(InjectionUtils.java:70)
[INFO] [talledLocalContainer]   at webwork.util.InjectionUtils.invoke(InjectionUtils.java:56)
[INFO] [talledLocalContainer]   at webwork.action.ActionSupport.invokeCommand(ActionSupport.java:438)
[INFO] [talledLocalContainer]   at webwork.action.ActionSupport.execute(ActionSupport.java:157)
[INFO] [talledLocalContainer]   at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:87)
[INFO] [talledLocalContainer]   at webwork.interceptor.DefaultInterceptorChain.proceed(DefaultInterceptorChain.java:39)
[INFO] [talledLocalContainer]   at webwork.interceptor.NestedInterceptorChain.proceed(NestedInterceptorChain.java:31)
[INFO] [talledLocalContainer]   at webwork.interceptor.ChainedInterceptor.intercept(ChainedInterceptor.java:16)
[INFO] [talledLocalContainer]   at webwork.interceptor.DefaultInterceptorChain.proceed(DefaultInterceptorChain.java:35)
[INFO] [talledLocalContainer]   at webwork.dispatcher.GenericDispatcher.executeAction(GenericDispatcher.java:225)
[INFO] [talledLocalContainer]   at webwork.dispatcher.GenericDispatcher.executeAction(GenericDispatcher.java:154)
[INFO] [talledLocalContainer]   at com.atlassian.jira.web.dispatcher.JiraWebworkActionDispatcher.service(JiraWebworkActionDispatcher.java:152)
[INFO] [talledLocalContainer]   at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
[INFO] [talledLocalContainer]   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
[INFO] [talledLocalContainer]   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
[INFO] [talledLocalContainer]   at com.atlassian.jira.web.filters.steps.ChainedFilterStepRunner.doFilter(ChainedFilterStepRunner.java:87)
[INFO] [talledLocalContainer]   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
[INFO] [talledLocalContainer]   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
[INFO] [talledLocalContainer]   at com.atlassian.jira.web.filters.XContentTypeOptionsNoSniffFilter.doFilter(XContentTypeOptionsNoSniffFilter.java:22)
[INFO] [talledLocalContainer]   at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31)

Ecco il mio metodo che causa l'eccezione originale da stacktrace:

private Map<Notebook, List<NoteEntry>> listNotesByQuery(String filterQuery) throws EDAMUserException, EDAMSystemException, TException, EDAMNotFoundException {
    // First, get a list of all notebooks
    List<Notebook> notebooks = datesAwareNoteStoreClient.getClient().listNotebooks();

    Map<Notebook, List<NoteEntry>> noteEntriesMap = new HashMap<Notebook, List<NoteEntry>>();
    for (Notebook notebook : notebooks) {
        System.out.println("Notebook: " + notebook.getName());
        NoteFilter filter = new NoteFilter();
        if (!StringUtils.isEmpty(filterQuery)) {
            filter.setWords(filterQuery);
        }
        filter.setNotebookGuid(notebook.getGuid());

        filter.setOrder(NoteSortOrder.CREATED.getValue());
        filter.setAscending(true);

        NoteList noteList = datesAwareNoteStoreClient.getClient().findNotes(filter, 0, 100);
        List<Note> notes = noteList.getNotes();
        noteEntriesMap.put(notebook, convertToNoteEntries(notebook.getName(), notes));
    }
    latestUpdateDate = new Date();

    return noteEntriesMap;
}

Questa riga causa un errore:

    // First, get a list of all notebooks
    List<Notebook> notebooks = datesAwareNoteStoreClient.getClient().listNotebooks();

Cosa va storto e cosa mi manca nel mio processo obtan notes? Grazie in anticipo!

Sto usando Java JDK 1.6_045, Windows 7 x64, Evernote Java API versione 2.5.1.

Author: Nikolay Chernov, 2015-06-30

2 answers

Preso! Ho focalizzato la mia attenzione sull'impostazione del metodo url:

evernoteAuth.setNoteStoreUrl(evernoteAccount.getNoteStoreUrl());

Quello che stavo impostando come nota store url era una cazzata (autorizza url, in realtà), quindi quando ho appena creato un client senza dati aggiuntivi ho avuto successo! Mi chiedo, che ho avuto qualche errore oom da come presumo lato server avvolto in errore di eccezione. Nessun picco di consumo di memoria è stato trovato da me localmente.

 1
Author: Nikolay Chernov, 2015-06-30 16:25:51

Aggiungi -XX:+HeapDumpOnOutOfMemoryError all'impostazione JVM, in modo da ottenere un dump quando si verifica questo errore. Quindi è possibile analizzare il dump con MAT (Eclipse Memory Analyzer) . Mostrerà da dove viene questo errore-quale struttura dati consuma la memoria e da dove si riferisce.

 0
Author: HamoriZ, 2015-06-30 16:18:16