我的程序有一个组件 - 称为调度程序 - 它允许其他组件及时注册他们想要回调的时间点.这应该像Unix cron服务一样工作,即你告诉调度程序"在每整个小时过去十分钟通知我".
我意识到Java中没有真正的回调.
这是我的方法,是否有一个已经完成这些工作的库?随意提出改进建议.
注册调度程序通行证:
在启动时或在新的注册请求之后,调度程序以当前系统时间的Calendar对象开始,并检查数据库中是否存在与此时间点匹配的任何条目.如果存在,则执行它们并重新开始该过程.如果没有,则Calendar对象中的时间增加一秒,并重新检查entreis.重复这一过程,直到有一个或多个匹配的条目.(离散事件模拟)
然后,调度程序将记住每秒的时间戳,睡眠和唤醒,以检查它是否已存在.如果它恰好醒来并且时间已经过去,它将重新开始,同样如果时间到了且作业已经执行.
编辑:谢谢你指点我Quartz.但是,我正在寻找更小的东西.
在Scala中,如果我有一个简单的类,如下所示:
val calc = actor {
var sum = 0
loop {
react {
case Add(n) =>
sum += n
case RequestSum =>
sender ! sum
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的领域sum应该被标记@volatile吗?虽然actor在逻辑上是单线程的(即消息是按顺序处理的),但各个反应可能发生在不同的线程上,因此state变量可能在一个线程上被改变,然后从另一个线程读取.
有时为了测试/开发目的,我们在必须在生产构建中删除的代码中进行一些更改.我想知道是否有一种简单的方法来标记这样的块,这样只要它们存在,生产构建就会失败,或者至少它会在构建过程中以某种方式警告你.
简单"//TODO:"并不真正起作用,因为它被遗忘并混合了大量的其他待办事项.有什么更强的吗?
或者即使我可以创建一些外部txt文件并在生产之前放置有关该操作的说明,并且该ant将检查该文件是否存在然后取消构建.
我们正在使用Eclipse/Ant(和java + Spring).
更新:我并不是说在本地和生产中存在大量不同的代码.事实上,所有代码都是相同的,应该是相同的.简单地说,我注释掉了一些代码行,以便在开发过程中节省大量时间,并忘记取消注释或者沿着这些方向进行注释.我只是希望能够以某种方式标记项目需要注意的事项,并且生产构建将失败或显示警告.
Spring Framework 3似乎即将到来,但GA版本为2.5.6.
如果这是我第一次接触这个主题,我应该从稳定版本开始,还是应该从新版本开始并保存自己的迁移问题?
版本3与版本2有何不同?春天3有多近?
我刚刚尝试在jdk6-u18 VM上-XX:+DoEscapeAnalysis启用该选项(在solaris上)并且有一个相当令人失望的经历.我正在运行一个scala应用程序,它有很多演员(其中20,000个).这是垃圾创建的秘诀!
通常,应用程序可以用堆为256MB运行,但产生巨大的垃圾量.在稳定状态下:
我认为转义分析可能会有所帮助,所以我启用了该选项并重新运行了应用程序.我发现应用程序变得越来越无法清除它收集的垃圾,直到它似乎最终花费了整个时间来做GC并且应用程序在其完全分配时"扁平化".
在这一点上,我应该说该应用程序没有抛出OutOfMemoryError我所期望的.也许JConsole(我用来执行分析)没有正确显示带有此选项的GC统计数据(我不相信)?
然后我删除了该选项并重新启动,应用程序再次变为"正常"!任何人都知道可能会发生什么?
scalaz库中有一个trait名为Kleisli的文件.看代码:
import scalaz._
import Scalaz._
type StringPair = (String, String)
val f: Int => List[String] = (i: Int) => List((i |+| 1).toString, (i |+| 2).toString)
val g: String => List[StringPair] = (s: String) => List("X" -> s, s -> "Y")
val k = kleisli(f) >=> kleisli(g) //this gives me a function: Int => List[(String, String)]
Run Code Online (Sandbox Code Playgroud)
调用k值为2 的函数给出:
println( k(2) ) //Prints: List((X,3), (3,Y), (X,4), (4,Y))
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何使用Scalaz将f和g组合起来得到一个函数m,使m(2)的输出为:
val m = //??? …Run Code Online (Sandbox Code Playgroud) 在scala中,我们可以使用隐式类型类有条件地将方法添加到依赖于该类型参数的参数化类型上.例如,Iterator.sum:
def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)
Run Code Online (Sandbox Code Playgroud)
Numeric甚至可以调用此方法的类型类的实例:
scala> List(1, 2, 3).sum
res0: Int = 6
scala> List("a", "b").sum
<console>:6: error: could not find implicit value for parameter num: Numeric[java.lang.String]
List("a", "b").sum
^
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.假设我想要一些集合类型,My2Col:
class My2Col[A](a1 : A, a2 : A)
Run Code Online (Sandbox Code Playgroud)
但我想强制要求,如果这是一个做A : Numeric,然后 a2 > a1.但是,使用非数字制作完全有效A.
My2Col("a", "b") //OK
My2Col("b", "a") //OK
My2Col(1, 2) //OK
My2Col(2, 1) //THROW IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)
有没有人想我怎么做这个? …
我有一个简单的程序:
import scalaz._
import stream._
object Play extends App {
val in1 = io.linesR("C:/tmp/as.txt")
val in2 = io.linesR("C:/tmp/bs.txt")
val p = (in1 merge in2) to io.stdOutLines
p.run.run
}
Run Code Online (Sandbox Code Playgroud)
该文件as.txt包含五个as,文件bs.txt包含3 b秒.我看到这种输出:
a
b
b
a
a
b
a
a
a
Run Code Online (Sandbox Code Playgroud)
但是,当我更改声明in2如下:
val in2 = io.stdInLines
Run Code Online (Sandbox Code Playgroud)
然后我得到了我认为的意外行为.根据文档1,程序应根据哪个流更快地提供内容,从每个流中非确定性地提取数据.这应该意味着我看到一堆as立即打印到控制台,但这根本不会发生.
的确,直到我按下ENTER,没有任何反应.很明显,如果我随机选择一个流来获取下一个元素,那么行为看起来很像我期望的那样,如果该流阻塞,合并的进程也会阻塞(即使另一个流包含数据) ).
到底是怎么回事?
我有一些不是线程安全的类:
class ThreadUnsafeClass {
long i;
long incrementAndGet() { return ++i; }
}
Run Code Online (Sandbox Code Playgroud)
(我在long这里使用了a 作为字段,但我们应该将其字段视为一些线程不安全的类型).
我现在有一个看起来像这样的课程
class Foo {
final ThreadUnsafeClass c;
Foo(ThreadUnsafeClass c) {
this.c = c;
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,线程不安全类是它的最后一个字段.现在我要这样做:
public class JavaMM {
public static void main(String[] args) {
final ForkJoinTask<ThreadUnsafeClass> work = ForkJoinTask.adapt(() -> {
ThreadUnsafeClass t = new ThreadUnsafeClass();
t.incrementAndGet();
return new FC(t);
});
assert (work.fork().join().c.i == 1);
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,从thread T(main),我调用了一些工作T'(fork-join-pool),它创建并改变了我的不安全类的实例,然后返回包含在a中的结果Foo.请注意,我的线程不安全类的所有变异都发生在一个线程上T'.
问题1:我是否保证thread-unsafe-class实例的结束状态安全地移植到?的 …
java parallel-processing fork-join java-memory-model java-stream