java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务

前言

之所以使用JNDI 是出于通用性考虑,该例子使用JMS规范提供的通用接口,没有使用具体JMS提供者的接口,这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ、HornetQ等)。

什么是JNDI:JNDI(Java Naming and Directory Interface)是一个标准规范,类似于JDBC,JMS等规范,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现,因此Tomcat就实现了JNDI 规范。

PTP(Point to point)消息模式(JMS的点对点消息传送)

1、使用Tomcat配置JNDI

找到Tomcat安装路径下的conf文件夹,打开context.xml,添加如下配置:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

View Code

2、启动ActiveMQ

bb6064f11044c3354c7a02f1ff789ada.png

3、编写一个Web工程

Eclipse上新建web工程,添加ActiveMQ依赖的jar包,然后开始编写两个Servlet,一个用于生产消息,另一个用于消费消息,如下代码:

消息生产者Servlet:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

import java.io.IOException;

import java.io.PrintWriter;

import javax.jms.DeliveryMode;

import javax.jms.Queue;

import javax.jms.QueueConnection;

import javax.jms.QueueConnectionFactory;

import javax.jms.QueueSender;

import javax.jms.QueueSession;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.naming.InitialContext;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;/**

* Servlet implementation class JMSTest*/@WebServlet("/Send")public classSend extends HttpServlet {private static final long serialVersionUID = 1L;/**

* @see HttpServlet#HttpServlet()*/

publicSend() {

super();//TODO Auto-generated constructor stub

}/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

* response)*/

protected voiddoGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

PrintWriterout =response.getWriter();try{//get the initial context

InitialContext context = newInitialContext();//lookup the queue object

Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");//lookup the queue connection factory

QueueConnectionFactory conFactory =(QueueConnectionFactory) context

.lookup("java:comp/env/queue/connectionFactory");//create a queue connection

QueueConnection queConn =conFactory.createQueueConnection();//create a queue session

QueueSession queSession = queConn.createQueueSession(false,

Session.DUPS_OK_ACKNOWLEDGE);//create a queue sender

QueueSender queSender =queSession.createSender(queue);

queSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//create a simple message to say "Hello World"

TextMessage message = queSession.createTextMessage("Hello World");//send the message

queSender.send(message);//print what we did

out.write("Message Sent:" +message.getText());//close the queue connection

queConn.close();

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

* response)*/

protected voiddoPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub

}

}

View Code

消息消费者Servlet:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

import java.io.IOException;

import java.io.PrintWriter;

import javax.jms.Queue;

import javax.jms.QueueConnection;

import javax.jms.QueueConnectionFactory;

import javax.jms.QueueReceiver;

import javax.jms.QueueSession;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.naming.InitialContext;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;/**

* Servlet implementation class Receive*/@WebServlet("/Receive")public classReceive extends HttpServlet {private static final long serialVersionUID = 1L;/**

* @see HttpServlet#HttpServlet()*/

publicReceive() {

super();//TODO Auto-generated constructor stub

}/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

* response)*/

protected voiddoGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

PrintWriterout =response.getWriter();try{//get the initial context

InitialContext context = newInitialContext();//lookup the queue object

Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");//lookup the queue connection factory

QueueConnectionFactory conFactory =(QueueConnectionFactory) context

.lookup("java:comp/env/queue/connectionFactory");//create a queue connection

QueueConnection queConn =conFactory.createQueueConnection();//create a queue session

QueueSession queSession = queConn.createQueueSession(false,

Session.AUTO_ACKNOWLEDGE);//create a queue receiver

QueueReceiver queReceiver =queSession.createReceiver(queue);//start the connection

queConn.start();//receive a message

TextMessage message =(TextMessage) queReceiver.receive();//print the message

out.write("Message Received:" +message.getText());//close the queue connection

queConn.close();

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

* response)*/

protected voiddoPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub

}

}

View Code

4、验证结果

在Tomcat里运行该Web工程,执行消息生产者Servlet,返回消息发送成功标志,同时我们可以在http://localhost:8161/admin/queues.jsp查看到该消息,如下图所示

61859a798b71e69891bb7f0aa05c7093.png

5bea33200d2e7eebd73c6583dc58f4ba.png

继续执行消息消费者Servlet,返回消息接收成功标志,同时我们可以打开http://localhost:8161/admin/queues.jsp页面,发现刚才的消息已经不见了,如下图所示

3fe4efd286b27005e60c23884e426aa1.png

0c6ed79f7dc65cbc928e8bbc872d0476.png

Pub/Sub消息模式(JMS发布/订阅消息传送)

1、在Tomcat中配置JNDI

配置连接工厂和话题:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

View Code

2、启动ActiveMQ

