我有一个名为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)
}
}
答案 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中,并为其部署的每个服务器配置不同的配置。不是超级优雅,但这就是我解决它的方式。