<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">JMS(Java消息中间件)</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
面向消息的中间件的API接口,用于在应用程序和分布式系统中发送消息,进行异步通信。
优点:
解决异构系统集成通信,缓解系统瓶颈,提高系统伸缩性,使得系统模块化、组件化更加灵活。
JMS群集使用角色:JMS消息提供者,JMS消息消费者
JMS消息提供者向服务器(ActiveMQ等)发送消息,然后JMS消息消费者从消息队列中消费消息对象。
JMS消息传递模式:点对点模式或者订阅者/发布者模式
点对点适用于一对一的消息传送,而发布/订阅模型则适用于消息组播的场景。
点对点:一对一消息传递。基于拉取和轮训消息传递模式,从队列中请求信息,而不是将消息推送到客户端,特别点接受者有且只有一个,即便有多个消息监听,也只有一个,基于这一点,JMS可以使用这种消息传递模式做负载均衡。注意:点对点模型允许接收者在接收消息前查看消息内容。
订阅/发布:消息组播场景。基于推送的消息传递模式,发布订阅模式可以有多种不同的订阅者,临时订阅者只在主动监听才接受消息,而持久订阅者则监听主题的所有消息,即使当前订阅者不可用,处于离线状态。
sender
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* (1)创建连接使用的工厂类JMS ConnectionFactory
* (2)使用管理对象JMSConnectionFactory建立连接Connection
* (3)使用连接Connection 建立会话Session
* (4)使用会话Session和管理对象Destination创建消息生产者MessageSender
* (5)使用消息生产者MessageSender发送消息
*/
public class JmsSender {
private ConnectionFactory connectionFactory = null;
private Connection connection = null;
private Session session = null;
private Destination destination = null;
private MessageProducer producer = null;
public JmsSender() {
super();
}
public void init() {
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.TRUE.booleanValue(),
Session.AUTO_ACKNOWLEDGE);
// Queue
destination = session.createQueue("xkey");
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
sendMessage(session, producer);
session.commit();
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (connection != null)
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
private void sendMessage(Session session, MessageProducer producer)
throws JMSException {
for (int i = 1; i <= 5; i++) {
TextMessage message = session
.createTextMessage("First ActiveMQ Test:::: " + i);
System.out.println("Sender:" + "First ActiveMQ Test::: " + i);
producer.send(message);
}
}
public static void main(String[] args) {
new JmsSender().init();
}
}
received
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* (1)创建连接使用的工厂类JMS ConnectionFactory
* (2)使用管理对象JMS ConnectionFactory建立连接Connection
* (3)使用连接Connection 建立会话Session
* (4)使用会话Session和管理对象Destination创建消息消费者MessageReceiver
* (5)使用消息消费者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver
*/
public class JmsReceiver {
private ConnectionFactory connectionFactory = null;
private Connection connection = null;
private Session session = null;
private MessageConsumer consumer = null;
private Destination destination = null;
public JmsReceiver() {
}
public void init() {
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.TRUE.booleanValue(),
Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("xkey");
consumer = session.createConsumer(destination);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message msg) {
TextMessage message = (TextMessage) msg;
try {
System.out.println("Receiver " + message.getText());
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
JmsReceiver jms = new JmsReceiver();
jms.init();
}
}