是否可以将Play 2应用程序部署到Apache Tomcat?
我想对我的数据库进行两次调用,这将需要一段时间才能返回结果,我不想阻止当前线程.我用Akka Futures来包装数据库调用.
我没有等待(阻塞)两个调用返回,而是指定要调用的回调函数,然后可以呈现响应.我怎么做?这是我的控制器代码:
def showPie = IsAuthenticated(Roles.validator) { user => implicit request =>
val eventUid = request.session.get(EventUid).get
val printed = Akka.future(TicketRepository.getCountForState(eventUid, "Printed"))
val validated = Akka.future(TicketRepository.getCountForState(eventUid, "Validated"))
//this would be evil, because it would block: Ok(views.html.pie(printed.await(1000).get, validated.await(1000).get))
//create a promise for all the promised results
val promise = Promise.sequence(List(printed, validated))
//this doesnt work, but how can I make it work WITHOUT blocking this thread?
promise.callWhenResultIsReady(Ok(view.html.pie(promise.get))
}
Run Code Online (Sandbox Code Playgroud) 我正在使用<ui:repeat>标记构建表,其长度是动态的.每行都有一个<h:inputText>字段.提交表单时,它会将表单中的值设置为散列映射.除了验证之外,一切都很好.我需要使用"for"属性告诉<h:message>它所属的输入.我已经尝试根据用于创建行的项目的名称,每行创建一个唯一的ID.但是当我提交无效输入时,<h:message>标记仍为空,我在服务器日志(JBoss 7.1)上得到以下输出:
[javax.enterprise.resource.webcontainer.jsf.renderkit]
Unable to find component with ID nTAS in view.
Run Code Online (Sandbox Code Playgroud)
这是XHTML:
<ui:repeat var="item" ...>
...
<h:inputText value="#{bean.chosenItems[item.name]}" id="n#{item.name}" >
<f:validateLongRange minimum="0" maximum="10" />
</h:inputText>
<h:message for="n#{item.name}" />
...
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)
为了至少在浏览器中获得某种错误消息,我还在页面顶部附近添加了这个消息,它的工作原理如下:
<h:messages styleClass="error" />
Run Code Online (Sandbox Code Playgroud)
它显示以下消息:
j_idt13:j_idt17:1:n: Validation Error: Value is not of the correct type.
Run Code Online (Sandbox Code Playgroud)
这种情况表明问题的一部分,因为ID是消息开头的奇怪代码,它以"n"开头,但不包含项目的名称.如果我在浏览器中查看源代码,ID实际上是:id="j_idt13:j_idt17:1:nTAS"
如果我查看表之外的其他组件,它们也有隐藏ID,显然是由JSF生成的.
真正奇怪的是,当我第二次输入"asdf"并重新提交表单时,它会在bean上调用action方法,而不是在验证阶段再次失败!怎么可能?!
谢谢任何提示,约翰
我正在使用Web服务客户端,他们在第一次调用时速度很慢.而不是总是创建一个全新的,我想使用演员并说5个演员来包装Web服务客户端.由于Web服务客户端不是线程安全的(至少使用我用来生成它们的库),这非常有意义.
我想到有一个父母演员将这个工作交给五个工人,一个接一个地以循环方式.
但最好简单地交给第一个可用的.我可以在父演员中跟踪该状态,但我想知道这样的事情是否可以更简单地完成并且它是否已经被框架支持了?
我使用的是简单的scala演员,而不是AKKA,但我对所有建议持开放态度.
谢谢.
以下陈述是否正确,否则如何改进?
当向Akka演员发送消息时,将作业提交给执行者.当有一个空闲线程时,它调用获取actor的锁定的作业(假设它可以,否则采取另一个作业).
receive然后调用actor 的 方法,一旦完成,就丢弃该作业并将该线程返回到池中.然后重复该循环.所有与并发线程相关的复杂内容都由Akka处理,使程序员可以专注于解决业务问题.
我有一些测试结果,我无法解释.
第一个测试在包含4个元素的列表上执行过滤,映射和缩小:
{
val counter = new AtomicInteger(0)
val l = List(1, 2, 3, 4)
val filtered = l.filter{ i =>
counter.incrementAndGet()
true
}
val mapped = filtered.map{ i =>
counter.incrementAndGet()
i*2
}
val reduced = mapped.reduce{ (a, b) =>
counter.incrementAndGet()
a+b
}
println("counted " + counter.get + " and result is " + reduced)
assert(20 == reduced)
assert(11 == counter.get)
}
Run Code Online (Sandbox Code Playgroud)
计数器按我的预期递增11次:过滤期间每个元素一次,映射期间每个元素一次,三次元素加起来.
使用通配符会导致结果发生变化:
{
val counter = new AtomicInteger(0)
val l = List(1, 2, 3, 4)
val filtered = …Run Code Online (Sandbox Code Playgroud)