小编McC*_*Coy的帖子

WatchService:错过和未处理的事件

我遇到了WatchService的问题.这是我的代码片段:

public void watch(){
  //define a folder root
  Path myDir = Paths.get(rootDir+"InputFiles/"+dirName+"/request");      

  try {
    WatchService watcher = myDir.getFileSystem().newWatchService();
    myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE); 

    WatchKey watckKey = watcher.take();

    List<WatchEvent<?>> events = watckKey.pollEvents();
    for (WatchEvent event : events) {
      //stuff
    }
  }catch(Exception e){}

  watckKey.reset();

}
Run Code Online (Sandbox Code Playgroud)

*首先,要知道watch()是在无限循环中调用的.

问题是,一次创建多个文件时,会丢失一些事件.例如,如果我将三个文件复制粘贴到".../request"文件夹中,则只有一个文件被捕获,其他文件仍然没有发生,也没有触发OVERFLOW事件.在某些不同的计算机和操作系统中,它最多可以达到两个文件,但如果一个尝试3个或更多,则其余文件仍未触及.

我找到了一个解决方法,但我认为这不是最好的做法.这是流程:

该过程开始,然后停止

WatchKey watckKey = watcher.take();
Run Code Online (Sandbox Code Playgroud)

正如预期的那样(根据Processing事件).然后,我将3个文件放在"request"文件夹中,因此,进程恢复为

List<WatchEvent<?>> events = watckKey.pollEvents();
Run Code Online (Sandbox Code Playgroud)

问题在这里.看起来这个线程如此快速地通过这条线,两个CREATED事件留在后面并且丢失,只有一个被占用.解决方法是在这一个上方添加一个额外的行,如下所示:

Thread.sleep(1000);
List<WatchEvent<?>> events = watckKey.pollEvents();
Run Code Online (Sandbox Code Playgroud)

这似乎是一个解决方案,至少有三个和几个同步文件,但它根本不可扩展.总而言之,我想知道是否有更好的解决方案来解决这个问题.仅供参考,我正在运行Win 7 64

非常感谢提前!

java events file watchservice

5
推荐指数
1
解决办法
1193
查看次数

Java并发控制多锁

我有一个临界区,我需要控制只有那些具有给定属性值的线程才能同时进入。

例如:我有 Thread#1 处理产品,Thread#2 也处理产品,Thread#3 处理服务

现在:

  1. T1先来,进入临界区,使产品得到处理

  2. T2想进入,但是因为还有一个产品正在加工,所以必须等待

  3. T3排在最后,它可以进入,因为它需要一个服务(而不是一个产品)来处理

  4. T1出去了,现在T2可以进去了

我认为它看起来很简单,但我找不到任何符合要求的东西。我的问题是,我怎样才能做到这一点?对有关此信息的任何来源的任何参考都将不胜感激

非常感谢您提前

java concurrency semaphore locking

5
推荐指数
1
解决办法
841
查看次数

jdk 1.7推荐使用什么社区版本的Jboss以及为什么

我需要从Jboss 5.1.0 GA迁移到支持jdk 1.7的任何其他GA.我目前正在使用带有seam 2,jdk 1.6和sqlserver 2008 r2的jboss 5.1.

对于jdk 1.7,推荐使用什么社区版的Jboss?为什么?

提前致谢!

jboss seam migrate java-7

3
推荐指数
1
解决办法
9144
查看次数

具有多个名称的@XmlElement

我这里有一个情况,试图充当两个 API 之间的网关。我需要做的是:

  1. 向 APIa 发出请求;
  2. 将 XML 响应解析(编组)为一个 java 对象;
  3. 对其做些小改动;
  4. 然后以 XML(解组)形式向另一端 (APIb) 提供响应。

问题是我使用相同的对象来解析 API 响应并将响应发送到另一端。

public class ResponseAPI{

@XmlElement(name="ResponseCode") //I receive <ResponseCode> but I need to send <ResultCode>
private String responseCode;

//getter and setter
}
Run Code Online (Sandbox Code Playgroud)

正如评论所说:我收到但我需要发送

有没有办法在不必创建另一个带有 ResultCode 的额外类的情况下完成这项工作?

提前致谢!

java xml jaxb xml-parsing

1
推荐指数
2
解决办法
7491
查看次数