JMS是什么?
JMS Java Message Service,Java消息服务,是java EE 的一种技术
JMS规范
JMS定义了java中访问消息中间件的接口,并没有给予实现,实现JMS接口的消息中间件称为JMS provider,例如ActiveMQ
JMS provider:实现JMS接口和规范的消息中间件
JMS message:JMS的消息,JMS消息由一下三部分组成
1:消息头:每个消息头字段都有相应的getter和setter方法
2:消息属性:如果需要除消息头字段以外的值,那么可以使用消息属性
3:消息体:封装具体的消息数据
JMS producer:消息生产者,创建和发送JMS消息的客户端应用。
JMS consumer:消息消费者,接收和处理JMS消息的客户端应用。
消息的消费者可以采用以下两种方法之一:
1.同步消费:通过调用消费者的receive方法从目的地中显式提取消息,receive 方法可以一直阻塞到消息到达
2.异步消费:客户可以为消费者注册一个消息监听器,以定义在消息到达时所采取的动作
JMS domains:消息传递域,JMS规范中定义了两种消息传递域:点对点(PTP)消息传递域和发布/订阅消息传递域(publish/subscribe)简写(pub/sub)
1.PTP消息传递域特点如下:
1。每个消息只能有一个消费者。
2。消息的生产者和消费者之间没有时间上的相关性,无论消费者在生产者发送消息的时候是否处于运行状态,他都可以提取消息。
2.发布/订阅消息传递域特点如下:
1。每个消息可以有多个消费者。
2。生产者和消费者有时间上的相关性,订阅一个主题的消费者只能消费自他订阅之后的消息。JMS规范允许客户创建持久订阅,在一定程度上放松了时间上相关性要求,持久订阅允许消费者消费他在未处于激活状态时发送的消息。
3,。在点对点消息传递域中,目的地被称为队列(queue),在发布/订阅消息传递域中,目的地被称为主题。
话不多说,上代码:
PTP消息传递域:
package com.java.activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
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;
/**
* 生产者
* @author zzg
*
*/
public class JMSProducer {
private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;
private static int SENDNUM=10;//发送的消息数量
public static void main(String[] args) throws JMSException {
ConnectionFactory factory;
Connection conn;
Session session;
Destination destination;//消息目的地
MessageProducer messageProducer;//消息生产者
factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
conn = factory.createConnection();//创建连接
conn.start();//启动连接
session = conn.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("first queue 1");//创建消息队列
messageProducer = session.createProducer(destination);//创建消息生产者
sendMessage(session, messageProducer);//开始发送消息
session.commit();//提交事物
conn.close();//关闭连接
}
/**
* 发送消息
* @param session
* @param messageProducer
* @throws JMSException
*/
public static void sendMessage(Session session,MessageProducer messageProducer) throws JMSException{
for(int i=0;i<SENDNUM;i++){
TextMessage message = session.createTextMessage("activeMQ 发送的消息"+i);
System.out.println("发送消息:"+"ActiveMQ 发送的消息"+i);
messageProducer.send(message);
}
}
}
package com.java.activemq;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* 消息监听
* @author zzg
*
*/
public class Listener implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println("收到的消息:"+ ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
package com.java.activemq;
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.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 消费者
* @author zzg
*
*/
public class JMSConsumer {
private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
Connection conn = factory.createConnection();// 创建连接
conn.start();//启动连接
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建session
Destination destination = session.createQueue("first queue 1");//消息目的地
MessageConsumer messageConsumer = session.createConsumer(destination);//创建消费者
while(true){
TextMessage textMessage = (TextMessage)messageConsumer.receive(100000);
if(textMessage != null){
System.out.println("接收到的消息:"+textMessage.getText());
}else{
break;
}
}
}
}
package com.java.activemq;
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.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 消费者
* 第二种方式:常用
* 使用监听方式
* @author zzg
*
*/
public class JMSConsumer2 {
private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) {
ConnectionFactory factory;
Connection conn;
Session session;
Destination destination;//消息目的地
MessageConsumer consumer;
factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
try {
conn = factory.createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("first queue 1");
// Destination destination;//消息目的地
consumer = session.createConsumer(queue);
consumer.setMessageListener(new Listener());//注册监听
} catch (JMSException e) {
e.printStackTrace();
}
}
}
发布/订阅消息传递域
package com.java.activemq2;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 发布者-一对多
* 测试顺序:先订阅、再发布(先启动两个consumer ,在启动producer)
* @author zzg
*
*/
public class JMSProducer {
private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;
private static int SENDNUM=10;//发送的消息数量
public static void main(String[] args) throws JMSException {
ConnectionFactory factory;
Connection conn;
Session session;
Destination destination;
MessageProducer producer;
factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
conn = factory.createConnection();
conn.start();
session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic("first topic 1");
producer = session.createProducer(destination);
sendMessage(session, producer);
session.commit();
conn.close();
}
/**
* 发送消息
* @param session
* @param messageProducer
* @throws JMSException
*/
public static void sendMessage(Session session,MessageProducer messageProducer) throws JMSException{
for(int i=0;i<SENDNUM;i++){
TextMessage message = session.createTextMessage("activeMQ 发送的消息"+i);
System.out.println("发布消息:"+"ActiveMQ 发布的消息"+i);
messageProducer.send(message);
}
}
}
package com.java.activemq2;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* 消息监听
* @author zzg
*
*/
public class Listener1 implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println("订阅者一收到的消息:"+ ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
package com.java.activemq2;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 订阅者一
* @author zzg
*
*/
public class JMSConsumer1 {
private static String USERNAME=ActiveMQConnection.DEFAULT_USER;
private static String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;
private static String BROKERURL=ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) {
ConnectionFactory factory;
Connection conn;
Session session;
Destination destination;//消息目的地
MessageConsumer consumer;
factory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
try {
conn = factory.createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic("first topic 1");
consumer = session.createConsumer(destination);
consumer.setMessageListener(new Listener1());
} catch (JMSException e) {
e.printStackTrace();
}
}
}