使用Akka系统的AspectJ



仅供参考,此问题继续为以下问题命名:使用AspectJ和Scala 时出错

我正在尝试将AspectJ与Scala一起使用,特别是与Akka actor系统一起使用。

我一直在制作这种类型的切入点:

@Around(""execution (* akka.actor.ActorRef.!(..)) " + "&& args(message, sender)", argNames = "(message, sender)")")
def printSample() {
println("receive message ")
}

然而,出现了一个错误:

Invalid pointcut '"execution (* akka.actor.ActorRef.!(..)) " + "&& args(message, sender)", argNames = "(message, sender)")': org.aspectj.weaver.
patterns.ParserException: identifier at position 0
[error] org.aspectj.bridge.AbortException: AspectJ failed

您的切入点可能是一个副本&粘贴错误,你引用了它:

@Around(""execution (* akka.actor.ActorRef.!(..)) " + "&& args(message, sender)", argNames = "(message, sender)")")

如果你修复它以读取

@Around(
"execution (* akka.actor.ActorRef.!(..)) && args(message, sender)",
argNames = "(message, sender)"
)

然后您就有了可能要使用的两个注释参数。但ActorRef.!(..)!看起来仍然很奇怪,你可能是指*。如果advice方法中的参数名称与args()中使用的参数名称相同,则也可以完全省略该部分并避免样板:

@Around("execution(* akka.actor.ActorRef.*(..)) && args(message, sender)")

这样就可以了。

一句话:你的问题是关于基本的Java注释和AspectJ的使用,而不是关于Scala或Akka或你认为的任何问题。

最新更新