2014-02-28 134 views
0

我正在玩Liftweb和它的Comet支持,我写了一些代码,可以在我的本地设置/计算机上正常工作。但是,只要我将webapp部署到生产系统(也是Jetty),CometActor就没有做任何事情。我的代码有什么问题?为什么我的Lift Comet Actor在Jetty上部署后停止工作?

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

问题的症状是什么?错误?没有更新? etc – joescii

+0

@barnesjd我没有看到任何错误。至少码头日志显示没有。这可能只是不更新​​,但它在我的笔记本电脑上完美无缺。 – user3365917

+0

页面最初是否包含正确的数据?或者它是完全空白的? – joescii

回答

0

我不知道这是否会解决你的问题,而是你的render实施可能导致潜在的问题。渲染可以在任何时候被调用,而不仅仅是当CometActor被创建时。它应该导致组件的最新视图。在这种情况下,我将存储从尾开始的行,以便重新发送该行的行或使您的渲染函数成为NOOP。

此外,请使用CSS Selectors而不是bind来电。

+0

你的意思是像这样存储当前行吗?此版本适用于我的开发笔记本电脑,但不适用于服务器。太糟糕了。 'private var current =“” def getCurrent = current override def handle(line:String){ current = line logActor!的logline(线) }' 我的新'render'在'CometLogEntry':如果 '高清渲染= { (listener.getCurrent = “!”){ “#newest *” #> {监听器。 getCurrent} } else { “#newest *”#> Noop } }' – user3365917

+0

SO不会在注释中格式化代码,因此很难做到这一点。首先实现def render = JsCmds.Noop方法,看看是否有任何效果。如果没有,请查看页面使用诸如Chrome Developer Tools或Wireshark之​​类的请求和响应。彗星的要求是否被制定?他们是否收到看起来有效的回应? –

+0

对不起,代码格式混乱。我也试着把'render'设置为'JsCmds.Noop',但没有任何变化。我添加了一些println语句,好像CometActor没有运行resp。正在服务器上启动。我的println语句不返回任何内容。 – user3365917

0

这条线是造成问题:

val tailer = Tailer.create(new java.io.File("/var/log/syslog"), listener) 

在码头运行作为它没有足够的权限读取该文件的用户码头服务器。奇怪,我没有得到任何“权限被拒绝”的消息或什么。所以,如果我以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 
相关问题