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 ...
随机推荐
- 51 Nod 1500 苹果曼和树(树形dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1500 思路: 树形dp. 我们考虑当前结点 i ,对于结点 i ,它可以 ...
- hdu 1251 trie树
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Problem De ...
- 在 if 条件句中使用向量
上述例子的函数中,都只输入了单一值.如果我们提供一个向量,那么这个函数将产生警告,这是因为 if 语句不能与多值向量共存.check_ _positive(c(1,-1,0))## Warning i ...
- Android安装包apk文件在某些版本操作系统上安装解析包出错问题的解决办法
当我们将Android升级功能的中的下载新版本apk文件存放在data/data/xxx.apk位置时,在有的些版本的手机中安装可能会出现安装包解析出错的问题,对于该问题的解决方案是提升该文件的权限. ...
- BooStrap4文档摘录 2 Content, Component
Content Reboot:从新写了主要元素的排列. 本章讲了各种元素及其相关的类. ⚠️ 文档左上角有搜索栏. Components Alert✅ Badge✅ Button✅和Button gr ...
- 2-14-1 MySQL基础语句,查询语句
一. SQL概述 结构化查询语言(Structured Query Language)简称SQL 1. 它是一种特殊目的的编程语言 2. 它还是一种数据库查询和程序设计语言 (用于存取数据以及查询.更 ...
- HDU 2553 状态压缩
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 3695 10 福州 现场 F - Computer Virus on Planet Pandora 暴力 ac自动机 难度:1
F - Computer Virus on Planet Pandora Time Limit:2000MS Memory Limit:128000KB 64bit IO Format ...
- 通过命令启动一个activity(am pm 命令)
一.am的含义是activityManager 主要作用是启动activity.service .broadcast 1.通过adb命令启动acitvity,首先需要设置activity 的 e ...
- 第十一次作业 - Alpha 事后诸葛亮
拖鞋旅游队团队事后诸葛亮会议 前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10054510.html 时间:2018-12-1 20:00 地 ...