怎样通过HTTP来调用JMS

06-08-15 nepalon

我们要做的系统是一个c/s,即swing作为gui的系统,通过webstart来进行了发布。与b/s不同,这会涉及到client端调用server端的接口(EJB)、服务端调用客户端的接口(JMS的MessageListener)的问题。

EJB默认用的是Rmi-iiop协议的,通过HttpTunnel可以实现通过Http协议来进行了远程调用。实现原理其实就是在Client端通过动态代理来拦截EJB调用,把相应的调用信息发送到在Server端的一个Servlet中,再在这个Servlet中来调用Server中的具体EJB。

但这只处理了EJB的远程调用问题,JMS的还没有处理。我们的系统server端注册了在client端的MessageListener用于刷新GUI的消息列表。此时如果开了防火墙且屏蔽了EJB的相应端口(如只开了80端口),那么就不能调用到相应的MessageListener了。现在想象远程调用EJB那样实现一个可以通过HTTP来调用JMS的Tunnel,不知有没有人实现过?

有个商业软件JProxy实现了这样的功能,但是是要收费的。

如果有人做过,原理是怎样的?有没有开源的或现成的代码?

多谢!

banq
2006-08-21 10:14

>通过HttpTunnel可以实现通过Http协议来进行了远程调用

JdonFramework也可以实现,而且,可以结合AOP拦截器,在servlet动态加入缓存拦截器等,优化批量查询,这比单独使用HttpTunnel好处要多。严重推荐。

对于JMS情况,提出如下方案:你在client通过http时刻查询服务器某个状态,如果服务器状态更改(MessageListener激活导致),更新客户端。

也就是说:模拟AJAX原理,在客户端和服务器端之间实现异步机制,两个异步机制结合在一起就可以了。

nepalon
2006-08-25 15:09

多谢banq的回答。

目前我们也是这么做的。但好象与用JMS的初衷不一样了。用JMS,是想通过发消息后,把相应的消息“推”给用户。如果象现在这样通过客户端线程去取,那就和不用JMS没什么区别了,反正都是把数据放入DB中,然后客户端去DB中取数据。不知banq有什么见解?

由于是第一次用JMS,顺便问两个问题:

1、JMS的应用场景是什么?从我们目前的应用来看:发一个消息时,先把它保存到DB中,再通过JMS发广播这个消息到各个客户端,这是我们的初衷。但由于协议问题,现在是通过客户端线程来从DB中取消息,所以其实不用JMS也没什么关系。这就让我产生一个问题:在一个非集群、非分布式的B/S(或别的)系统中,用JMS来做些什么,如果只是用它来把消息保存到DB中,那完全可以直接用ejb来实现,为什么还要用JMS?

2、对于用HTTPTunnel的方案,我有下面一个想法:在每个客户端实现一个SocketServer,后台的MessageListener来向各个订阅了消息的客户端所的SocketServer来发送消息。不知这样是否可取?

banq
2006-08-25 16:19

>用JMS来做些什么

主要做一些大负荷量处理;backend和全国分布系统的数据统一和备份;应付短时巨量访问。

以前我也认为JMS的推作用非常好,但是现在不会将JMS作为推来使用,推可以使用RMI+Http等方式。

>每个客户端实现一个SocketServer

是可以,方案复杂,类似P2P了,到时能不能及时推到客户端,还很难说。