JSM学习笔记(只是为了记录just for 随记)
一、jsm:(java message service )java 消息服务,用于两个应用程序之间或者分布式系统之间进行消息的异步收发,是一个与具体平台无关的API,类似于JDBC(java database connectivity)。
二、点对点模型(pint to point)和发布订阅模型(publish/subscribe)
点对点模型:
发布订阅模型:
三、point to point 点对点消息模型特点:每条消息只能被一个消费者消费,当消费者消费消息之后需要向消息队列做应答即收到了消息这样这条消息就会在队列中消失,别的消费者就不能再消费这条消息了;publish/subscribe发布订阅的特点:每条消费者可以有多个消费者,即每条消息可以被多个消费者订阅;
四、消费消息的方式:
(同步消费):订阅者或者消费者调用receive方法来接收消息,receive方法在接收到消息之前将一直是阻塞的;
(异步消费):订阅者或者消费者注册一个消息监听器,当消息到达之后系统自动调用监听器的onmessage方法;
应用程序A将消息发送到服务器,然后应用程序B从服务中获取消息。
五、开始进行demo之路:
1、消息中间件activeMQ(MQ:MessageQueue 消息队列)的安装,下载zip解压即可
消息中间件的用途和特点:
1、建立网络通道,消息的可靠传输(不重复不丢失),实现跨平台。
activeMQ下载官方地址:http://activemq.apache.org/
我下载的activeMQ版本是5.15.2
目录的:
bin 存放脚本文件
conf 存放基本配置文件
data 存放的是日志文件
docs 存放说明文档
examples 存放简单的实例
lib 存放activeMQ所需的jar包
webapps 存放项目的目录
activemq-all-5.15.2.jar是在项目中用到activemq的时候直接将这个jar包导入就可以了
2、启动activeMQ
打开bin目录下可以看到有win32 和win64 两个文件夹,根据你电脑的操作系统来选择,打开文件夹,双击 activemq.bat
图中有我们activemq的按装地址 和浏览器访问的地址localhost:8191 账号:admin 密码:admin
activeMQ的tcp连接端口是61616 可以在dows命令行的执行netstat -ano|findstr “61616”看是都启动成功
在浏览器输入localhost :8161 点击broker输入用户名和密码看到下面皆可以了
3、一个简单point to point 的activeMQ 的demo
使用eclipse建立一个java项目:在项目中导入activeMQ的依赖包在我们下在的activeMQ解压包里可以找到
JSMProducer.java
package com.zrr.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;
import org.apache.activemq.camel.component.ActiveMQComponent;/*** 生产者(发送消息)* @author Admin**/
public class JSMProducer {//默认连接用户名private static final String userName=ActiveMQConnection.DEFAULT_USER;//默认连接密码private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;//默认连接地址private static final String brokerUrl = ActiveMQConnection.DEFAULT_BROKER_URL;//发送消息数量private static final int sendNum = 5;public static void main(String[] args){//连接工厂ConnectionFactory connectionFactory;//连接Connection connection = null;//会话 消息发送或者接收的线程Session session;//消息的目的地Destination destination;//消息生产者MessageProducer messageProducer;//实例化连接工厂connectionFactory = new ActiveMQConnectionFactory(userName, password, brokerUrl);try{//通过连接工厂获取连接connection = connectionFactory.createConnection();//启动连接connection.start();//创建sessionsession = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);//创建一个名为HelloWorld的消息列队destination = session.createQueue("point_demo");//消息生产者messageProducer = session.createProducer(destination);//发送消息sendMessage(session,messageProducer);//session.commit();}catch(Exception e){e.printStackTrace();}finally{if(connection !=null){try {connection.close();} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}/*** 发送消息* @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);}}
}
JSMComsumer
package com.zrr.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;/*** 消费者(消息的接收者)* @author Admin**/
public class JSMConsumer {private static String userName = ActiveMQConnection.DEFAULT_USER;//默认用户名private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;//默认密码private static final String brokerUrl = ActiveMQConnection.DEFAULT_BROKER_URL;//默认连接地址public static void main(String[] args) {// TODO Auto-generated method stubConnectionFactory connectionFactory;//链接工厂Connection connection;//连接Session session;//会话(接收者或者发送者的消息线程)Destination destination;//消息目的地MessageConsumer messageConsumer;//消息消费者//实例化连接工厂connectionFactory = new ActiveMQConnectionFactory(userName, password, brokerUrl);try{//通过连接工厂获取连接connection = connectionFactory.createConnection();//启动连接connection.start();//创建会话session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建一个连接HelloWorld的消息列队 这里连接 的消息列队必须和消息生产者的消息列队是一样的不然消费者是找不到消息队列的destination = session.createQueue("point_demo");//创建消息消费者messageConsumer = session.createConsumer(destination);while(true){TextMessage textMessage = (TextMessage) messageConsumer.receive(100000);if(textMessage != null){System.out.println("打印收到的消息:" + textMessage.getText());}else {break;}}}catch(Exception e){e.printStackTrace();}}}