2016-05-13 18 views
12

Nel mio progetto domestico ho un lavoro di lunga durata, voglio mostrare lo stato all'utente sul processo e fino a che punto è andato. Quindi sto spingendo gli oggetti status su topic JMS da lì sto raccogliendo e alimentando l'app WS per inviarli a un client valido. Ho scritto dei tagli ai punti in primavera AOP (ovvero @Before, @AfterReturn) e ho chiamato il mio servizio per inviare il messaggio all'argomento. Ora voglio registrare lo stato del servizio non sul metodo di avvio o dopo il ritorno all'interno del metodo anche. Così ho chiamato il servizio (che ha iniettato jmsTamplete e ha preso l'oggetto status). C'è un modo per minimizzare queste chiamate in modo che non possa ripetere le chiamate di servizio. ecco il mio codice sudo.Quanto è efficiente Spring AOP in caso di consumo di memoria

public class Myservice{ 

UserDao userDao; 
LegService legservice; 
ProviderDao providerDao; 
.... 
StatusServive statusServie; 

//aop will call the same service to send info to JMS topic 
fetchandCalculateLeg(){ 
    // here i called statusServie.senStatus(StatusObject); 
    List<Users> = userDao.fetchUserInfo(); 
    // here i called statusServie.senStatus(StatusObject); 
    .... 
    loop: #forEachUser 
    // here i called statusServie.senStatus(StatusObject); 
    someList = legservice.fecthLegInfoForEachUser(); 
    // here i called statusServie.senStatus(StatusObject); 
    :endloop; 
    .... 
} } 

Attualmente ho 3 attività a esecuzione lunga e sto chiamando lo stesso in ogni classe di metodo. Voglio ridurre al minimo le chiamate.

EDIT1: Posso applicare AOP anche sui metodi di chiamata, ma quali sono le prestazioni in questo caso? Come misurare le prestazioni AOP (quanta memoria ha consumato durante l'applicazione Up o per creare oggetti proxy). Ci scusiamo per aver fatto così tante domande.

+3

Il titolo della domanda non sembra riflettersi nella domanda. – bhspencer

risposta

4

Se si utilizza AOP, le prestazioni saranno migliori di questo poiché è ben collaudato e ottimizzato per eseguire tali operazioni. Ad ogni modo è possibile verificare sottraendo l'ora di inizio e di fine.

È possibile utilizzare il codice corrente e il codice implementato AOP per verificare le prestazioni. Sarebbe un lavoro molto interessante. Fai qualcosa come di seguito per impostare l'ora di inizio e di fine e sottrarre.

System.currentTimeMillis() 

Sopra la sintassi, restituisce l'ora corrente in millisecondi. Si noti che mentre l'unità di tempo del valore di ritorno è un millisecondo, la granularità del valore dipende dal sistema operativo sottostante e potrebbe essere maggiore. Ad esempio, molti sistemi operativi misurano il tempo in unità di decine di millisecondi. Vedere la descrizione della classe Data per una discussione sulle lievi discrepanze che possono insorgere tra "tempo del computer" e ora universale coordinata (UTC).

Sono disponibili molti framework AOP Opensource.

  1. Spring AOP: AOP con Spring Framework. Annunci. Uno dei componenti chiave di Spring Framework è il framework di programmazione orientata agli aspetti (AOP). La programmazione orientata all'aspetto comporta l'abbattimento della logica del programma in parti distinte chiamate cosiddette preoccupazioni.

  2. AspectJ: AspectJ è un'estensione orientata all'aspetto del linguaggio di programmazione Java, compatibile con la piattaforma Java e facile da imparare e utilizzare. AspectJ consente la completa modularizzazione dei problemi trasversali quali: controllo e gestione degli errori, sincronizzazione, comportamento sensibile al contesto, ottimizzazione delle prestazioni, monitoraggio e registrazione, supporto per il debug, protocolli multi-oggetto.

  3. AspectWerkz: AspectWerkz è un framework AOP dinamico, leggero e ad alte prestazioni per Java. AspectWerkz offre potenza e semplicità e ti aiuterà a integrare facilmente AOP in progetti nuovi ed esistenti. AspectWerkz utilizza la modifica bytecode di runtime per tessere le tue classi in fase di runtime. Si aggancia e tesse le classi caricate da qualsiasi programma di caricamento classe tranne il caricatore di classe bootstrap. Ha un modello di punto di congiunzione ricco e altamente ortogonale. Aspetti, consigli e introduzioni sono scritti in Java semplice e le vostre classi target possono essere POJO regolari.Hai la possibilità di aggiungere, rimuovere e riformulare i consigli e scambiare l'implementazione delle tue introduzioni in fase di esecuzione. I tuoi aspetti possono essere definiti utilizzando un file di definizione XML o utilizzando gli attributi di runtime.

EDIT 1

Primavera supporta anche AspectJ. L'ho provato con AspectJ 1.7.2 non mostra perdite di memoria. Tu, puoi replicare lo stesso nella tua applicazione creando un sacco di bean e poi scaricando l'heap dopo un po 'di tempo dato che la garbage collection richiede un po' di tempo in cui non è istantanea.

Come per il mio test. Le prestazioni sono decenti con un numero enorme di chiamate.

semplice esempio è Disponibile in MKYong: http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/

NOTA: È necessario modificare le prestazioni domanda viene misurato il tempo e lo spazio. E, come per il tuo commento, sembra che tu stia chiedendo di più sull'ottimizzazione della memoria o sulla gestione. Inoltre, l'argomento della tua domanda è diverso dalla domanda.

+0

@Praiyush Grazie per la risposta il mio problema non è nel tempo (anche se è la mia preoccupazione minore per ora), guardo particolarmente al consumo di memoria e all'heap come menzionato qui [link] (https://jira.spring.io/ browse/SPR-11999) per fortuna hanno risolto 4.2. Quindi, in questo modo, ci sono delle preoccupazioni a cui nessuno è a conoscenza. Sto anche cercando su google per saperne di più sui diversi tipi di situazione che gli sviluppatori affrontano (non tutti, cercando solo quello che si adatta alla mia situazione). Quindi puoi modificare la tua risposta se hai ulteriori informazioni su questo. Grazie ancora. – mallikarjun

+0

Grazie proveremo a condividere il risultato del test della perdita di memoria. – mallikarjun

2

Quello che chiedi non è chiaro, il titolo della domanda è fuorviante.

È davvero possibile utilizzare Spring Aop per l'attività che si desidera eseguire, è sufficiente iniettare con le chiamate di registro i metodi fetchUserInfo() e fecthLegInfoForEachUser() e simili. Puoi anche usare @Around per avere un controllo migliore.

Per quanto riguarda le prestazioni, dato che questa parte di codice è molto limitata, è possibile eseguire facilmente la profilatura con & senza alcun problema. Tenere presente che AOP per la registrazione è molto utilizzato e Spring crea oggetti proxy per molte entità e scopi, come le fabbriche, quindi è ben testato e performante.

+1

se non capisci la domanda dica così in un commento non in una risposta. – bhspencer

+0

Scusa, hai ragione ma non mi è stato permesso di commentare al momento della pubblicazione. – Maxvader

1

(1) attività in esecuzione lungo significa 'posti di lavoro', quindi potrebbe essere necessario: Quartz

(2) Se il vostro vogliono solo sapere dove il vostro programma va a, potrebbe essere necessario uno strumento di registrazione come: Logback. Un appender ben definito risolverà il tuo problema.

+0

Le risposte SO non servono per consigliare strumenti o librerie. – bhspencer

3

Se si dispone di un lavoro di lunga durata, perché non lo si inserisce in un runtime di Spring Batch? Implementa lettore personalizzato -> processore -> scrittore e il sistema farà tutto per te. E per mostrare i dettagli di tali esecuzioni di lavoro, ho creato tale DTO https://gist.github.com/idyoshin/b035317db8c61b1b49ccb8898848171e e il collettore https://gist.github.com/idyoshin/74ad80841a51e1be62208f3fd58eeb6a. Queste utilità, sono un aggiramento, perché non volevo incorporare l'applicazione di amministrazione spring-batch nella mia app principale. Li uso per mostrare i dettagli di esecuzione attiva/di archivio di specifici lavori (in base ai nomi) del mio sistema.

Anche utilizzando tali programmi di utilità è possibile implementare un programma di raccolta dati basato su timer personalizzato, che sposterà questi dati su JMS o Websocket. Spring-batch ha anche dei simpatici ascoltatori, che puoi implementare, ad esempio il numero org.springframework.batch.core.ChunkListener ti permetterà di fare "progressi-barra" come aggiornamenti - saprai il momento in cui il tuo chunk è stato elaborato, e quindi l'aggiornamento sui progressi è apparso.

In contrasto con la soluzione AOP iniziale, l'approccio con il batch di Spring sarà in avanti, (puro codice Java), e risolverà anche il problema aggiuntivo: transazioni di aggiornamenti di lunga durata: taglierà l'intero set di dati in blocchi e processare ogni blocco in una singola transazione.