java - Apache Thrift 在不同线程中重用连接

标签 java multithreading thrift java-threads

我正在用 Java 创建一个程序,其中客户端可以向节点发送读/写操作,该节点向 super 节点发送读/写请求。 super 节点使用 Thrift HaHs 服务器。 有多个节点,因此应该能够处理并发操作。写作没问题,但阅读有问题。

每次节点连接到服务器时,线程都会获取其读/写请求并将其放入队列中(LinkedBlockingQueue,因为这是需要锁定的关键部分)。 服务器有一个单独的工作线程池,它将同时处理队列中的每个请求。

我的问题是,在获取特定文件后,我需要将其传递回连接节点(使用相同的 Thrift 连接)。但是,我不确定如何执行此操作,因为请求是由单独的工作线程处理的。以下是步骤顺序。

// node calls this supernode method (via Thrift RPC)
Request connect(Request req) {
    queue.put(req)
    return req;
}


// Inside Worker Thread class (which is inside supernode)

public void run() {
    try {
        while ( true ) {
            Request req = queue.take();
            processRequest(req);
        }
    }
    catch ( InterruptedException ie ) { 
        // just terminate
    }
}

基本上,我试图弄清楚如何将某些内容发送回 processRequest 内的同一个 Thrift 套接字

任何帮助将不胜感激!

最佳答案

My solution currently is to use a separate 'Completion Queue' which will add completed requests and the incoming call will have to poll that queue--of course this is not efficient due to polling. I assume there is some way to wait the main thread while the worker thread is processing then signal the main thread to continue, but then I'm not sure how to pass back the computed request (i.e contents of file retrieved)

我首先会问自己,为什么我需要两个线程,而一个线程似乎就足够了?

除此之外,我的方法是……。像这样(粗略的草图):

  • 请求数据、响应数据和可等待事件对象都包装在一个“工作包”中。通过waitable event object我的意思是,从技术上讲,Java 中的任何等价物都是如此。

  • 该工作包对象在线程之间共享。它被放入队列中以供工作线程处理,并且调用线程也保持对它的引用。

  • 工作人员从工作包对象中获取请求数据,对其进行处理并将结果数据附加到该工作包对象。

  • 工作人员完成后,他会向上述事件对象发出信号。

  • 调用线程等待该事件发生。由于我们使用事件对象,因此完全不需要轮询。一旦事件发出信号,线程就会从已完成的工作包中提取结果数据并返回给客户端。

当然,可以添加额外的代码来覆盖所有边缘情况,例如必要的超时等。

关于java - Apache Thrift 在不同线程中重用连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36274168/

相关文章:

java - hive 和 spark 分布的 hive thrift 服务器之间的区别

java - 内存泄漏运行 Apache Thrift 服务器

java - 如何禁用某些字段的 Jackson 序列化功能 WRITE_NUMBERS_AS_STRINGS?

java - 使用按钮在运行时更改 JPanel

c++ - 使用 C++ 和 Windows API 的 udp 套接字

java - 在 Java 中将可变变量转换为不可变变量并减少痛苦

deployment - 如何弃用 .thrift 文件中的可选字段?

java - 使用 Log4j 登录数据库

java - 更改文本时标记不清楚的文本

c# - 多线程时如何使用 HttpContext.Current?