java - 漏洞?无法加载配置中指定的记录器[akka.testkit.TestEventListener]?

标签 java maven akka

根据docs ,在(预期日志消息)下,

Be sure to exchange the default logger with the TestEventListener in your application.conf to enable this function: akka.loggers = [akka.testkit.TestEventListener]

所以,当我将其放入application.conf中时效果很好。我的测试效果很好

@Test
public void testActorForNonExistentLocation() throws Exception {
  final Map<String, String> configValues = Collections.singletonMap("tenant.assetsLocation",
                                                                    "/non/existentLocation");
  final Config config = mergeConfig(configValues);
  System.out.println(config.getList("akka.loggers"));

  new JavaTestKit(system) {{
    assertEquals("system", system.name());

    final Props props = TenantMonitorActor.props(config);
    final ActorRef supervisor = system.actorOf(props, "supervisor");
    new EventFilter<Void>(DiskException.class) {

      @Override
      protected Void run() {
        supervisor.tell(new TenantMonitorMessage(), supervisor);
        return null;
      }
    }.from("akka://system/user/supervisor/diskMonitor").occurrences(1).exec();

  }};
}

现在当我尝试运行我的应用程序

public class Main {
  private Main() {
  }

  public static void main(final String[] args) {
    final Config config = ConfigFactory.load();
    final ActorSystem actorSystem = ActorSystem.create(config.getString("ec.name"));
    setUpMonitoring(actorSystem, config);
  }

  private static void setUpMonitoring(final ActorSystem system, final Config config) {
    final ActorRef tenantMonitorRef = system.actorOf(TenantMonitorActor.props(config),
                                                     "tenantMonitor");
    tenantMonitorRef.tell(new TenantMonitorMessage(), tenantMonitorRef);
  }
}

我看到错误为

error while starting up loggers
akka.ConfigurationException: Logger specified in config can't be loaded [akka.testkit.TestEventListener] due to [java.lang.ClassNotFoundException: akka.testkit.TestEventListener]
    at akka.event.LoggingBus$$anonfun$4$$anonfun$apply$1.applyOrElse(Logging.scala:116)
    at akka.event.LoggingBus$$anonfun$4$$anonfun$apply$1.applyOrElse(Logging.scala:115)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
    at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:215)
    at scala.util.Try$.apply(Try.scala:191)
    at scala.util.Failure.recover(Try.scala:215)
    at akka.event.LoggingBus$$anonfun$4.apply(Logging.scala:115)
    at akka.event.LoggingBus$$anonfun$4.apply(Logging.scala:110)
    at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:728)
    at scala.collection.Iterator$class.foreach(Iterator.scala:750)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:727)
    at akka.event.LoggingBus$class.startDefaultLoggers(Logging.scala:110)
    at akka.event.EventStream.startDefaultLoggers(EventStream.scala:26)
    at akka.actor.LocalActorRefProvider.init(ActorRefProvider.scala:622)
    at akka.actor.ActorSystemImpl.liftedTree2$1(ActorSystem.scala:619)
    at akka.actor.ActorSystemImpl._start$lzycompute(ActorSystem.scala:616)
    at akka.actor.ActorSystemImpl._start(ActorSystem.scala:616)
    at akka.actor.ActorSystemImpl.start(ActorSystem.scala:633)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:142)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:109)
    at akka.actor.ActorSystem$.create(ActorSystem.scala:57)
    at akka.actor.ActorSystem.create(ActorSystem.scala)
    at Main.main(Main.java:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.ClassNotFoundException: akka.testkit.TestEventListener
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:67)
    at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(DynamicAccess.scala:66)
    at scala.util.Try$.apply(Try.scala:191)
    at akka.actor.ReflectiveDynamicAccess.getClassFor(DynamicAccess.scala:66)
    at akka.event.LoggingBus$$anonfun$4.apply(Logging.scala:113)
    ... 24 more
