我正在玩Liftweb及其Comet支持,我写了一些在我的本地设置/计算机上工作正常的代码。但是,只要我将webapp部署到生产系统(也是Jetty),CometActor就没有做任何事情。我的代码出了什么问题?
package code
package comet
import net.liftweb._
import http._
import net.liftweb.common.{Box, Full}
import net.liftweb.util._
import net.liftweb.actor._
import scala.language.postfixOps
import net.liftweb.util.Helpers._
import net.liftweb.http.js.JsCmds.{SetHtml}
import net.liftweb.http.js.jquery.JqJsCmds.{PrependHtml}
import net.liftweb.http.js.JE.{Str}
import _root_.scala.xml.{Text, NodeSeq}
import org.apache.commons.io.input._
case class LogLine(str: String)
class MyTailerListener(logActor: LiftActor) extends TailerListenerAdapter {
override def handle(line: String) {
logActor ! LogLine(line)
}
}
class CometLogEntry extends CometActor {
val listener = new MyTailerListener(this)
val tailer = Tailer.create(new java.io.File("/var/log/syslog"), listener)
override def defaultPrefix = Full("log_entry")
def render = bind("newest" -> <span id="newest">No log enties yet!</span>)
// Schedule an update every 5 seconds
Schedule.schedule(this, LogLine, 5 seconds)
override def lowPriority = {
case LogLine(str:String) => {
// Prepend the newest log line
partialUpdate(PrependHtml("newest", <li style="list-style-type: none;">{str}</li>))
Schedule.schedule(this, LogLine, 5 seconds)
}
}
}
答案 0 :(得分:0)
我不确定这是否能解决您的问题,但您render
的实施可能会导致问题。可以随时调用渲染,而不仅仅是在创建CometActor时。它应该导致组件的最新视图。在这种情况下,我要么存储你从尾部开始的行,这样你就可以从那一点重新发送行或者使你的渲染函数成为NOOP。
另外,请使用CSS Selectors代替bind
来电。
答案 1 :(得分:0)
此行造成了问题:
val tailer = Tailer.create(new java.io.File("/var/log/syslog"), listener)
在服务器上Jetty以用户jetty运行,该用户jetty没有足够的权限来读取文件。奇怪的是,我没有得到任何“Permission denied”消息或者什么。所以,如果我以root身份运行Jetty,我的CometActor运行良好。
但是以root身份运行Jetty被认为是危险的。这是一个更好的解决方案:
sudo apt-get install acl
sudo setfacl -m u:jetty:r-x,g:adm:r-x /var/log/
sudo setfacl -m u:jetty:r--,g:adm:r-- /var/log/syslog