JMS系列(三)-java操作JMS Topic实例
在上一篇介绍如何通过java往jms消息队列里面写消息和读取消息,本文介绍如何通过java往jms主题里写消息和读取消息。
消息发布
同样将消息发布到主题中,需要经过以下步骤
- 连接jms服务器
- 获取连接工厂(Connection Factory)
- 通过连接工厂创建主题连接(TopicConnection)
- 通过主题连接创建主题会话(TopicSession)
- 通过主题会话创建主题发布者(Publisher)
- 创建消息(Message)
- 通过发布者将消息发送到主题中
代码实现:
package asan.demo.jms;import java.util.Hashtable;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;public class JMSTopicSender {private TopicPublisher sender = null;private TopicSession session = null;private static final String JMS_FACTORY_JNDI = "jms/jms_test_connection_factory1";private static final String JMS_TOPIC_JNDI = "jms/jms_test_topic";public JMSTopicSender() {super();}public void sendMessage(String msg) {TextMessage textMsg;try {if (this.sender == null) {this.init();}textMsg = session.createTextMessage();textMsg.setText(msg);sender.send(textMsg);} catch (JMSException e) {e.printStackTrace();} catch (Exception ex) {ex.printStackTrace();}}// 1. 连接jms服务器// 2. 获取连接工厂(Connection Factory)// 3. 通过连接工厂创建主题连接(TopicConnection)// 4. 通过主题连接创建主题会话(TopicSession)// 5. 通过主题会话创建主题发布者(Publisher)// 6. 创建消息(Message)// 7. 通过发布者将消息发送到主题中private void init() throws NamingException, JMSException {Hashtable properties = new Hashtable();properties.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");properties.put(Context.PROVIDER_URL, "t3://127.0.0.1:7101");properties.put(Context.SECURITY_PRINCIPAL, "weblogic");properties.put(Context.SECURITY_CREDENTIALS, "weblogic1");InitialContext ctx = new InitialContext(properties);TopicConnectionFactory jmsFactory =(TopicConnectionFactory)ctx.lookup(JMS_FACTORY_JNDI);TopicConnection jmsConn = jmsFactory.createTopicConnection();session = jmsConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);Topic topic = (Topic)ctx.lookup(JMS_TOPIC_JNDI);sender = session.createPublisher(topic);}public static void main(String[]cmd){JMSTopicSender sender=new JMSTopicSender();sender.sendMessage("hello jms topic");}
}
与队列不同的是,此时主题没有订阅者,那么该消息就不存储在主题中,即使后面有订阅者订阅了该主题,也无法接收订阅前的消息。
消息订阅
从主题中订阅消息,需要经过以下步骤:
- 连接jms服务器
- 获取连接工厂(Connection Factory)
- 通过连接工厂创建主题连接(TopicConnection)
- 通过主题连接创建主题会话(TopicSession)
- 通过主题会话创建订阅者(Subscriber)
- 接收消息(Message)
代码实现:
package asan.demo.jms;import java.util.Hashtable;
import javax.jms.JMSException;
import javax.jms.Message;
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.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;public class JMSTopicReciver {private TopicSubscriber reciver = null;private static final String JMS_FACTORY_JNDI = "jms/jms_test_connection_factory1";private static final String JMS_TOPIC_JNDI = "jms/jms_test_topic";public JMSTopicReciver() {super();}public void reciveMessage() {try {if (this.reciver == null) {this.init();}System.out.println("waiting to recive message from jms topic "+JMS_TOPIC_JNDI);while(true){Message msg=reciver.receive();if(msg instanceof TextMessage){TextMessage textMsg=(TextMessage)msg;System.out.println("recive jms message:"+textMsg.getText());}}} catch (JMSException e) {e.printStackTrace();} catch (Exception ex) {ex.printStackTrace();}}// 1. 连接jms服务器// 2. 获取连接工厂(Connection Factory)// 3. 通过连接工厂创建主题连接(TopicConnection)// 4. 通过主题连接创建主题会话(TopicSession)// 5. 通过主题会话创建订阅者(Subscriber)// 6. 接收消息(Message)private void init() throws NamingException, JMSException {Hashtable properties = new Hashtable();properties.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");properties.put(Context.PROVIDER_URL, "t3://127.0.0.1:7101");properties.put(Context.SECURITY_PRINCIPAL, "weblogic");properties.put(Context.SECURITY_CREDENTIALS, "weblogic1");InitialContext ctx = new InitialContext(properties);TopicConnectionFactory jmsFactory =(TopicConnectionFactory)ctx.lookup(JMS_FACTORY_JNDI);TopicConnection jmsConn = jmsFactory.createTopicConnection();TopicSession session = jmsConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);Topic topic = (Topic)ctx.lookup(JMS_TOPIC_JNDI);reciver = session.createSubscriber(topic);jmsConn.start();}public static void main(String[]cmd){JMSTopicReciver consumer=new JMSTopicReciver();consumer.reciveMessage();}
}
运行代码,此时运行之前消息发布的代码,可以在控制台看到发送的消息
同样,稍微修改下上一篇文章的客户端程序,使整个过程看起来更清晰,修改后的客户端代码如下:
package asan.demo.jms;import java.util.Scanner;public class JMSClient {public JMSClient() {super();}public static void help() {System.out.println("Usage:java -jar JMSClient.jar sender/reciver/topicSender/topicReciver");System.out.println("sender:向jms队列发送消息");System.out.println("reciver:从队列中取出消息");System.out.println("topicSender:向jms主题发送消息");System.out.println("topicReciver:从主题中取出消息");}public static void main(String[] cmd) {if (cmd.length == 0) {help();return;}String mode = cmd[0];if ("sender".equalsIgnoreCase(mode)) {JMSSender sender = new JMSSender();Scanner sc = new Scanner(System.in);while (true) {System.out.println("input you message(input end to exist):");String msg = sc.nextLine();if ("end".equalsIgnoreCase(msg)) {return;}sender.sendMessage(msg);System.out.println("message send success");}} else if ("reciver".equalsIgnoreCase(mode)) {JMSReciver consumer = new JMSReciver();consumer.reciveMessage();} else if ("topicSender".equalsIgnoreCase(mode)) {JMSTopicSender sender = new JMSTopicSender();Scanner sc = new Scanner(System.in);while (true) {System.out.println("input you message(input end to exist):");String msg = sc.nextLine();if ("end".equalsIgnoreCase(msg)) {return;}sender.sendMessage(msg);System.out.println("message send success");}} else if ("topicReciver".equalsIgnoreCase(mode)) {JMSTopicReciver consumer = new JMSTopicReciver();consumer.reciveMessage();}}
}
打包运行,执行以下命令将客户端作为主题发布者
java -jar JMSDemo.jar topicSender
新建窗口,执行以下命令将客户端作为主题订阅者
java -jar JMSDemo.jar topicReciver
在发布者上发送消息,在订阅者上看到收到的消息
可以再多开一个窗口,再运行一个订阅者
登录weblogic控制台,进入domain->Services->Messaging->JMS Modules->jms_test_module->jms_test_topic
可以查看当前主题订阅统计信息
JMS系列(三)-java操作JMS Topic实例相关推荐
- java中删除sqlite数据库语句_sqlite数据库的介绍与java操作sqlite的实例讲解
sqlite数据库的介绍与java操作sqlite的实例讲解 发布时间:2020-10-03 05:40:34 来源:脚本之家 阅读:92 作者:Lee_Tech sqlite是啥? 1.一种轻型数据 ...
- rocketmq(三 java操作rocket API, rocketmq 幂等性)
JAVA操作rocketmq: 1.导入rocketmq所需要的依赖: <dependency><groupId>com.alibaba.rocketmq</groupI ...
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- java操作mysql数据库实例_jdbc操作mysql数据库实例
本文实例讲述了jdbc操作mysql数据库的方法.分享给大家供大家参考.具体如下: import java.sql.*; import java.sql.drivermanager; import j ...
- 5.3Python数据处理篇之Sympy系列(三)---简化操作
目录 5.3简化操作 目录 前言 (一)有理数与多项式的简化 1.最简化-simplify() 2.展开-expand() 3.提公因式-factor() 4.合并同类项-ceiling() 5.简化 ...
- excel插入行 uipath_UIPath入門系列三之操作Excel表格
介紹如何使用UIPath操作Excel 一.Excel/Workbooks 與 Data Tables的區別 Excel/Workbooks是一個excel文件,里面可以存儲各種類型的數據,可格式化, ...
- java操作mysql数据库实例_java操作mysql数据库实例_MySQL
bitsCN.com //接口类package com.syxy.dao;import com.syxy.domain.User;//操纵数据库的 dao接口public interface User ...
- SpringDataJpa系列三之QBE(按照实例对象查询)
本文章参考文档为<SpringDataJpa从入门到精通> 我们看一下JpaRepository的UML类图 我们可以看到, 自JpaRepository开始, 就实现了一个名叫Query ...
- java代码操作注册表,java操作注册表范例代码
java操作注册表实例代码 以下代码的作用是读取USB设备: package org.yangzc.reglistener; import com.ice.jni.registry.Registry; ...
- java jms activemq_JMS-ActiveMQ与Java消息服务
JMS:Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间或分布式系统中发送消息,进行异步通. ...
最新文章
- kaptcha验证码实现,配合spring boot使用
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- Acey.ExcelX组件如何保证稳定性?
- linux who命令测试,Linux中的who命令详细示例
- android fragment 抽屉,android – 更改Fragment中的导航抽屉项目
- Service order save debug for distribution lock set logic
- 【必知必会】pro文件及常用配置
- ASP運行Excel.Application出錯
- Matcha已升级至0xV4版,比Uniswap和Sushi等平台节省4%的交易费
- IT程序员们平时都喜欢逛什么论坛呢?
- tcp/ip源代码(17)——ip_fragment
- matlab对多项式求导的命令,matlab多项式求导
- onenote2016下载地址
- 路飞学城之 luffy (2 )
- 减持奈飞增持京东健康,“贝莱德们”为何开始偏爱中国企业?
- 错误的太极观念造成膝盖损伤
- [QUANTAXIS量化分析]羊驼策略1
- CSS Table不换行与换行的用法
- 手写Sping(2) :手写IOP与DI(依赖注入)
- [知乎]为什么上知乎?