JMS阶段性总结

写在开头 从一开始接触JMS到现在已经有一个多月了,看完了《ActiveMQ In Action》还有《Java消息服务》这两本书,也有一点心得。 不过最近的一段时间是期中考试,所以很多的时间耽搁了。所以到现在才开始书写这篇文章。 首先一点,为什么要使用JMS 很多时候,我们的程序并不需要使用JMS,或者说消息机制并不需要使用到这个技术,常常使用方法的相互调用即可实现,但为什么需要使用JMS。其实很大程度上是为了追求水平的扩展。举个例子,如果一个服务,或者是一个业务,需要频繁的调用一段函数,而这个函数会形成阻塞,我们肯定会使用分布式的方法进行横向的扩展。 还有一个重要的原因就是解藕。之前,我们的业务系统都耦合在一个程序中,我们需要进行一定的解藕,重新基于消息进行架构,所以,我们采用了JMS。用来进行业务上的解藕。 简单的说,生产者只负责生产消息,并且将消息务必送达消息中间件,而消息中间件的作用就是进行消息的持久化,并且在客户端连接上来的情况下,保证消息的务必送达。并且对没有及时处理的消息进行提示,然后人工介入进行处理。 不过有一点,如果是为了在纯Java系统之间进行消息传递,则还可以使用RMI的方式。不一定要使用JMS。 还有一点,JMS之所以是一个接口的集合,而不是一个实现方法,我认为,前人一定是注重这样一种设计方式,而不是具体的实现,也就是说,学习JMS,更重要的是这中间的一系列的思想,而不仅仅是几个工具的使用。这也是我看JMS的原因。 之前的想法 在所谓的JMS系统开发中,我们常常会有一个需求,就是消息发送端需要了解客户端是否已经收到消息,来确保接下来的业务逻辑不会出现大的错误, 假设我们没有使用JMS协议,而是我们自己进行编写消息传递的消息协议,用来确保消息的传递。举一个最简单的例子,我们就可以模仿TCP/IP的 三次握手协议,在每次进行消息传递的时候进行握手操作,并且在之后进行一个放手协议。这样,我们的消息发送方就可以了解到目前业务的进展 情况,并且进入下一步的操作当中。 但是,这样还是会带来一个问题,就是当消息发送之后,客户端接受了,然后进行处理,此时, 网络断了,死机了,怎么办?简单的办法,做一个 超时检测,如果在一定时间没有回复,则认为发送失败。于是进行重发。可行。但是又有一个新的问题,如果一个消息有大概三个操作,客户端在 完成一个操作之后,断开连接,然后新的消息传递到,又需要进行第一步操作,发现是已经完成的,然后常见的程序写法会认为任务已经做完,然后…