VM 协议
协议语法:vm://logicalname
Javadocs:org.codehaus.activemq.transport.vm
VM 协议允许客户端在 VM 内部相互连接,而无需网络通信的开销。所使用的连接不是套接字连接,而是某种虚拟连接,它允许嵌入式消息传递系统。
需要注意的是,JMS ObjectMessage 实例中的对象是通过序列化传输的,而不是通过引用传输。这听起来可能令人惊讶,但有充分的理由这样做。
- 在一个设计良好的 J2EE 应用服务器(从生产角度来看)中,您通常有一个类加载器层次结构,它允许 EAR 和 WAR 彼此之间以及与服务器内部使用的第三方库之间完美隔离。如果您的客户端位于不同的、隔离的类加载器层次结构中,那么共享引用将导致 ClassCastException。因此,它 **必须** 被序列化。
- 如果您要通过引用发送对象,它将被一个 ObjectMessage 包装。然后将没有任何东西阻止您在发送它之前进一步修改该对象。这听起来可能不像问题,但 TCK 测试正是针对这种情况,这意味着您的 JMS 实现将不符合 J2EE 规范。因此,该对象 **必须** 被序列化。
如果在您的应用程序中发送消息时,VM 内 JMS 性能是一个问题,并且您知道您的消息传递边界在您的类加载器范围内受限,那么您可以完美地考虑一个超快的 VM 协议,它可以通过引用发送消息。目前,由于上述原因,ActiveMQ Classic 中不存在这样的协议。