2016-03-14 12 views
6

Tôi đang sử dụng Spring 3.2.9, Tomcat 6.0.44làm thế nào để thiết lập thời gian nạp dệt với mùa xuân và Tomcat KHÔNG sử dụng -javaagent trên dòng lệnh

Tôi cố gắng để cấu hình nhà cung cấp thiết bị đo đạc mùa xuân ứng dụng của tôi (ví dụ: spring-instrumentation.jar) để tải thời gian dệt, khi nó được triển khai trên Tomcat.

Tôi có yêu cầu KHÔNG sử dụng: "-javaagent: /path/path/spring-instrument.jar" trên dòng lệnh để thực hiện cấu hình.

Tôi đã đọc rằng tôi có thể định cấu hình thiết bị lò xo bằng cách sửa đổi phần tử < Ngữ cảnh > của cấu hình Tomcat của ứng dụng của tôi (trong tệp server.xml của Tomcat hoặc tệp context.xml của ứng dụng web của tôi). Thêm phần tử < ngữ cảnh > ngữ cảnh vào kết quả server.xml trong ứng dụng của tôi được cấu hình đúng để chạy với nhà cung cấp thiết bị đo đạc của Spring. Thêm nó vào context.xml (xem bên dưới) KHÔNG dẫn đến thiết lập làm việc.

Tôi có một tập tin/aop.xml META-INF, trông như thế này:

<aspectj> 
     <weaver options="-verbose -showWeaveInfo -debug"> 
      <include within="com.mv.xx.services..*"/> 
      <exclude within="com.mv.xx.aop..*"/> 
     </weaver> 
     <aspects> 
      <aspect name="com.mv.xx.aop.MyAspect"/> 
     </aspects> 
    </aspectj> 

tôi cũng xác định rằng tôi muốn sử dụng thời gian nạp dệt bằng cách thêm này để bối cảnh cấu hình mùa xuân của tôi:

<context:load-time-weaver /> 

Và tôi thêm jar này để classpath ứng dụng của tôi: mùa xuân-instrument-tomcat.jar

GÌ tôi đã thử:

Khi bắt đầu Tomcat, Nếu tôi xác định vị trí của lò xo-instrument.jar trên dòng lệnh bằng cách sử dụng tham số -javaagent như thế này:

-javaagent:/path/path2/spring-instrument-3.2.9.RELEASE.jar 

Tất cả mọi thứ hoạt động tốt.


Tiếp theo, tôi đã xóa "-javaagent: /path/path2/spring-instrument-3.2.9.RELEASE.jar" khỏi dòng lệnh. Trong file server.xml Tomcat (nằm trong $ CATALINE_HOME/conf), tôi đã thêm một một > yếu tố < Bối cảnh tới phần tử < chủ >, như thế này:

<Context path="/myApp" docBase="myApp"> 
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/> 
</Context> 

Với cấu hình này mọi cư xử đúng cách. Tuy nhiên tôi có một yêu cầu không sửa đổi server.xml của Tomcat, vì tôi không có quyền kiểm soát đối với server.xml (DevOps làm, và không muốn sửa đổi nó).


Tiếp theo tôi loại bỏ các <Context> phần tử từ server.xml Tomcat. Theo số Spring docs, tôi có thể thêm /META-INF/context.xml vào ứng dụng web của mình và đặt thành phần < Ngữ cảnh > được sử dụng trong tệp server.xml của Tomcat vào ngữ cảnh.xml, như vậy:

 <Context> 
      <Context path="/myApp" docBase="myApp"> 
       <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/> 
      </Context> 
     </Context> 

Tuy nhiên khi tôi khởi động lại Tomcat, tôi nhận được một thông báo lỗi trong các bản ghi nói:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.weaving.AspectJWeavingEnabler#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver': Initialization of bean failed; nested exception is java.lang.IllegalStateException: ClassLoader [org.apache.catalina.loader.WebappClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar 

Sau khi đào bới xung quanh, tôi đọc một cái gì đó gợi ý rằng tôi sửa đổi các yếu tố <context:load-time-weaver/> trong cấu hình Spring của tôi, như sau:

 <context:load-time-weaver weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 

Và thêm jar chứa InstrumentationLoadTimeWeaver.class vào classpath của tôi.

Tuy nhiên khi tôi làm điều đó, tôi nhận được thông báo lỗi này trong các bản ghi:

 SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
     java.lang.IllegalStateException: Must start with Java agent to use InstrumentationLoadTimeWeaver. See Spring documentation. 
    etc.... 

bất cứ ai có thể giải thích làm thế nào để thiết lập thời gian nạp dệt với mùa xuân và Tomcat KHÔNG sử dụng -javaagent trên dòng lệnh, và KHÔNG sửa đổi tệp server.xml?

+0

Cùng một vấn đề! Bất kì giải pháp nào? – HVT7

Trả lời

0

Đây là mã mà tôi đã quản lý để sử dụng để loại bỏ ngoại lệ mà bạn đã đề cập. Về cơ bản, bạn phải triển khai LoadTimeWeavingConfigurer và ghi đè phương thức getLoadTimeWeaver().

@Configuration 
@ComponentScan(basePackages = "org.myproject") 
@EnableAspectJAutoProxy 
@EnableSpringConfigured 
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.AUTODETECT) 
public class Config implements LoadTimeWeavingConfigurer { 

    @Override 
    public LoadTimeWeaver getLoadTimeWeaver() { 
     return new ReflectiveLoadTimeWeaver(); 
    } 

    @Bean 
    public InstrumentationLoadTimeWeaver loadTimeWeaver() throws Throwable { 
     InstrumentationLoadTimeWeaver loadTimeWeaver = new InstrumentationLoadTimeWeaver(); 
     return loadTimeWeaver; 
    } 

} 
+0

Điều này có thể được thực hiện từ cấu hình dựa trên xml không? – Ryan

+0

@Ryan Tôi có thể đạt được điều tương tự trong cấu hình xml. Hãy xem tài liệu mùa xuân - http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/EnableLoadTimeWeaving.html Điều này có thể hữu ích. Cảm ơn – Gui

+0

Cảm ơn bạn đã liên kết. Điều đó có vẻ chi tiết hơn những gì tôi đã tìm thấy. Nó đã không làm việc trên nỗ lực đầu tiên của tôi nhưng tốt đẹp để nghe rằng nó có thể. – Ryan

-1
https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving/Static_Weaving 

Hãy thử maven plug-in từ liên kết ở trên. Nó hoạt động

+0

Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (// meta.stackoverflow.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. –

0

Tôi đã sử dụng invesdwin-instrument để thực hiện điều đó. Nó cho phép bạn sử dụng thiết bị đo thời gian tải động để bạn không phải sử dụng bất kỳ javaagent nào.

Tôi đã mất một chút nỗ lực để làm cho nó hoạt động với Tomcat 8.5 mặc dù. Nhưng cuối cùng nó hoạt động bằng cấu hình này với Spring Boot:

@SpringBootApplication 
@EnableLoadTimeWeaving // instead of @ImportResource(locations = "classpath:/META-INF/ctx.spring.weaving.xml") 
public class MySpringBootApplication { 
    public static void main(final String[] args) { 
     DynamicInstrumentationLoader.waitForInitialized(); //dynamically attach java agent to jvm if not already present 
     DynamicInstrumentationLoader.initLoadTimeWeavingContext(); //weave all classes before they are loaded as beans 
     SpringApplication.run(MySpringBootApplication.class, args); //start application, load some classes 
    } 
} 

Nó cũng sẽ hoạt động với phiên bản trước của Tomcat.

Kính trọng

Các vấn đề liên quan