我想就此问题提出建议: 我使用的是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你可以告诉我,如果有任何设计模式,或任何其他有效的解决方案吗?
谢谢,
射线。
答案 0 :(得分:1)
很难在不知道细节的情况下定义严格的解决方案,但我会假设当从调制解调器(无论是否正确)收到响应时,可以确定请求来自哪个精确的调制解调器。
如果是这种情况,我会从响应处理程序中分离出请求处理程序:
简而言之,通过分离问题,您不再需要响应处理MDB,只能处理来自特定调制解调器的响应,现在可以处理ResponseHandler排队的任何响应。
ResponseHandler(侦听来自调制解调器的响应)需要是多线程服务。您可以将其实现为具有某种ThreadPool支持的JBoss ServiceMBean。它需要引用JMS QueueConnectionFactory和JMS响应队列。
为了处理请求超时,我建议您创建一个计划任务,每个调制解调器一个,以调制解调器ID命名。发送请求时,任务将在超时时间延迟后安排执行。当ResponseHandler收到响应时,ResponseHandler会对响应进行排队,然后取消指定的任务。如果超时期限没有取消,则计划任务执行并对另一个请求进行排队(重新安排超时任务)。
我想,说起来容易做起来难,但我希望这会有所帮助。
//尼古拉斯