Exception in thread "main" akka.ConfigurationException: Could not start logger due to [akka.ConfigurationException: Logger specified in config can't be loaded [akka.testkit.TestEventListener] due to [java.lang.ClassNotFoundException: akka.testkit.TestEventListener]]
    at akka.event.LoggingBus$class.startDefaultLoggers(Logging.scala:144)
    at akka.event.EventStream.startDefaultLoggers(EventStream.scala:26)
    at akka.actor.LocalActorRefProvider.init(ActorRefProvider.scala:622)
    at akka.actor.ActorSystemImpl.liftedTree2$1(ActorSystem.scala:619)
    at akka.actor.ActorSystemImpl._start$lzycompute(ActorSystem.scala:616)
    at akka.actor.ActorSystemImpl._start(ActorSystem.scala:616)
    at akka.actor.ActorSystemImpl.start(ActorSystem.scala:633)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:142)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:109)
    at akka.actor.ActorSystem$.create(ActorSystem.scala:57)
    at akka.actor.ActorSystem.create(ActorSystem.scala)
    at Main.main(Main.java:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

我的application.conf看起来像

akka {
  event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
  loglevel = "INFO"
  loggers = [akka.testkit.TestEventListener]
}

ec {
  name = "Connector"
}

tenant {
  assetsLocation: /Users
}

monitoring {
  tenant.disk.schedule.seconds: 2
  tenant.disk.threshold.percent: 80
}

我也安装了依赖项

<dependencies>
  <dependency>
    <groupId>com.typesafe.akka</groupId>
    <artifactId>akka-actor_2.11</artifactId>
    <version>${akka-actor_2.11.version}</version>
  </dependency>
  <dependency>
    <groupId>com.typesafe.akka</groupId>
    <artifactId>akka-testkit_2.11</artifactId>
    <version>${akka-testkit_2.11.version}</version>
  </dependency>
</dependencies>

以及版本

<akka-actor_2.11.version>2.3.9</akka-actor_2.11.version>
<akka-testkit_2.11.version>2.3.10</akka-testkit_2.11.version>

错误/不一致在哪里?

可能根本不是一个错误和理解上的差异。

我们使用maven scopes决定哪些依赖项应该可用以及何时可用。通常在测试中,我们使用 <scope>test</scope>使依赖项仅在测试中可用,而不是在捆绑时的最终应用程序 jar 中可用。

现在,如果我们使用这种测试(期望日志消息),我们需要删除 <scope>test</scope>让应用程序正确运行并同时通过测试。这意味着最终的 jar 中也需要存在依赖项 akka-testkit,因为 application.conf 需要它来加载 akka.testkit.TestEventListener

如果一切听起来正确,则将生产代码和测试代码结合在一起,并且是当前设置所必需的。

同样,我可能在这里错过了一些非常基本的东西,但我运行应用程序并让测试通过的唯一方法是组合依赖项 akka-actorakka-testkit together

你有什么想法?

最佳答案

在测试资源中添加 application.conf:

src/test/resources/application.conf

内容可能如下所示:

include "../../main/resources/application"

akka.loggers = [akka.testkit.TestEventListener]

此 application.conf 仅在测试期间加载,因此您可以将 akka-testkit 依赖项范围限制为仅测试。

关于java - 漏洞?无法加载配置中指定的记录器[akka.testkit.TestEventListener]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30015989/

相关文章:

java - 可以生成多少个唯一 ID

google-app-engine - PlayN骨架项目html模块在maven中找不到核心模块?

Maven - 将 Artifact 安装到 Nexus 存储库

java - 我还可以在 android 项目中使用 eclipse 吗?

scala - Oracle Slick 驱动程序支持流吗?

actor - 如何确定在 akka 中产生的 Actor 数量?

java - 如何向 ShardRegion 中的所有 Actor 发送消息

java - Glassfish : sun-web. xml 缺失

java - 基于网络浏览器的 GUI

java - 是否可以更改 Java 中垃圾收集器的频率?