在上一篇介绍如何通过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实例相关推荐

  1. java中删除sqlite数据库语句_sqlite数据库的介绍与java操作sqlite的实例讲解

    sqlite数据库的介绍与java操作sqlite的实例讲解 发布时间:2020-10-03 05:40:34 来源:脚本之家 阅读:92 作者:Lee_Tech sqlite是啥? 1.一种轻型数据 ...

  2. rocketmq(三 java操作rocket API, rocketmq 幂等性)

    JAVA操作rocketmq: 1.导入rocketmq所需要的依赖: <dependency><groupId>com.alibaba.rocketmq</groupI ...

  3. Kafka系列三 java API操作

    使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  4. java操作mysql数据库实例_jdbc操作mysql数据库实例

    本文实例讲述了jdbc操作mysql数据库的方法.分享给大家供大家参考.具体如下: import java.sql.*; import java.sql.drivermanager; import j ...

  5. 5.3Python数据处理篇之Sympy系列(三)---简化操作

    目录 5.3简化操作 目录 前言 (一)有理数与多项式的简化 1.最简化-simplify() 2.展开-expand() 3.提公因式-factor() 4.合并同类项-ceiling() 5.简化 ...

  6. excel插入行 uipath_UIPath入門系列三之操作Excel表格

    介紹如何使用UIPath操作Excel 一.Excel/Workbooks 與 Data Tables的區別 Excel/Workbooks是一個excel文件,里面可以存儲各種類型的數據,可格式化, ...

  7. java操作mysql数据库实例_java操作mysql数据库实例_MySQL

    bitsCN.com //接口类package com.syxy.dao;import com.syxy.domain.User;//操纵数据库的 dao接口public interface User ...

  8. SpringDataJpa系列三之QBE(按照实例对象查询)

    本文章参考文档为<SpringDataJpa从入门到精通> 我们看一下JpaRepository的UML类图 我们可以看到, 自JpaRepository开始, 就实现了一个名叫Query ...

  9. java代码操作注册表,java操作注册表范例代码

    java操作注册表实例代码 以下代码的作用是读取USB设备: package org.yangzc.reglistener; import com.ice.jni.registry.Registry; ...

  10. java jms activemq_JMS-ActiveMQ与Java消息服务

    JMS:Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间或分布式系统中发送消息,进行异步通. ...

最新文章

  1. kaptcha验证码实现,配合spring boot使用
  2. Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
  3. Acey.ExcelX组件如何保证稳定性?
  4. linux who命令测试,Linux中的who命令详细示例
  5. android fragment 抽屉,android – 更改Fragment中的导航抽屉项目
  6. Service order save debug for distribution lock set logic
  7. 【必知必会】pro文件及常用配置
  8. ASP運行Excel.Application出錯
  9. Matcha已升级至0xV4版,比Uniswap和Sushi等平台节省4%的交易费
  10. IT程序员们平时都喜欢逛什么论坛呢?
  11. tcp/ip源代码(17)——ip_fragment
  12. matlab对多项式求导的命令,matlab多项式求导
  13. onenote2016下载地址
  14. 路飞学城之 luffy (2 )
  15. 减持奈飞增持京东健康,“贝莱德们”为何开始偏爱中国企业?
  16. 错误的太极观念造成膝盖损伤
  17. [QUANTAXIS量化分析]羊驼策略1
  18. CSS Table不换行与换行的用法
  19. 手写Sping(2) :手写IOP与DI(依赖注入)
  20. [知乎]为什么上知乎?

热门文章

  1. Webgoat学习笔记1
  2. android内核调试的步骤
  3. 第26讲 js函数调用过程内存分析 js函数细节
  4. 深入解析ORACLE字符集
  5. 数控技术计算机学什么,长沙数控技术专业学什么,有前途吗?
  6. 华为开通api服务_入冬第一场技术盛宴!DevRun开发者沙龙华为云武汉专场举办
  7. 漫画:“排序算法” 大总结
  8. Netlink套接字
  9. 通过ODBC连接PostgreSQL和Greenplum
  10. Linux中EXPORT_SYMBOL的用法