1. JMS基本认识
jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。(百度百科)
从这个介绍可以看出, jms就是用来进行消息服务和通信的。
更多关于JMS概念的东西可以百度、google
1.1 JMS的使用场景
关于JMS的使用场景,去个简单的例子,我们通常见到的站内信息,很多就是用JMS实现, 使用消息队列来实现,由于是异步的接受消息,发送消息之后就不用一直等待回信。 一个不太恰当的比喻,就像我们发送短息给别人一样,不用管他是否开机或者怎么的,等他收到信息,我们就是有提示。类似吧。
在java 中,java消息队列使用的场景可参考下面这为大神的总结,
1.2 JMS的技术选型
实现JMS的规范的中间件有很多, 在项目和实际开发中使用何种中间件呢,这个就要看自己的需求和团队的情况了,关于技术选型,请看下面这位大神
2. 如何使用
明白了JMS是什么,能用来干什么,什么情况下用什么之后, 就该看看是如何来使用的了
这里就一activeMQ为例,本人自己学习的时候主要是学习的activeMQ,想到这里也感谢网上的朋友无私奉献自己的学习成果,才使得我对这个知识点能够有些了解。
2.1 ActiveMQ的几种通信方式
在activeMQ中主要有两种通讯方式:
- P2P(Point to Point,点对点模式)
- publish-subscribe(发布订阅模式)
- 使用对生产者和消费者的改造,实现request-response 请求相应模式
在p2p模式中主要是创建消息队列,一条消息被一个消费消费之后就不能再被选其他的消费者消费了,
使用session.createQueue() 器模型为(以下模型图片均出自 http://shmilyaw-hotmail-com.iteye.com/blog/1897635 版权归此链接文章的作者所有,如要了解详细分析,可查看原文)
发布订阅模式,这个过程中主要是创建一个Topic,一个Topic可以被多个的消息消费这接受,使用seesion.createTopic()模型如下:
第三种的话,就是如果需要实现请求响应的方式的话, 把生产和消费者进行改造来实现,模型如下:
在JMS里面,如果要实现请求/应答的方式,可以利用JMSReplyTo和JMSCorrelationID消息头来将通信的双方关联起来。另外,QueueRequestor和TopicRequestor能够支持简单的请求/应答过程。
2.2 activeMQ实现实例
activeMQ,在我写这个笔记的时候已经发布到 5.11.0版本了,这个版本要求使用的JDK版本为1.7,我在官网看了下, 大概在5.7之后的版本都要求1.7的JDK才可以的。下面下说下activeMQ的使用步骤
- 在官方网站现在activemq后安装
- 按找doc文件夹里面的方式,命令行启动activemq
cd /安装目录/bin
activemq.bat start
- 1
- 2
- 3
执行者两条命令。启动服务器,在浏览器中查看消息控制台,输入:
http://127.0.0.1:8161/admin
3.实现消息生产者和消费者的代码
2.2.1 代码实现
按照JMS的规范,我们首先需要获得一个JMS connection factory.,通过这个connection factory来创建connection.在这个基础之上我们再创建session, destination, producer和consumer,具体步骤:
一个简单代码如下:
Producer
package fun.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;
public class Sender {
private static final int SEND_NUMBER = 5;
public static void main(String[] args) {
//连接工厂
ConnectionFactory connectionFactory;
//消息连接
Connection connection = null;
//发送消息的进程
Session session;
//发送消息的目的地
Destination destination;
//消息生产者
MessageProducer producer;
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("FirstQueue");
producer = session.createProducer(destination);
SendMsg(session, producer);
session.commit();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(null!= connection)
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
public static void SendMsg(Session session,MessageProducer producer) throws Exception{
for (int i = 1; i <= SEND_NUMBER; i++) {
TextMessage message = session
.createTextMessage("ActiveMq 发送的消息" + i);
// 发送消息到目的地方
System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
producer.send(message);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
Consumer
package fun.activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Reciver {
public static void main(String[] args) {
//连接工厂
ConnectionFactory connectionFactory;
//消息连接
Connection connection = null;
//发送消息的进程
Session session;
//发送消息的目的地
Destination destination;
//消息消费者
MessageConsumer consumer;
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");
try {
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("FirstQueue");
consumer = session.createConsumer(destination);
while(true){
TextMessage textMassage = (TextMessage) consumer.receive(100000);
if(null != textMassage){
System.out.println("收到消息:"+textMassage.getText());
}else{
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(null!=connection){
connection.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
以上是一个点对点的实例,点启动reciver,然后运行sender就可以进行测试
第一部分笔记就这些,下一部分摸索下activemq和spring的整合
本文参考:
http://shmilyaw-hotmail-com.iteye.com/blog/1897635
http://blog.163.com/sir_876/blog/static/11705223201332444647261/
http://blog.csdn.net/nightelve/article/details/16827465
感谢这些朋友的分享,文中引用到上面作者的内容的地方,版权归上述文章作者所有