2016-09-14 1 views
0

まず、私は比較的新しいスカラーです。スカラパターンのマッチングは常にデフォルトのケースになります

コンソールに結果を記録する次の単純なクラス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) 
} 
} 
+2

これは私のためにうまくいきます: 'Email to:[email protected]。 AmazonResultSucess:true。 AmazonResult:電子メールの結果 ' 私が考えることができる唯一のことは、メッセージを送信する際に同じクラス' NullLogService.Log'を使用しているかどうかです。 – Jatin

+1

私はJatinに同意する必要があります。それは私にとってもうまくいく。 ActorSystemを使用していますか?他にコードが含まれていますか? – siebenschlaefer

+0

NullLogServiceを変更して、デフォルトのケースを印刷しました。それは 'ログ(TO:email @ email.com、成功({MessageId:Fake_Sent_OK}))'を表示します。大文字と小文字は「ログ」で、種類は電子メールです。また、タイプを2番目のパラメータで "Try(_)"に変更しました。まだ動かない。私は他に何をすべきかわからない:C –

答えて

1

おそらくあなたはLogService.LogLogService.LogError削除していない、または他のあなたがEmailServiceのためにコンパイルエラーを得ているでしょう(「NullLogServiceはインポートされません」のような)は、実行時エラーがなかったので、それは奇妙です。そして、あなたが変更することなく、同じプロトコルを(たとえば、NullLogServiceSlf4jLogServiceInMemoryLogService)を使用する様々なサービスに切り替えることができ

package services 

import akka.actor._ 
import com.amazonaws.services.simpleemail.model.SendRawEmailResult 
import model.Email 

import scala.util.Try 
import LogService.{Log, LogError} 

// no object NullLogService unless you need it for something else 

class NullLogService extends Actor { 
    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) 
    } 
} 

:この場合NullLogServiceは、独自のメッセージを定義しますが、LogServiceのものを使用すべきではありません毎回輸入。

+0

私は私の答えを受け入れるつもりだったが、私はあなたの提案を受け入れてくれてありがとう。ありがとうございました。コードは今よりクリーンです –

0

は、間違いを発見されました。私はインポートしていたロガークラスを変更しなければならなかった。
LogServiceではなくNullLogServiceを使用しています。

package services 

import akka.actor._ 
import com.amazonaws.services.simpleemail.model.SendRawEmailResult 
import model.Email 
//Change this --> import services.LogService.{Log, LogError} <--- 
//To the class you are using --v 
import services.NullLogService.{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) 
} 
} 

関連する問題