java之JMS
一、简介:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
二、JMS对象模型包含如下几个要素:
//初始化工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
//设置链接地址
activeMQConnectionFactory.setBrokerURL("tcp://localhost:61616");
//创建链接
Connection connection = activeMQConnectionFactory.createConnection();
//启动服务
connection.start();
3)我这里简单写了一个activemq的具体实现过程,供参考
a、目录结构和依赖包

<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.4</version>
</dependency>
b、核心功能,消息处理中心
package com.pinnet.center; import com.pinnet.consumer.queue.Queue;
import com.pinnet.consumer.topic.Topic1;
import com.pinnet.consumer.topic.Topic2;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQObjectMessage; import javax.jms.*;
import java.io.Serializable; public class MessageCenter { private static Session session; public static void init() throws JMSException {
initConnection();
initRegister();
} private static void initConnection() throws JMSException {
//初始化工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
//设置链接地址
activeMQConnectionFactory.setBrokerURL("tcp://localhost:61616");
//创建链接
Connection connection = activeMQConnectionFactory.createConnection();
//创建会话
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//启动服务
connection.start();
} /**
* 用于注册对应消息队列
* @throws JMSException
*/
public static void initRegister() throws JMSException {
registerQueue(QueueType.QUEUE, new Queue());
registerTopic(TopicType.TOPIC, new Topic1());
registerTopic(TopicType.TOPIC, new Topic2());
} /**
* 注册topic监听
* @param topicType
* @param messageListener
* @throws JMSException
*/
public static void registerTopic(TopicType topicType, MessageListener messageListener) throws JMSException {
//将会话转成topic
TopicSession topicSession = (TopicSession) session;
//创建订阅者
TopicSubscriber topicSubscriber = topicSession.createSubscriber(topicSession.createTopic(topicType.name()));
//设置监听
topicSubscriber.setMessageListener(messageListener);
} /**
* 注册queue监听
* @param queueType
* @param messageListener
* @throws JMSException
*/
public static void registerQueue(QueueType queueType, MessageListener messageListener) throws JMSException {
//将会话转成queue
QueueSession queueSession = (QueueSession) session;
//创建接收者
QueueReceiver queueReceiver = queueSession.createReceiver(queueSession.createQueue(queueType.name()));
//设置监听
queueReceiver.setMessageListener(messageListener);
} /**
* 发送topic消息
* @param topicType
* @param serializable
* @throws JMSException
*/
public static void sendMessageTopic(TopicType topicType, Serializable serializable) throws JMSException {
TopicSession topicSession = (TopicSession) session;
//创建发布者
TopicPublisher topicPublisher = topicSession.createPublisher(topicSession.createTopic(topicType.name()));
//这里数据发布形式采用ObjectMessage
ActiveMQObjectMessage activeMQObjectMessage = new ActiveMQObjectMessage();
activeMQObjectMessage.setObject(serializable);
//发布消息
topicPublisher.publish(activeMQObjectMessage);
} /**
* 发送queue消息
* @param queueType
* @param serializable
* @throws JMSException
*/
public static void sendMessageQueue(QueueType queueType, Serializable serializable) throws JMSException {
QueueSession queueSession = (QueueSession) session;
//创建发送者
QueueSender queueSender = queueSession.createSender(queueSession.createQueue(queueType.name()));
ActiveMQObjectMessage activeMQObjectMessage = new ActiveMQObjectMessage();
activeMQObjectMessage.setObject(serializable);
//发送消息
queueSender.send(activeMQObjectMessage);
} //使用枚举的目的是更好的管理
public enum TopicType {
TOPIC
} public enum QueueType {
QUEUE
}
}
c、消息处理抽象类
package com.pinnet.consumer; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import java.io.Serializable; /**
* 抽象类的目的是,让编写者,只管处理消息,不用管理中间过程
*/
public abstract class MessageConsumer implements MessageListener { public void onMessage(Message message) {
try {
ObjectMessage objectMessage = (ObjectMessage) message;
handleMessage(objectMessage.getObject());
} catch (JMSException e) {
e.printStackTrace();
}
} //实现类处理对应消息
public abstract void handleMessage (Serializable serializable);
}
d、2个实现类型
package com.pinnet.consumer.queue;
import com.pinnet.consumer.MessageConsumer;
import java.io.Serializable;
public class Queue extends MessageConsumer {
/**
* 消息处理
* @param serializable
*/
public void handleMessage(Serializable serializable) {
System.out.println(serializable+"queue");
}
}
package com.pinnet.consumer.topic;
import com.pinnet.consumer.MessageConsumer;
import java.io.Serializable;
public class Topic1 extends MessageConsumer {
/**
* 消息处理
* @param serializable
*/
public void handleMessage(Serializable serializable) {
System.out.println(serializable+"topic1");
}
}
package com.pinnet.consumer.topic;
import com.pinnet.consumer.MessageConsumer;
import java.io.Serializable;
public class Topic2 extends MessageConsumer {
/**
* 消息处理
* @param serializable
*/
public void handleMessage(Serializable serializable) {
System.out.println(serializable+"topic2");
}
}
e、测试:
package com.pinnet;
import com.pinnet.center.MessageCenter;
import javax.jms.JMSException;
public class Main {
public static void main(String[] args) throws JMSException, InterruptedException {
MessageCenter.init();
while (true) {
MessageCenter.sendMessageQueue(MessageCenter.QueueType.QUEUE, "queue");
MessageCenter.sendMessageTopic(MessageCenter.TopicType.TOPIC, "topic");
Thread.sleep(5000);
}
}
}

