Как использовать фильтр с сервисом в системе Finagle RPC?

Я изучаю асинхронную систему RPC в Твиттере, и мне важно использовать фильтр и сервис для логической задачи. Я прочитал статью https://twitter.github.io/finagle/guide/ServicesAndFilters.html и попробуйте написать простой код, чтобы он стал правдой, я знаю. Но есть проблема:

import com.twitter.util.Future

trait Service[Req, Rep] extends (Req => Future[Rep])

abstract class Filter[-ReqIn, +RepOut, +ReqOut, -RepIn]
  extends ((ReqIn, Service[ReqOut, RepIn]) => Future[RepOut])

trait SimpleFilter[Req, Rep] extends Filter[Req, Rep, Req, Rep]

class DoubleFilter(times: Int) extends SimpleFilter[(Int,Int), Int] {
  def apply(request: (Int,Int), service: Service[(Int,Int), Int]): Future[Int] = {
    service((request._1 * times, request._2 * times))
  }
}

class AddFilter(count: Int) extends SimpleFilter[(Int, Int), Int] {
  def apply(request: (Int, Int), service: Service[(Int, Int),Int]): Future[Int] = {
    service((request._1 + count, request._2 + count))
  }
}

object Test extends App {
  val doubleFilter = new DoubleFilter(2)
  val addFilter = new AddFilter(10)

  //req is tuple, rep is added count of int
  val addELemsService = new Service[(Int,Int), Int] {
    def apply(req: (Int,Int)) = {
      Future {
        req._1 + req._2
      }
    }
  }

  val serviceWithDoble = doubleFilter andThen addELemsService

  val doubleWithAddFilter = doubleFilter andThen addFilter
}

Результат с двумя ошибками компиляции: value andThen не является членом DoubleFilter!
Что я не понимаю? Я прямо думаю, что док что-то игнорирует, но я ввожу в заблуждение.


person LoranceChen    schedule 29.12.2015    source источник
comment
Здесь следует использовать com.twitter.finagle.Filter.andThen, а не scala's andThen, я добавлю объяснение позже. Я вижу исходный код (я свежий и маленькие уроки)   -  person LoranceChen    schedule 05.01.2016


Ответы (1)


Я думаю, что вы импортируете неправильный признак / класс. Я попытался скомпилировать следующий код с правильным импортом, и он скомпилировался без ошибок.

import com.twitter.finagle.{Service, Filter}
import com.twitter.util.Future


object Test extends App {

  trait SimpleFilter[Req, Rep] extends Filter[Req, Rep, Req, Rep]

  class DoubleFilter(times: Int) extends SimpleFilter[(Int, Int), Int] {
    def apply(request: (Int, Int), service: Service[(Int, Int), Int]): Future[Int] = {
      service((request._1 * times, request._2 * times))
    }
  }

  class AddFilter(count: Int) extends SimpleFilter[(Int, Int), Int] {
    def apply(request: (Int, Int), service: Service[(Int, Int), Int]): Future[Int] = {
      service((request._1 + count, request._2 + count))
    }
  }

  val doubleFilter = new DoubleFilter(2)
  val addFilter = new AddFilter(10)
  //req is tuple, rep is added count of int
  val addELemsService = new Service[(Int, Int), Int] {
    def apply(req: (Int, Int)) = {
      Future {
        req._1 + req._2
      }
    }
  }
  val serviceWithDoble = doubleFilter andThen addELemsService
  val doubleWithAddFilter = doubleFilter andThen addFilter

}
person M Kumar    schedule 06.04.2016
comment
Да!! Я ничего не импортирую, простое определение типа Filter и Service не может работать. - person LoranceChen; 08.04.2016