1、JMS基本组成部分
a、JMS服务提供者:我们使用的是activemq,它实现了JMS API 的服务器端的接口,完成诸如服务器到客户端的通信、服务器端消息的存储、客户信息的存储等等
b、JMS客户端:负责消息的发送和接收,需要自己实现
c、消息(Message):它是客户、服务器交互的载体。消息一般由某个客户应用程序创建,发送至服务器端指定的“目的地”;其它某客户应用程序连接此服务器,“消费”特定“目的地”中的消息。
d、管理对象:该对象是客户服务器交互的唯一“连接点”。JMS定义了两种类型的被管理对象:目的地对象(Destination)和连接工厂对象(ConnectionFactory)
2、JMS 消息传送方式
<1>QUEUE
消息生产者将消息发布到Qqueue中,在随后的操作中将会有消息消费者从该Qqueue中将消息消费掉。一旦消息消费掉,Qqueue中将不再存在他,因此其他消息消费者将不能够获得已消费的消息。注意,尽管Qqueue支持同时存在多个消息消费者,但对于单个的消息而言,仅仅会有一个消息消费者消费它。
<2>TOPIC
消息生产者(发布者)将消息发布到Topic中,与此同时将会有多个消息消费者(订阅者)消费发布到该Topic的消息。它与点对点不同,即发布到Topic的消息将会被所有已订阅该Topic的订阅者消费。注意,如果消息发往Topic中时,当时不存在消息监听者(即,订阅者不处于监听状态),则该消息将丢弃掉。但有一点特殊,如果某订阅者是持久订阅者,则该消息将保留到该持久订阅者消费掉该消息为止。
2、消息发送
/*初始化生产者*/
private void initialize() throws JMSException, Exception {
/*创建连接工厂*/
connectionFactory = new ActiveMQConnectionFactory(user, password, url);
/*创建连接*/
connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
/*消息发送地*/
destination = session.createTopic(subject);//queue方式 用方法createQueue
/*消息的生产者*/
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
connection.start();
}
/*发送消息*/
public void produceMessage(SimpleEmailMessage simpleEmailMessage)
throws JMSException, Exception {
//initialize();
TextMessage msg = session.createTextMessage(simpleEmailMessage
.getText());
producer.send(msg);
System.out.println("Producer:->Message sent complete!");
}
3、消息接收
/*初始化生产者*/
private void initialize() throws JMSException, Exception {
/*创建连接工厂*/
connectionFactory = new ActiveMQConnectionFactory(user, password, url);
/*创建连接*/
connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
/*消息发送地*/
destination = session.createTopic(subject);
/*消息的消费者*/
consumer = session.createConsumer(destination);
connection.start();
consumer.setMessageListener(this);//异步获取方式,需要实现MessageListener的onMessage方法 同步获取使用consumer.reveive();
}
/*接收消息*/
public void onMessage(Message message) {
logger.debug("从队列中接收信息");
if(message instanceof TextMessage){
TextMessage txtMsg = (TextMessage) message;
try {
converXMLMessageToSimpleEmailMessage(txtMsg
.getText());
this.sendEmail(simpleEmailMessage);
this.sendResultMessage(resultMessage);
}
catch (JMSException e) {
logger.error(""+e);
}
}
else{
logger.debug("message type"+message.toString());
if(message instanceof ActiveMQMessage){
ActiveMQMessage am = (ActiveMQMessage)message;
}
}
}
4、消息种类
包含要发送给接收应用程序的内容。每个消息接口特定于它所支持的内容类型。JMS为不同类型的内容提供了他们各自的消息类型,但是所有消息都派生自Message接口。
StreamMessage 一种主体中包含Java基元值流的消息。其填充和读取均按顺序进行。
MapMessage 一种主体中包含一组键--值对的消息。没有定义条目顺序。
TextMessage 一种主体中包含Java字符串的消息(例如,XML消息)。
ObjectMessage 一种主体中包含序列化Java对象的消息。
BytesMessage 一种主体中包含连续字节流的消息。