六、我这里是采用纯代码的方式,在spring中jmsTemplate的应用,就像session一样,就可以。
springmvc的配置方式参考:https://www.cnblogs.com/ll409546297/p/6898155.html
配置方式也可以采用activemq的工厂连接模式一样实现
java之JMS的更多相关文章
- JAVA消息 JMS 很重要
首先大致讲一下,java 消息模块 消息,个人理解分为两种:1.同步消息(RPC调用) 2.异步消息(本篇讲解部分) 一.同步消息java提供了多种方案: 最新比较常用的方式就是spring Http ...
- JMS与MQ详解(有项目)
<一>m2mGW项目 1.ActiveMQ概述 企业消息软件从80年代起就存在,它不只是一种应用间消息传递风格,也是一种集成风格.因此,消息传递可以满足应用间的通知和互相操作.但是 ...
- 常见JAVA框架
Spring Framework [Java开源JEE框架] Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不 ...
- java bean 转换工具
考量要素: 1.简单的约定优于配置的同名属性copy 2.嵌套属性copy 3.flattern(扁平化)支持,要支持N层结构的copy到一层结构. 4.性能 如下这个网页,里面提到了好多工具. ht ...
- ActiveMQ学习笔记(一) JMS概要
(一)什么是JMS jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- Java开源项目(备查)
转自:http://www.blogjava.net/Carter0618/archive/2008/08/11/221222.html Spring Framework [Java开源 J2EE框 ...
- Java程序版权保护解决方案
通常C.C++等编程语言开发的程序都被编译成目标代码,这些目标代码都是本机器的二进制可执行代码.通常所有的源文件被编译.链接成一个可执行文件.在这些可执行文件中,编译器删除了程序中的变量名称.方法名称 ...
- java多线程心得
多并发的时候,在什么情况下必须加锁?如果不加锁会产生什么样的后果. 加锁的场景跟java的new thread和Runnable的关系是什么? 看看java的concurrentMap源码. 还有sp ...
- OSCHina技术导向:Java WEB企业门户平台Liferay
Liferay 是一个完整的门户解决方案,基于J2EE的应用,使用了EJB以及JMS等技术,前台界面部分使用Struts MVC 框架,基于XML的portlet配置文件可以自由地动态扩展,使用了We ...
随机推荐
- BZOJ 3238 【AHOI2013】 差异
题目链接:差异 写题时发现这道题当初已经用后缀数组写过了……但是既然学了后缀自动机那就再写一遍吧…… 观察一下题目所给的式子:\[\sum_{1\leqslant i < j \leqslant ...
- 51nod 1040 最大公约数的和 欧拉函数
1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 给出一个n,求1-n这n个数,同n的最大公约数 ...
- tp5集成淘宝,微信,网易,新浪等第三方登录
tp5集成淘宝,微信,网易,新浪等第三方登录 一.总结 一句话总结: 接口 链接 实现的话就是这些平台给的一个接口(链接),你通过这些接口登录进去之后,它会给你返回用户名,头像之类的信息,我们的网站存 ...
- 递归--练习1--noi3089爬楼梯
递归--练习1--noi3089爬楼梯 一.心得 根据输入,是要写连续输入多个值的程序 二.题目 3089:爬楼梯 总时间限制: 1000ms 内存限制: 65536kB 描述 树老师爬楼梯,他可 ...
- DataReader 绑定DataGridView有两种方式
第一种:借助于BindingSourcesqlDataReader Sdr=通过查询函数得到的sqlDataReader类型的数据;BindingSource Bs=new BindingSource ...
- POJ 3126 primepath bfs
题目链接:http://poj.org/problem?id=3126 题意:1维的坐标轴,给出起点和终点,求从起点到终点变换经历的最短的步数.起点,终点和中间变换的数字都是4位,而且都是质数. 思路 ...
- hdu 3268 09 宁波 现场 I - Columbus’s bargain 读题 最短路 难度:1
Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera ...
- jsr303 参考表
下面是主要的验证注解及说明: 注解 适用的数据类型 说明 @AssertFalse Boolean, boolean 验证注解的元素值是false @AssertTrue Boolean, boole ...
- Android 遍历全国的地区二(获取天气)
根据上次的内容 1. 界面布局 weather_layout.xml <LinearLayout xmlns:android="http://schemas.android.com/a ...
- 用Ant手动打包android程序,android分包机制解决65536方法过多异常
Android利用ant手动打包 首先我们要给自己的IDE eclispe配置ant,默认的eclipse是集成了ant构建工具的,但是google提供的Android集成开发工具ADT,里面封装了E ...