2015-05-26 11 views
12

Bağlam: Bir oyun için küçük (java) çoklu işlemli sunucusunu oluşturdukVerilen yönteme erişen konuları izlemek/log/raporlamak için ek açıklama kullanan bir java aracı mı?

. En iyi uygulamaları izlemenin en iyi çabalarına rağmen, sadece bir iş parçacığından çağrılması düşünülen bazı yöntemlerin 2 veya daha fazla iş parçacığından çağrıldığı ortaya çıktı. geliştirilecek mümkün (ve nasıl) -

bir araç var mı (ya da değilse: hata ayıklama ve analiz sonrasında benim tasarım "düzeltmek" başarmış ama acaba:

soru) Eğer/izler/günlükleri gibi bu yöntemlerin erişimi sayar @SingleThread veya @ThreadCount(2) veya @ThreadNameLike("my_fancy_thread_group*") gibi ek açıklamalarla bazı yöntemler işaretlemek için izin verdiğini:

  • @SingleThread - bu yöntem her zaman yalnızca
  • iplik tarafından erişilen ise çeklerin
  • @ThreadCount(2) - iki iş parçacığı tam
  • @ThreadNameLike erişilir - adı deseni (ler) eşleşen dişli üzerinden sadece erişilir

fikri programının TEST çalışma yapmak ve en elde etmektir En azından not eklenmiş durum kaydı ihlal edildi.

Muhtemelen AspectJ'in işi bir noktaya kadar genişletebileceğini düşünüyordum ama sonra Dagger/Dagger2'ye benzer bir yaklaşımın daha iyi olacağını, yani sunucunuzu test etmek istediğinizde açmanız gerektiğini anladım. bir ek açıklama işlemcisini (varsayımsal olarak "SafetyFirst" olarak adlandırırız) bu, izleme kodunu içeren adaptör (sarmalayıcı?) sınıfları üretecektir. Ardından sunucuyu çalıştıracak, bazı yük testleri gerçekleştirecek ve daha sonra ihlalleri (veya ideal bir dünyada - bir rapor dosyası) için günlükleri kontrol edeceksiniz.

ben tam böyle bir araç fark:

  • tüm potansiyel vakaların% 100 kapsama vermez;
  • incelenen programı

yavaşlatacaktır ama en azından açıkça amaçlanan tasarım ihlalleri reklamını yapacak bir erken uyarı sistemi olarak hizmet verebilir/maske tetik heisenbugs olacaktır.

+1

java -javaagent:C:/aspectj1.8/lib/aspectjweaver.jar -cp aspectj/profile_ft.jar;test test.Test1 Tam olarak gereksinimlere cevap. Ama log4j ThreadIDs/İsimler çıktı verebilir ... Ben bir DB-Appender kullanarak belirli bir yöntemi çağıran Konular ile ilgili bir test çalışmasının log-tablosunu analiz edebileceğini hayal edebiliyorum. – Fildor

+0

@Foror Yorumunuz için teşekkür ederiz. Şu anda benzer bir çözüm kullanıyorum, ancak izlenmesi gereken tüm yöntemlerde el ile günlük ifadeleri eklemesi gerekiyor. – Ognyan

+1

Araç istekleri konu dışı. – Raedwald

cevap

5

Paketimdeki tüm işlev çağrılarının istenilen şekilde yazdırılması için AspectJ yükleme süresi dokumasıyla benzer bir test kullandım.

En iyi yükleme süresine sahip olmanın yolu, sınıflarınızı derleme zamanı gibi kirletmez. Çalıştır komutunuzdan -javaagent:<path to aspectj lib> ve özel astpect lib sınıf yolu girdinizi kaldırdığınızda. Sonra hepsi gitti, anlaşıldı.

Bazı değişiklikler yaptım ve sorduğunuz @ThreadCount işlevselliğini kapsayan bir sınama gerçekleştirdim. AspectJ'i indirip yüklemeniz gerekiyor.

bakınız kod parçalarını: Derleme

aspect Profile { 

    private static Map<String, AtomicInteger> counterMap = new HashMap<String, AtomicInteger>(); 

    pointcut threadCountPc(test.ThreadCount tc) : execution(* test..*(..)) && @annotation(tc); 

    Object around(test.ThreadCount tc) : threadCountPc(tc) {   

     String signature = thisJoinPointStaticPart.getSignature().toString(); 

     AtomicInteger counter = getCounter(signature); 
     int currentValue = counter.incrementAndGet(); 

     if (currentValue >= tc.value()){ 
      System.out.println("[Thread Name:" + Thread.currentThread().getName() + 
      "] Method Name:" + signature + ", threadCount:" + currentValue + " exceeds " + tc.value()); 
     } 

     try{ 
      return proceed(tc); 
     }finally{ 
      counter.decrementAndGet();   
     } 
    } 

    private static AtomicInteger getCounter(String methodName){ 
     AtomicInteger value = counterMap.get(methodName); 
     if (value == null){ 
      synchronized (counterMap){ 
       value = counterMap.get(methodName); 
       if (value == null){ 
        value = new AtomicInteger(0); 
        counterMap.put(methodName, value); 
       } 
      } 
     } 
     return value; 
    } 
} 

: "C:/aspectj1.8/bin/ajc.bat" profile_ft.aj -cp C:/aspectj1.8/lib/aspectjrt.jar;../test/. -1.6 -outxml -outjar profile_ft.jar

Koşu:

İlgili konular