场景
应用程序的数据库已关闭.这导致任何负责将重要数据提交给DB的任何actor都无法获得连接
首选行为
重要数据在将来某个时间重新启动时会写入数据库.
当前实现
actor捕获DBException,将数据包装在DBWriteFailed案例类中,并将消息发送给其主管.然后,主管使用system.scheduler.scheduleOnce(...)在将来某个时间(例如1分钟)安排另一次写入,这样我们就不会在等待DB重新启动时过多旋转.
这种实现肯定有效,但我觉得可能有更好的方法.
我是akka新手,在涉及主管策略方面,我基本缺乏经验,但我觉得我可以利用其中一个来处理一些重试逻辑.
在akka中有一个共同的方法来解决这样的问题吗?我是在正确的轨道上还是我应该向不同的方向前进?
任何帮助表示赞赏.
建立:
我正在处理的项目有一个带有HTTP接口的pub/sub服务器.订阅通过接受服务器发送事件来工作.
curl -X GET server:port/topics/news
Run Code Online (Sandbox Code Playgroud)
每当消息发布到给定主题URL时将被推送
curl -X PUT server:port/topics/news -d "Politician Lies!"
Run Code Online (Sandbox Code Playgroud)
问题:
我有一个scala项目需要订阅这个pub/sub服务器.表演!框架能够通过使用带有Enumeratee + Iteratee的PlayWS来处理这个问题.不幸的是,PlayWS库需要Play!应用程序在范围内,我不使用Play.是否有一个库(具有最小的依赖性)我可以使用它允许我接受服务器发送事件?我需要至少一个工作示例才能开始使用.
我喜欢scala库,但如果必须,我愿意接受Java解决方案.
我有以下内容:
class Supervisor(dataProvider: DatabaseClientProvider) extends Actor {
val writer = context.actorOf(Props(classOf[Child], dataProvider.get))
def receive: Receive = {
case Msg => writer forward msg
}
override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 100) {
case e: ConnectionException => Resume
}
}
class Child(db: DatabaseClient) extends Actor {
def receive: Receive = {
case msg:Msg => db.write(text)
}
}
Run Code Online (Sandbox Code Playgroud)
我想在单元测试上面的代码基本上我试图确保当异常发生时,我们仍然恢复处理,如下所示.问题是主管没有抓住任何例外.测试下面代码的最佳方法是什么?
"resume handling messages when exception occurs" in {
// Given
val msg1 = Msg("Some msg1")
val msg2 = Msg("Some msg2")
//Throw an exception …Run Code Online (Sandbox Code Playgroud) 我有
public class mammal implements Imammle
{
public String getName() {
return "Mammal";
}
public String speak() {
return getName() + "Maaaauuu";
}
}
Run Code Online (Sandbox Code Playgroud)
我需要知道我的动物什么时候发出声音,以便我能像吃饭一样实时采取相应的行动.
我应该使用什么样的设计模式?谢谢.
我知道这里有很多时间序列问题,但我似乎并不适合给定的解决方案.我也是Cassandra的新手,所以我可能会用错误的心态接近这个.忍受我.
我收到以下表格中的搜索数据:
datetime_searched, term_used, product_found
Run Code Online (Sandbox Code Playgroud)
以及我想做的查询:
给定开始日期和结束日期,返回属于该时间窗口的所有术语 - 产品对.最初,窗口将持续一个月.这可能(读:会)改变.
例如,给出以下数据:
2013-11-20 00:00:00, "christmas", "decorated tree"
2014-12-01 20:00:00, "christmas", "wrapping paper"
2014-12-23 15:00:00, "christmas", "decorated tree" (duplicate term-product)
Run Code Online (Sandbox Code Playgroud)
以及对2014-12-01到2015-01-01时间范围的查询,我希望能够检索:
"christmas", "wrapping paper"
"christmas", "decorated tree"
Run Code Online (Sandbox Code Playgroud)
我的初始方法看起来像时间序列数据的大多数示例:
CREATE TABLE search_terms (
datetime_searched timestamp,
term_used text,
product_found text,
PRIMARY KEY (term_used, date_searched)
);
SELECT term_used, product_found
FROM search_terms
WHERE datetime_searched > [start]
AND datetime_searched < [end];
Run Code Online (Sandbox Code Playgroud)
但这需要我有二级索引和/或允许过滤,这似乎是我应该避免的,如果我只捕获一小部分被过滤的数据.
我的第二个想法是创建时间桶,但这个解决方案似乎只有在我将查询限制在桶时才有效.它似乎也创造了热点 - 在我最初的情况下,是一个长达一个月的热点.例如,对于每日桶:
CREATE TABLE search_terms_by_day (
datetime_searched timestamp,
day_searched timestamp,
term_used text,
product_found …Run Code Online (Sandbox Code Playgroud) scala ×3
actor ×2
akka ×2
database ×2
cassandra ×1
cql ×1
http ×1
spray ×1
time-series ×1
unit-testing ×1