服务返回事件处理程序生成的值

时间:2018-01-30 07:56:06

标签: java rest

我有本地REST服务(嵌入式Jersey)从本地连接的硬件(3M MRZ阅读器)获取数据。

硬件API允许定义事件处理程序以使用设备生成的数据。应该通过服务调用初始化设备。

要从服务中获取数据,我将其放入变量并尝试从服务方法中读取它。

private String mrzRead = null;

@GET
@Path("/scan")
@Produces(MediaType.TEXT_PLAIN)
public String scan() {
    initReader();
    String res = null;
    mrzRead = null;
    do {
        try {
            Thread.sleep(100L);
        } catch (InterruptedException e) {
        }
        synchronized(this) {
            res = mrzRead;
        }
    } while(res==null);
    mrzRead = null;
    return res;
}

//Event handler
@Override
public void OnFullPageReaderEvent(EventCode aEventType) {
...
    synchronized(this) {
        mrzRead = lCodeline.Data;
    }
...
}

这种方法不允许从外部(另一个服务调用)中断等待周期,这有时需要。

有没有更好的方法从服务返回事件处理程序生成的值?

1 个答案:

答案 0 :(得分:0)

将值读取器和REST服务分开会更好。 一些方法:

  1. 单独的线程不断读取数据源(需要暂停)并将其存储在volatile字段中。休息服务只是返回这个领域。
  2. 相同但以更加管理的方式:使用不是单独的线程但使用ScheduledExecuter。
  3. 相同但在没有人感兴趣时不读取数据源:如果找不到,则使用从源加载数据的缓存。 Guice缓存或Caffeine会这样做。