我有一个进程,它会被cron相当频繁地调用,以读取其中包含某些与移动相关的命令的文件.我的进程需要读取和写入此数据文件 - 并将其锁定以防止其他进程在此期间触摸它.用户可以执行完全独立的过程(可能)写入/附加到该相同的数据文件.我希望这两个进程运行良好,并且一次只访问一个文件.
nio FileLock似乎是我需要的(没有编写我自己的信号量类型文件),但是我无法将其锁定以供阅读.我可以锁定并写入正常,但在读取时尝试创建锁定时会出现NonWritableChannelException.甚至可以锁定文件进行阅读吗?看起来像RandomAccessFile更接近我的需要,但我不知道如何实现它.
这是失败的代码:
FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null)
{
System.out.println("Locked File");
BufferedReader in = new BufferedReader(new InputStreamReader(fin));
System.out.println(in.readLine());
...
Run Code Online (Sandbox Code Playgroud)
FileLock行抛出异常.
java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
at java.nio.channels.FileChannel.tryLock(Unknown Source)
at Mover.run(Mover.java:74)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
它说,看看JavaDocs
尝试写入最初未打开以进行写入的通道时,抛出未经检查的异常.
但我不一定要写信给它.当我尝试创建FileOutpuStream等用于写入目的时,我很高兴,直到我尝试在同一文件上打开FileInputStream.
我有一个主要的构建脚本,调用各种目标.其中一个目标需要存储一个值,另一个目标需要显示它.显然这不起作用所以我认为它可能与范围有关.我尝试过var,property,并在target1之外声明属性.因为var似乎是可变的,所以看起来我需要使用它,但每次我的输出都是空的.
主要脚本
<antcall target="target1"/>
<antcall target="display"/>
Run Code Online (Sandbox Code Playgroud)
在target1中:
<var name="myVar" value="${anotherVar}"/>
Run Code Online (Sandbox Code Playgroud)
在显示中:
<echo>${myVar}</echo>
Run Code Online (Sandbox Code Playgroud) 我需要修改业务规则的方法,同时保持所有以前的版本可访问.它们所包含的类将是相同的,但每种方法中的内容将是不同的.我希望他们有相同的方法签名.调用者将知道它想要执行的版本.我也不希望在方法名称中使用_vX(如下例所示).有一个更好的方法吗?像每个方法上的注释之类的东西会很好但是简单的测试似乎不可能使方法足够独特.
public class SomeSpecificRule {
public Response processRule_v1() {
}
public Response processRule_v2() {
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:不同方法的原因是方法中包含的逻辑可能在不同时间(主要方案)有效,但我们需要能够在任何给定时间(次要)运行任何版本.用于日期x1-x2的method_v1和来自日期x2-x3的method_v2将是常见的.但是,"我们应该使用哪个版本"给定日期和我想要的其他标准逻辑保持分离,以便为其他开发人员轻松创建这些类和其他方法.