java - 有关管理 UDP 调用的架构建议

标签 java jakarta-ee jboss ejb-3.0

对于这个问题我想得到一个建议: 我使用的是Jbos 5.1.0,EJB3.0

我有一个系统,它通过 UDP 向远程调制解调器发送请求,并假设等待目标调制解调器的答复。 远程调制解调器仅支持UDP调用,因此设计了异步机制。 (也是因为我想请求 X 个调制解调器并行)

这就是我尝试做的:

所有调用均从数据库检索,然后每个调用将作为消息添加到 JMS QUE。 假设我将在该队列上设置 X MDB'S,这样我就可以异步工作。现在每个 MDB 都会向 IP 地址(远程调制解调器)发送 UDP 请求,该请求将从 que 消息中解析。

所以基本上每个接受消息的 MDB 都会向远程调制解调器发送 udp 请求,并[b]等待[/b]来自该调制解调器的答复。

[u]现在这是BUG:[/u]

可能会发生这样的情况:MDB 将得到答案,但不是从正确的调制解调器(它首先请求的)得到答案。

这种糟糕的情况会导致两个错误的事情:

a.发送消息的发送者将永远等待,因为消息从未返回给他(它已被另一个 MDB 接受)。 b.接收消息的 MDB 不是正确的,如果它处于“监听器”模式,那么它应该等待来自不同发件人的答复。(否则它不会收到任何消息)

所以我当然可以使用 RETRY 机制来处理所有事情。因此,两个MDB(从错误的发件人处收到消息的人和从未得到答复的人)都会再次尝试,进行第三次操作,希望下次能够成功。

这就是机制,请问您是否有任何设计模式,或者任何其他有效的解决方案来解决这个问题?

谢谢

射线。

最佳答案

在不了解细节的情况下很难定义精确的解决方案,但我假设当从调制解调器收到响应(无论正确与否)时,可以确定请求来自哪个确切的调制解调器。

如果是这种情况,我会将请求处理程序与响应处理程序分开:

  • RequestMDB 从[现有]队列接收消息,分派(dispatch)请求并返回。
  • 一个新组件(称为 ResponseHandler)处理来自调制解调器的所有传入响应。响应发送者被识别(调制解调器 ID?)并将响应打包到 JMS 消息中,该消息被发送到 JMS 响应队列。
  • 新的 MDB (ResponseMDB) 监听 JMS 响应队列并处理现在已知调制解调器 ID 的响应。

简而言之,通过分离关注点,您不再需要响应处理 MDB 只能处理来自特定调制解调器的响应,并且现在可以处理由 ResponseHandler 排队的任何响应。

ResponseHandler(监听调制解调器的响应)需要是多线程服务。您可以将其实现为具有某种 ThreadPool 支持的 JBoss ServiceMBean。它将需要对 JMS QueueConnectionFactory 和 JMS 响应队列的引用。

为了处理请求超时,我建议您创建一个计划任务,每个调制解调器一个,并以调制解调器 ID 命名。当发送请求时,任务被安排在延迟超时时间后执行。当 ResponseHandler 收到响应时,ResponseHandler 会将响应排队,然后取消指定的任务。如果超时期限已过而没有取消,则计划任务将执行并将另一个请求排队(重新安排超时任务)。

我认为说起来容易做起来难,但我希望这会有所帮助。

//尼古拉斯

关于java - 有关管理 UDP 调用的架构建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4564539/

相关文章:

java - 如何清除 Jpanel 但保留网格线?

java - 有没有一种方法可以覆盖 JLabel 的内容

http - Tomcat 基本授权

java - java中的DAO模式什么是业务对象

java - 关闭 JBOSS 时出错

java - 如何从普通 java 类重定向到其他扩展 android 中 Activity 的 java 类?

java - Android 使用 PNG 和 OOM 为按钮添加动画

jakarta-ee - NetBeans 中 Java EE 项目的默认 index.jsp 文件在哪里?

java - 如何修复jboss中的 "IJ000305: Connection error occured"

jboss - 为 JBoss EAP 6.3 (HornetQ 2.3.x) 配置 JmsToolBox