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 ...
随机推荐
- ZOJ 3769 Diablo III(分组背包)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3769 题意:有13种装备,每种装备值可以穿戴一种,特殊的就是双手武器和单手 ...
- iOS线程之——NSCondition
多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线 ...
- (GoRails) Credential
之前的博客:https://www.cnblogs.com/chentianwei/p/9167489.html Guide: https://guides.rubyonrails.org/secu ...
- HDU1598 并查集+贪心
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- IOS-详解KVO底层实现
一.KVO (Key-Value Observing) KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现.也是 Cocoa Binding 的基础.当被观察对 ...
- 《免费前端教程不会告诉你这些》知乎LIVE读后感
这个是昨天偶然间在知乎上看到的一个知乎LIVE,答题就是音频在线直播吧,我试听了一下觉得分享的还不错,就买了完整的.主讲人叫方应杭,貌似是个挺牛逼的程序猿,之前没有听过,但这是个典型的科班出生的程序员 ...
- BZOJ3707 圈地
只会O(n ^ 3)路过= = OrzOrzOrzOrzOrz "出题人题解: 显然,这时候暴力枚举会T.于是我们转变一下思路,如果我们确定了2个点以后,第三个点有必要去盲目的枚举吗?答案是 ...
- OCX组件
转自:http://blog.sina.com.cn/s/blog_4ca9ceef0100ixzb.html 一.OCX(OLE Control Extensio,OLE Object Linkin ...
- Java Mongodbjar包下载网址
http://mongodb.github.io/mongo-java-driver/
- asp.net验证码图片生成示例
验证码,一个很常见的东西.不管你是使用者还是开发者,这个东西80%的人都见到过,但是之前有人给我说过这么一句话“内行看门道,外行看热闹!”,仔细琢磨一下还真的是那么一回事.对于怎么实现验证码,闲话不多 ...