Сервер Lagom: java.lang.IllegalArgumentException

Я создаю модуль в проекте lagom. В моем модуле есть только потребитель kafka для потребления сообщений и хранения событий сообщений в cassandra. Спасибо, почему в моем LagomApplicationLoader я не определяю никакой службы и инициализирую lagomServer пустым с помощью LagomServer.forServices(). Но всякий раз, когда я запускаю свое приложение, я получаю следующее исключение:

java.lang.IllegalArgumentException
    at com.lightbend.lagom.scaladsl.server.LagomServer$$anon$2.<init>(LagomServer.scala:35)
    at com.lightbend.lagom.scaladsl.server.LagomServer$.forServices(LagomServer.scala:31)
    at com.knoldus.consumer.impl.TwitterConsumerApplication.lagomServer$lzycompute(TwitterConsumerLoader.scala:33)
    at com.knoldus.consumer.impl.TwitterConsumerApplication.lagomServer(TwitterConsumerLoader.scala:33)
    at com.lightbend.lagom.scaladsl.server.LagomApplication.<init>(LagomApplicationLoader.scala:187)
    at com.knoldus.consumer.impl.TwitterConsumerApplication.<init>(TwitterConsumerLoader.scala:28)
    at com.knoldus.consumer.impl.TwitterConsumerLoader$$anon$1.<init>(TwitterConsumerLoader.scala:25)
    at com.knoldus.consumer.impl.TwitterConsumerLoader.loadDevMode(TwitterConsumerLoader.scala:25)
    at com.lightbend.lagom.scaladsl.server.LagomApplicationLoader.load(LagomApplicationLoader.scala:54)
    at play.core.server.LagomReloadableDevServerStart$$anonfun$mainDev$1$$anon$2$$anonfun$get$1$$anonfun$apply$1$$anonfun$2$$anonfun$3.apply(LagomReloadableDevServerStart.scala:151)
    at play.core.server.LagomReloadableDevServerStart$$anonfun$mainDev$1$$anon$2$$anonfun$get$1$$anonfun$apply$1$$anonfun$2$$anonfun$3.apply(LagomReloadableDevServerStart.scala:148)
    at play.utils.Threads$.withContextClassLoader(Threads.scala:21)
    at play.core.server.LagomReloadableDevServerStart$$anonfun$mainDev$1$$anon$2$$anonfun$get$1$$anonfun$apply$1$$anonfun$2.apply(LagomReloadableDevServerStart.scala:148)
    at play.core.server.LagomReloadableDevServerStart$$anonfun$mainDev$1$$anon$2$$anonfun$get$1$$anonfun$apply$1$$anonfun$2.apply(LagomReloadableDevServerStart.scala:124)
    at scala.Option.map(Option.scala:146)
    at play.core.server.LagomReloadableDevServerStart$$anonfun$mainDev$1$$anon$2$$anonfun$get$1$$anonfun$apply$1.apply(LagomReloadableDevServerStart.scala:124)
    at play.core.server.LagomReloadableDevServerStart$$anonfun$mainDev$1$$anon$2$$anonfun$get$1$$anonfun$apply$1.apply(LagomReloadableDevServerStart.scala:122)
    at scala.util.Success.flatMap(Try.scala:231)
    at play.core.server.LagomReloadableDevServerStart$$anonfun$mainDev$1$$anon$2$$anonfun$get$1.apply(LagomReloadableDevServerStart.scala:122)
    at play.core.server.LagomReloadableDevServerStart$$anonfun$mainDev$1$$anon$2$$anonfun$get$1.apply(LagomReloadableDevServerStart.scala:114)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
    at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

Мой код:

class TwitterConsumerLoader extends LagomApplicationLoader {

  override def load(context: LagomApplicationContext): LagomApplication =
    new TwitterConsumerApplication(context) {
      override def serviceLocator = NoServiceLocator
    }

  override def loadDevMode(context: LagomApplicationContext): LagomApplication =
    new TwitterConsumerApplication(context) with LagomDevModeComponents
}

abstract class TwitterConsumerApplication(context: LagomApplicationContext) extends LagomApplication(context)
  with CassandraPersistenceComponents with AhcWSComponents with LagomKafkaComponents {

  lazy val twitterService = serviceClient.implement[TwitterProducerService]

  override lazy val lagomServer = LagomServer.forServices()
  override lazy val jsonSerializerRegistry = TwitterSerializerRegistry

  persistentEntityRegistry.register(wire[TweetEntity])
  wire[TwitterProducerSubscriber]
}

Как я могу объявить пустые сервисы в lagom. Если это невозможно, то каковы другие альтернативы? Потому что может быть в будущем это может потребоваться для создания какой-то службы в этом модуле. Как я могу решить эту проблему?


person Harmeet Singh Taara    schedule 19.02.2017    source источник


Ответы (1)


Если у вас нет никаких служб для привязки, вы должны вместо этого объявить ServiceInfo.

Кроме того, для службы, которая использует только Kafka и не публикует собственные темы, необходимо только добавить LagomKafkaClientComponents вместо LagomKafkaComponents. LagomKafkaClientComponents не требует LagomServer, только ServiceInfo.

Вы можете объявить ServiceInfo для простого потребителя, который не включает в себя никаких сервисов, подобных этому:

override lazy val serviceInfo = ServiceInfo(clientName, Map.empty)

Где clientName — это уникальная идентифицирующая строка для этого проекта, которая используется для обозначения идентификатора клиента Kafka и идентификатора группы потребителей по умолчанию. В этом примере вы можете использовать "twitterConsumer".

http://www.lagomframework.com/documentation/1.3.x/scala/ServiceInfo.html содержит дополнительную информацию о ServiceInfo.

person Tim Moore    schedule 27.02.2017