gpt4 book ai didi

java - 从不同线程中的消息循环返回操作结果

转载 作者:太空宇宙 更新时间:2023-11-04 06:13:52 25 4
gpt4 key购买 nike

我有一些关于“消息循环”的理论问题;特别是返回在不同线程中运行的消息循环中发生的操作的结果。我遇到过这样的情况:我有一个 TCP 服务器正在监听传入的消息。对于每条传入消息,服务器都会对发送消息的客户端进行身份验证,并且可能会发生两种情况:

  1. 如果经过身份验证的客户端具有附加处理程序,则收到的消息将传递到处理程序的消息队列。
  2. 如果客户端没有处理程序,则会创建一个新处理程序,与上面相同(消息将传递到其消息队列)。

处理程序当前是一个实现 Callable 接口(interface)的对象,因此它将在不同的线程中运行,并且它足够简单,可以获取操作的结果。现在我的问题是:每个处理程序可以有 N 条消息要处理。该处理程序具有类似“消息循环”的功能,该功能运行直到发生超时 - 在这种情况下,超时将是套接字的空闲时间达到预定义的阈值。我想知道的是,如何让 Java 从消息循环中返回一个值而不实际终止线程。类似于以下内容:

while (true) {
if (expired(socket))
break; // the callable will finish the call() method.

// get the first item from the queue.
message = messageQueue.poll();

result = process(message);

// I want to return the result to the caller which is in a different thread.
}

现在显然 return 语句会停止消息循环,如果 messageQueue 包含更多消息,它们就会丢失。另一种天真的方法是使用类似回调的机制,这需要一个额外的对象+我仍然需要将调用者与后台线程中的 Callable 同步。尽管我有 K 个线程在后台运行,但类似等待和通知的东西。

处理这种从不同线程的消息循环内返回操作结果而不终止线程本身的情况的复杂方法是​​什么?

@编辑:我将描述整个过程,以便澄清这里发生的事情。

  1. 客户端通过 TCP 套接字向应用程序发送消息(xml 字符串)。
  2. 应用程序会对客户端进行身份验证,如果客户端没有关联的处理程序,它将创建一个。
  3. 应用程序会将消息推送到处理程序的队列中。
  4. 处理程序在单独的线程中运行,等待来自与其关联的客户端的传入消息,它们不得处理其他客户端的消息。
  5. 当处理程序获取消息时,它会将其转换为 SOAP 消息,并通过 TCP 套接字将其转发到另一个系统。
  6. 当处理程序收到响应时,它需要将其委托(delegate)回调用方,而不终止其消息循环。

因此,调用者就像一个调度程序,将消息分派(dispatch)到正在运行与消息发送者关联的处理程序的线程。它还收集来自处理程序的响应并将其发送回正确的客户端。

每个处理程序当前都有自己的消息队列,其中仅推送特定句柄必须处理的消息。当处理程序启动时,它将打开一个到目标系统的 TCP 套接字,在应用转换后它们将转发传入的消息。当处理程序达到允许的最大空闲时间(套接字在没有发送请求的情况下打开)时,套接字将关闭并且消息循环停止。此时处理程序将完成其执行。这样做的目的是为每个单独的客户端提供一个套接字,通过该套接字它们可以发送多个请求,而不需要目标系统进行另一次身份验证。

最佳答案

我想到的选项/问题很少:

  1. 是否有问题终止线程,检查返回结果,然后重新提交此任务到同一个线程池?您将得到一个结果,对其进行分析,然后重新提交到池中并继续工作

  2. 当该线程运行时,它可以将状态提交到不同的(“外部”)队列,该队列在此线程之外进行分析。一个独立的线程总是运行并检查这个队列

这就是我能想到的如何......

关于java - 从不同线程中的消息循环返回操作结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28350276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com