Destination:消息发送的目的地,也就是前面说的Queue和Topic。创建好一个消息之后,只需要把这个消息发送到目的地,消息的发送者就可以继续做自己的事情,而不用等待消息被处理完成。至于这个消息什么时候,会被哪个消费者消费,完全取决于消息的接受者。

Message:从字面上就可以看出是被发送的消息。它有下面几种类型:

  • StreamMessage:Java 数据流消息,用标准流操作来顺序的填充和读取。
  • MapMessage:一个Map类型的消息;名称为 string 类型,而值为 Java 的基本类型。
  • TextMessage:普通字符串消息,包含一个String。
  • ObjectMessage:对象消息,包含一个可序列化的Java 对象
  • BytesMessage:二进制数组消息,包含一个byte[]。
  • XMLMessage: 一个XML类型的消息。
  • 最常用的是TextMessage和ObjectMessage。

Session:与JMS提供者所建立的会话,通过Session我们才可以创建一个Message。

Connection:与JMS提供者建立的一个连接。可以从这个连接创建一个会话,即Session。

ConnectionFactory:那如何创建一个Connection呢?这就需要下面讲到的ConnectionFactory了。通过这个工厂类就可以得到一个与JMS提供者的连接,即Conection。

Producer:消息的生产者,要发送一个消息,必须通过这个生产者来发送。

MessageConsumer:与生产者相对应,这是消息的消费者或接收者,通过它来接收一个消息。

前面多次提到JMS提供者,因为JMS给我们提供的只是一系列接口,当我们使用一个JMS的时候,还是需要一个第三方的提供者,它的作用就是真正管理这些Connection,Session,Topic和Queue等。

 

ConnectionFactory---->Connection--->Session--->Message

Destination + Session------------------------------------>Producer

Destination + Session------------------------------------>MessageConsumer


ConnectionFactory和Destination 从哪儿得到?

这就和JMS提供者有关了。 如果在一个JavaEE环境中, 可以通过JNDI查找得到, 如果在一个非JavaEE环境中, 那只能通过JMS提供者提供给我们的接口得到了。

 

 

JMS Connection

Session createSession(boolean transacted, int acknowledgeMode) throws JMSException

  • transacted - indicates whether the session is transacted
  • acknowledgeMode - indicates whether the consumer or the client will acknowledge any messages it receives; ignored if the session is transacted. Legal values are Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE, and Session.DUPS_OK_ACKNOWLEDGE. 
  1. Session.AUTO_ACKNOWLEDGE为自动确认,客户端发送和接收消息不需要做额外的工作。
  2. Session.CLIENT_ACKNOWLEDGE为客户端确认。客户端接收到消息后,必须调用javax.jms.Message的acknowledge方法。jms服务器才会删除消息。
  3. Session. DUPS_OK_ACKNOWLEDGE允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。在需要考虑资源使用时,这种模式非常有效。