如何在Play Framework 2中的actor内生成URL

时间:2014-01-21 06:41:56

标签: scala playframework playframework-2.0 akka

我有一个名为NotificationActor的演员,每隔10分钟运行一次,并通过电子邮件发送最新的通知。这些电子邮件包含返回应用程序的链接,指向通知通知的特定资源。问题是我无法访问我的演员中的请求对象(至少不是我知道的......),以便生成绝对URL回到应用程序,如下所示:

val url = routes.MyController.myMethod().absoluteURL(request())

这是我的演员参考:

import akka.actor.Actor
import akka.event.Logging
import play.api.{Play, Mode, DefaultApplication, Application}
import java.io.File
import scala.collection.JavaConversions._
import models.Notification.Action
import com.feth.play.module.mail.Mailer
import com.feth.play.module.mail.Mailer.Mail
import com.feth.play.module.mail.Mailer.Mail.Body

class NotificationActor extends Actor {
    val log = Logging(context.system, this)
    def receive = {
        case "runNotificationJob" ⇒ {

            val notifications = <get List of new notifications>

            for (notification <- notifications) {
                notifyByEmail(notification)
            }
        }
        case _      ⇒ log.info("received unknown message")
    }

    def notifyByEmail(notification: Notification) {
        val subject:String = s"PostSubject"


        val url:String = routes.MyController.myMethod(notification.post, notification.action).absoluteURL(request()) // Broken because there is no request() here

        val body = new Body(s"Message Body with url $url")

        val mail = new Mail(subject, body, Array(notificationStatus.getRecipient.getEmail))
        mailer.sendMail(mail)
    }
}

2 个答案:

答案 0 :(得分:2)

调用只查看RequestHeader中的主机名,这样你就可以创建一个只提供主机名的假名,问题是游戏服务器并不真正关心它的主机名是什么,甚至可能更多而不是一个,所以你仍然需要硬编码或将你想要的主机名放在配置文件中。

(由于您的示例路由不接受参数,因此url在actor的生命周期内不会更改,因此您每次发送邮件时可能不需要创建URL。)

所以你可以这样做:

lazy val publicUrl: String = { 
   val publicHostname = ???
   routes.MyController.myMethod().absoluteURL(secure = false)(new RequestHeader(){
     override lazy val host = publicHostname
     def remoteAddress = ???
     def headers = ???
     def queryString = ???
     def version = ???
     def method = ???
     def path = ???
     def uri = ???
     def tags = ???
     def id = ???
   })
}

答案 1 :(得分:0)

只需将其放入您的conf中,并为其部署的每个服务器配置不同的配置。不是超级优雅,但这就是我解决它的方式。