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

时间:2010-12-30 16:57:08

标签: java java-ee jboss ejb-3.0

我想就此问题提出建议: 我使用的是Jbos 5.1.0,EJB3.0

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

这是我尝试做的事情:

从Data Base检索所有调用,然后每个调用将作为消息添加到JMS QUE。 让我们说我会在那个问题上设置X MDB' S,所以我可以异步工作。现在每个MDB都会向IP地址(远程调制解调器)发送UDP请求,该地址将从que消息中解析。

基本上每个接收消息的MDB都向远程调制解调器发送udp请求,并[b]等待[/ b]从该调制解调器获得应答。

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

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

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

一个。发送消息的发送者将永远等待,因为消息从未返回给他(它被另一个MDB接受)。 湾接收到该消息的MDB不是正确的,并且可能是它是在一个"听众"模式,然后它应该等待来自不同发送者的答案。(否则它不会得到任何消息)

所以当然我可以用RETRY机制来处理所有事情。因此,mdb&#(从错误的发件人那里得到消息的人,以及从未得到答案的那个人)将再次尝试,希望下次成功时做好操作。

这是机制,mybe你可以告诉我,如果有任何设计模式,或任何其他有效的解决方案吗?

谢谢,

射线。

1 个答案:

答案 0 :(得分:1)

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

如果是这种情况,我会从响应处理程序中分离出请求处理程序:

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

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

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

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

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

//尼古拉斯