为什么我的Lift Comet Actor在Jetty上部署后停止工作?

时间:2014-02-28 21:56:49

标签: scala comet lift

我正在玩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)
    }
  }
}

2 个答案:

答案 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