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 ...
随机推荐
- POJ 2391 Ombrophobic Bovines(二分+拆点+最大流)
http://poj.org/problem?id=2391 题意: 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T,使得在T时间内所有的牛都能进到某一牛棚里去. 思路 ...
- 带宽检测工具iftop
1.安装 # yum install iftop –y 2.使用 # iftop -i eth0 -n # iftop -i eth0 -P 说明: 中间的<= =>这两个左右箭头,表示的 ...
- 炫酷的CSS3抖动样式:CSS Shake
CSS Shake是一个使用CSS3实现的动画样式,使用SASS编写,利用它我们可以实现多种不同样式的抖动效果(如下面的GIF图像): 炫酷的CSS3抖动样式:CSS Shake 这是一个很微小的动画 ...
- 2018-2019-2《网络对抗技术》Exp0 Kali安装 Week1
2018-2019-2<网络对抗技术>Exp0 Kali安装 Week1 Kali的安装 设置虚拟机的名称和操作系统 为虚拟机分配虚拟内存,大小为4096M,分配存储空间,大小为25.0G ...
- Linux编写一个C程序HelloWorld
环境 需要文本编辑器和编译器,文本编辑器用linux(我用的centos7)自带的vi,编译器用gcc(GNU C Compiler/GNU Compiler Collection) 安装gcc,查看 ...
- Linux命令详解-type
type命令用来显示指定命令的类型. 一个命令的类型可以是如下之一 alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 ...
- 管道 && 消息队列 && 共享内存
http://blog.csdn.net/piaoairy219/article/details/17333691 1. 管道 管道的优点是不需要加锁. 缺点是默认缓冲区太小,只有4K. 一个管道只适 ...
- 十款效果惊艳的Html案例(一)
http://www.html5tricks.com/10-html5-image-effect.html
- 谈一谈手机WebApp的fixed属性(手机上的固定栏)【转】
1.iphone/android原生app常见结构 似乎,所有的手机应用,都遵循这样的布局:固定的顶部+固定的底部+可滚动在中间区域.这种“雷同”的模式让人恶心,却不得不承认这是一种很规矩却又很实用的 ...
- iOS面试准备之思维导图(转)
以思维导图的方式对iOS常见的面试题知识点进行梳理复习. 目录 1.UI视图相关面试问题 2.Runtime相关面试问题 3.内存管理相关面试问题 4.Block相关面试问题 5.多线程相关面试问题 ...