Search code examples
javaaspectjhystrixnetflix

HystrixCommandAspect Resulting into NoSuchMethodError in plain Java application


I am trying to use Hystrix in my Java Application, its a Non spring java application.

Used following Maven Dependencies in POM to enable Hystrix commands :

  <dependency>
      <groupId>com.netflix.hystrix</groupId>
      <artifactId>hystrix-javanica</artifactId>
      <version>1.5.8</version>
    </dependency>

    <dependency>
      <groupId>com.netflix.hystrix</groupId>
      <artifactId>hystrix-core</artifactId>
      <version>1.5.12</version>
    </dependency>

    <dependency>
      <groupId>com.netflix.rxjava</groupId>
      <artifactId>rxjava-core</artifactId>
      <version>0.20.7</version>
    </dependency>

Used following Dependencies to enable AspectJ :

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.8.7</version>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.7</version>
</dependency>

Created a aop.xml in META-INF with following configuration :

<aspectj>

  <aspects>
    <aspect name="com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect" />
  </aspects>

  <weaver options="-verbose">
    <include within="*" />
  </weaver>
</aspectj>

Used Hystrix Command in my Service Class :

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;

@Component
@Service
public class TestHystrix 

    @HystrixCommand(commandKey = "testHystrix", threadPoolKey = "testHystrix", commandProperties = {
            @HystrixProperty(name = "hystrix.command.testHystrix.execution.isolation.thread.timeoutInMilliseconds", value = "30") }, threadPoolProperties = {
                    @HystrixProperty(name = "hystrix.threadpool.testHystrix.maximumSize", value = "3") })
public void  testHystrix() {

Added following JVM Argument :

-DWeavingMode=compile

But at both Junit testing and application Runtime, its resulting into following error :

java.lang.NoSuchMethodError: com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect.aspectOf()Lcom/netflix/hystrix/contrib/javanica/aop/aspectj/HystrixCommandAspect;

Please help.


Solution

  • I was able to fix the issue by using following AspectJ Plugin configuration along with above maven dependencies :

     <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.7</version>
            <configuration>
              <complianceLevel>1.8</complianceLevel>
              <source>1.8</source>
              <target>1.8</target>
             <!--  <showWeaveInfo>true</showWeaveInfo>
              <verbose>true</verbose>-->
              <Xlint>ignore</Xlint> 
              <encoding>UTF-8 </encoding>
              <!-- Provide the Source information.  -->          
              <!-- <aspectLibraries>
                <aspectLibrary>
                  <groupId>com.netflix.hystrix</groupId>
                  <artifactId>hystrix-javanica</artifactId>
                </aspectLibrary>
              </aspectLibraries> -->
              <!--Weaving already compiled JAR artifacts  -->
              <weaveDependencies>
                <weaveDependency>
                  <groupId>com.netflix.hystrix</groupId>
                  <artifactId>hystrix-javanica</artifactId>
                </weaveDependency>
              </weaveDependencies>
            </configuration>
            <executions>
              <execution>
                <goals>
                  <!-- use this goal to weave all your main classes -->
                  <goal>compile</goal>
                  <!-- use this goal to weave all your test classes -->
                  <goal>test-compile</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    

    This plugin will enable Post Compile weaving, for more details refer a very good article @ http://www.baeldung.com/aspectj https://www.mojohaus.org/aspectj-maven-plugin/examples/weaveJars.html With this plugin, aop.xml and -DWeavingMode=compile are also not required