まず、私は比較的新しいスカラーです。スカラパターンのマッチングは常にデフォルトのケースになります
コンソールに結果を記録する次の単純なクラスNullLogServiceを考えてみましょう。
package services
import akka.actor._
import com.amazonaws.services.simpleemail.model.SendRawEmailResult
import model.Email
import scala.util.Try
object NullLogService {
case class Log(email: Email, amazonResult: Try[_])
case class LogError(email: Email, amazonException: Try[_])
}
class NullLogService extends Actor {
import NullLogService._
def receive = {
case Log(email, amazonResult) => println("Email to: " + email.to + ". AmazonResultSucess:" + amazonResult.isSuccess.toString + ". AmazonResult: " + amazonResult.get.toString)
case LogError(email, amazonException) => println("Error: Email to: " + email.to + ". AmazonException:" + amazonException.get.toString)
case [email protected]_ => println("Default case: "+default.toString)
}
}
常にDefault case: Log(TO:[email protected],Success({MessageId: Fake_Sent_OK}))
を出力します。
タイプが同じであるため、何が起こっているのかわかりません(Log(Email、Try(_)))!それは "ログ"ケースに移動する必要がありますが、常にデフォルトのケースになります!
私を狂わせる。
import java.io.File
import java.util.concurrent.TimeUnit
import akka.actor.SupervisorStrategy.Resume
import akka.actor._
import akka.routing.RoundRobinPool
import akka.util.Timeout
import com.thenewmotion.akka.rabbitmq._
import com.typesafe.config.{ConfigFactory, ConfigParseOptions}
import model.Email
import services.EmailService.EmailInfo
import services.{EmailService, LogService, NullLogService}
import utils.StringUtils
import scala.concurrent.duration.Duration
object Main extends App {
implicit val system = ActorSystem()
val emailServiceRef: ActorRef = system.actorOf(RoundRobinPool(rate).withSupervisorStrategy(supervisorStrategy).props(Props(new EmailService)), "emailWorkerPool")
val logServiceRef = system.actorOf(RoundRobinPool(1).props(Props(new NullLogService)), "logWorker")
val email = new Email(stringMap.apply("USEREMAIL"), stringMap.apply("REPLYTO"), stringMap.apply("SUBJECT"), stringMap.apply("BODY"), unsubscribeURL)
emailServiceRef ! EmailInfo(email, logServiceRef)
}
EmailService:コード
メインクラス関与
package services
import akka.actor._
import com.amazonaws.services.simpleemail.model.SendRawEmailResult
import model.Email
import services.LogService.{Log, LogError}
object EmailService {
case class EmailInfo(email: Email, logServiceRef: ActorRef)
}
class EmailService extends Actor {
import EmailService._
def receive = {
case EmailInfo(email, logServiceRef) =>
val emailResult = new SendRawEmailResult
emailResult.setMessageId("Fake_Sent_OK")
val amazonResult = Try(emailResult)
logServiceRef ! Log(email, amazonResult)
}
}
これは私のためにうまくいきます: 'Email to:[email protected]。 AmazonResultSucess:true。 AmazonResult:電子メールの結果 ' 私が考えることができる唯一のことは、メッセージを送信する際に同じクラス' NullLogService.Log'を使用しているかどうかです。 – Jatin
私はJatinに同意する必要があります。それは私にとってもうまくいく。 ActorSystemを使用していますか?他にコードが含まれていますか? – siebenschlaefer
NullLogServiceを変更して、デフォルトのケースを印刷しました。それは 'ログ(TO:email @ email.com、成功({MessageId:Fake_Sent_OK}))'を表示します。大文字と小文字は「ログ」で、種類は電子メールです。また、タイプを2番目のパラメータで "Try(_)"に変更しました。まだ動かない。私は他に何をすべきかわからない:C –