bb6064f11044c3354c7a02f1ff789ada.png

3、在Web工厂中编写代码

新建一个发布者Servlet:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

package pubSub;

import java.io.IOException;

import java.io.PrintWriter;

import javax.naming.InitialContext;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.jms.Topic;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.jms.TopicPublisher;

import javax.jms.DeliveryMode;

import javax.jms.TopicSession;

import javax.jms.TopicConnection;

import javax.jms.TopicConnectionFactory;/**

* Servlet implementation class JMSTest*/@WebServlet("/Publish")public classPublisher extends HttpServlet {private static final long serialVersionUID = 1L;/**

* @see HttpServlet#HttpServlet()*/

publicPublisher() {

super();//TODO Auto-generated constructor stub

}/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

* response)*/

protected voiddoGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

PrintWriterout =response.getWriter();try{//get the initial context

InitialContext ctx = newInitialContext();//lookup the topic object

Topic topic = (Topic) ctx.lookup("java:comp/env/topic/topic0");//lookup the topic connection factory

TopicConnectionFactory connFactory =(TopicConnectionFactory) ctx

.lookup("java:comp/env/topic/connectionFactory");//create a topic connection

TopicConnection topicConn =connFactory.createTopicConnection();//create a topic session

TopicSession topicSession = topicConn.createTopicSession(false,

Session.AUTO_ACKNOWLEDGE);//create a topic publisher

TopicPublisher topicPublisher =topicSession.createPublisher(topic);

topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//create the "Hello World" message

TextMessage message =topicSession.createTextMessage();

message.setText("Hello World");//publish the messages

topicPublisher.publish(message);//print what we did

out.write("Message published:" +message.getText());//close the topic connection

topicConn.close();

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

* response)*/

protected voiddoPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub

}

}

View Code

新建一个订阅者Servlet:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

package pubSub;

import java.io.IOException;

import java.io.PrintWriter;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.jms.Topic;

import javax.jms.TopicConnection;

import javax.jms.TopicConnectionFactory;

import javax.jms.TopicSession;

import javax.jms.TopicSubscriber;

import javax.naming.InitialContext;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;/**

* Servlet implementation class Receive*/@WebServlet("/Subscribe")public classSubscriber extends HttpServlet {private static final long serialVersionUID = 1L;/**

* @see HttpServlet#HttpServlet()*/

publicSubscriber() {

super();//TODO Auto-generated constructor stub

}/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse

* response)*/

protected voiddoGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

PrintWriterout =response.getWriter();try{//get the initial context

InitialContext ctx = newInitialContext();//lookup the topic object

Topic topic = (Topic) ctx.lookup("java:comp/env/topic/topic0");//lookup the topic connection factory

TopicConnectionFactory connFactory =(TopicConnectionFactory) ctx

.lookup("java:comp/env/topic/connectionFactory");//create a topic connection

TopicConnection topicConn =connFactory.createTopicConnection();//create a topic session

TopicSession topicSession = topicConn.createTopicSession(false,

Session.AUTO_ACKNOWLEDGE);//create a topic subscriber

TopicSubscriber topicSubscriber =topicSession

.createSubscriber(topic);//start the connection

topicConn.start();//receive the message

TextMessage message =(TextMessage) topicSubscriber.receive();//print the message

out.write("Message received:" +message.getText());//close the topic connection

topicConn.close();

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

* response)*/

protected voiddoPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub

}

}

View Code

4、验证结果

运行Web工程,分别打开多个标签访问订阅servlet,然后访问发布servlet,结果如下:

ea9fac9ba5719fa6d87e0335453e1f67.png

2885c6823bbf90346657611f6e3b9da6.png

22d7e0f9897efc474dd79f2d7a40a818.png

在订阅者订阅消息的时候,一开始没接收到消息,一旦发布者发布消息后,订阅者马上收到消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] HTML5的触屏事件有哪些?

[html] HTML5的触屏事件有哪些? touchstart 触摸开始 touchmove 接触点移动(手指不离开屏幕) touchend 触摸结束 touchcancel 触摸被取消个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很…

你是第几名:Excel 中 Large 和 Small 的用法

类似于 SQL 语言中的 TOP X, Large 和Small 有2个参数 Large(Array,k) Array 可以为一个单元格区域,k 为第k各最大值,Small 与之对应返回第k个最小值。 注意:单元格区域中的非数字会被忽略掉。 例子如下: 可以类比Rank的用法&…

mac系统下android studio创建手机模拟器

打开android studio,点击右上角的模拟器图标,打开“Android Virtual Device Manager” 窗口,如下图 点击“Create Virtual Device”,在打开的设备定义列表中,选择“Phone -> Nexus 5X”,右边列出了改机型…

java wait 参数_Java sleep()和wait()的区别

一、什么是sleep()?sleep()是Thread类的方法,导致线程暂停执行的时间,给其他线程执行机会,但是依然保持监控状态,过了指定时间会自动恢复执行,调用sleep()方法不会释放锁对象。当调用sleep()方法后,当前线…

[html]html实现页面跳转都有哪些方法?

[html]html实现页面跳转都有哪些方法&#xff1f; 创建A标签跳转location.hrefform submit<meta http-equiv"refresh" content"5;urlother.html">window.history个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c…

如何设置Hyper-V的虚拟机快捷方式

在Windows Server 2008中&#xff0c;提供的Hyper-V功能&#xff0c;可以很方便地在企业环境中部署多个虚拟机&#xff0c;以适应不同的开发需要。一般我们都是通过下面的方式 1. 打开服务器管理器 2.打开Hyper-V管理器&#xff0c;找到有关的虚拟机&#xff0c;然后右键点击“…

使用 keytool 生成安卓应用程序签名

下载 keytool jar包&#xff1b; 解压jar包到固定目录 如&#xff1a; cd /Library/Java/JavaVirtualMachines/ 进入到jar包目录: cd /Library/Java/JavaVirtualMachines/jdk-12.0.1.jdk/Contents/Home 输入keytool&#xff0c;可以查看各种命令。 执行&#xff1a; keytool -…

java 音频对比_java – 比较两个不同的音频文件不起作用

我想比较两个音频文件,例如mp3和wav.我使用musicg来比较指纹.Wave record1 new Wave(music1.toString());Wave record2 new Wave(music2.toString());FingerprintSimilarity Similarityrecord1.getFingerprintSimilarity(record2);System.out.println(Similarity.getSimilari…

[html] 如何在页面引用外部的html页面?

[html] 如何在页面引用外部的html页面&#xff1f; 1.是完整的页面。拥有header&#xff0c;body。使用<iframe> 2.是一个页面片段。使用get请求。或者使用<link ref"import" href"some.html">个人简介 我是歌谣&#xff0c;欢迎和大家一起交…

解析C#中is和as操作符的用法 two

c# 中 is和as 操作符是用来进行强制类型转换的 is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常 objecto newobject(); if(o isLabel) { Label lb (Label)o; Response.Write("类型转换成功"); } else{ …

java跨函数跳转_VS code 函数无法跨文件跳转到定义

现状&#xff1a;本文件函数通过this打点调用的函数&#xff0c;引入绝对路径的文件&#xff0c;调用的函数都可以通过Ctrl 点击 实现跳转到定义处。而如果在 webpack 通过alias 设置了别名&#xff0c;无法跳转成功。解决方案: 新建文件 jsconfig.json&#xff0c;配置如下。…

uname命令

uname命令用于打印当前系统相关信息&#xff08;内核版本号、硬件架构、主机名称和操作系统类型等&#xff09;。 语法 uname(选项) 选项 -a或--all&#xff1a;显示全部的信息&#xff1b; -m或--machine&#xff1a;显示电脑类型&#xff1b; -n或-nodename&#xff1a;显示在…

std::map用法总结

给出了map的基本用法如插入、查找、删除、遍历等等&#xff0c;同时告诉你如何实现双键map&#xff0c;包括 (1) 只有两个键都匹配才命中目标(2) 两个键中任意一个匹配就命中目标 可以扩展到多键(一) 介绍特点&#xff1a;1.map将Key的object和T的Object绑定到一起&#xff0c;…

题库 java_java题库

1.public class T {int squares81;public static void main(String[] args) {new T().go();}void go(){incr(squares);System.out.println(squares);}void incr(int squares){squares10;}返回值为82&#xff0c;没有改变squares的值&#xff0c;不是引用传递不是c2.建个test类 …

Javascript弹出div层

这是一个DIV弹窗效果!将鼠标移动到此 点击这里查看弹出窗口 这是文章“JavaScript弹出窗口DIV层效果代码”的演示页面&#xff0c;点这里查看原文&#xff01; 转载于:https://www.cnblogs.com/xxxxx/archive/2010/05/22/1741707.html

java什么是同步_什么是同步?什么是互斥?

现代操作系统基本都是多任务操作系统&#xff0c;即同时有大量可调度实体在运行。在多任务操作系统中&#xff0c;同时运行的多个任务可能&#xff1a;都需要访问/使用同一种资源 多个任务之间有依赖关系&#xff0c;某个任务的运行依赖于另一个任务 这两种情形是多任务编程中遇…

python enumerate()

描述 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在 for 循环当中。 语法 以下是 enumerate() 方法的语法: enumerate(sequence, [start0]) 参数 sequence -- 一个序列、迭代器…