Spring+JMS+使用JMS+ActiveMQ中间件+实现简单聊天功能的小例子

IM即时通讯开发MQ消息队列 1)用户的聊天消息离线存储环节:因为IM消息的发送属于高吞吐场景,直接操纵DB很容易就把DB搞挂了,所以离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地存储到DB中;2)用户的行为数据收集环节:因为用户的聊天消息和指令等,可以用于大数据分析,而且基于国家监管要求也是必须要存储一段时间的,所以此类数据的收集同样可以用于MQ消息队列,再由单独部署的消费者存储到DB中;库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。如何解决以上问题呢? 阅读详情

当前,CORBA、DCOM、RMI等RPC中间件技术已经广泛应用于各个领域。但是这些中间件的局限性很明显,主要表现在以下方面:

(1)同步通信:客户发出调用后,必须等待服务对象的完成处理并返回结果后才能继续执行。

(2)客户和服务对象的生命周期紧密耦合:客户进程和服务对象进程都必须正常运行;如果服务对象崩溃或者网络故障导致客户的请求不可达,客户会接收到异常。

(3)点对点通信:客户的一次调用只发给某个单独的目标对象。

MOM(Message Oriented Middleware)面向消息的中间件较好的解决了以上问题。

发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。

这种模式下,发送和接收是异步的,发送者无须等待;

二者的生命周期未必相同:发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;

一对多通信:对于一个消息可以有多个接收者。

已经有的MOM系统有:IMB的MQSeries、Microsoft的MSMQ、BEA的MessageQ、Apache的ActiveMQ等。

由于没有一个通用的标准,这些系统很难相互操作和无缝连接。

JMS(Java Message Service)是SUN提出的一种MOM系统接口的规范,他包含点对点(Point to Point,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型。提供可靠消息传输、事务和消息过滤等机制。

总的来说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少了程序设计的复杂性,将注意力集中与自己的业务上,不必再为程序在不同软件系统上的移植而重复工作,从而大大减少了技术上的负担。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

本例中,使用Apache 的ActiveMQ来作为JMS中间件,这是一款相当成熟且开源的产品,得到了许多业内人士的好评。

首先需要下载Apache的ActiveMQ :http://activemq.apache.org/download.html

本例下载是

ActiveMQ 5.6.0 Release
解压后,打开里面的conf/activemq.xml

修改以下配置:

 <transportConnectors>
       <transportConnector name="openwire" uri="tcp://localhost:61616/"/>
 </transportConnectors>

打开/bin/activemq.bat 启动即可!

如果是到正式环境,此ActiveMQ需要单独部署,然后供Spring 的JMS调用即可!

下面配置Spring的JMS环境:

ApplicationContext.xml

 <!-- 定义JMS连接工厂  -->
 <bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  <property name="brokerURL" value="tcp://localhost:61616" />    
 </bean>
 
 <!-- 定义JMS Template -->
 <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
     <property name="connectionFactory" ref="jmsFactory" />   
 </bean>
 
 <!-- 定义消息目的地  -->
  <bean id="dreamDestination" class="org.apache.activemq.command.ActiveMQQueue">  
       <constructor-arg index="0" value="dream.force" />    
  </bean>
 
 <!-- 定义接收监听器  -->
 <bean id="myTextListener" class="com.spring.jms.TextListener"></bean>
 
 <!-- 定义一个JMS话题  -->
 <bean id="jmsTopic" class="org.apache.activemq.command.ActiveMQTopic" autowire="constructor">    
     <constructor-arg value="STOCKS.Dreamforce.jms" />    
 </bean>
 
 <!-- 定义消费者(接收端) -->
  <bean id="javaConsumer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">     
     <property name="connectionFactory" ref="jmsFactory" />     
     <property name="destination" ref="dreamDestination" />        
     <property name="messageListener" ref="myTextListener" />
  </bean>
 
 <!-- 定义发布者  -->
 <bean id="publisher" class="com.spring.jms.SpringPublish">      
   <property name="template">            
    <ref local="jmsTemplate" />
   </property>       
   <property name="destinations" ref="dreamDestination" />    
 </bean>

 

需要的Jar文件:

××××××××××××××××××××××××××××××××××××××××××××××××××

 <!-- with spring -->
 <dependency> 
   <groupId>org.springframework</groupId> 
   <artifactId>spring-core</artifactId> 
   <version>${org.springframework-version}</version> 
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>${org.springframework-version}</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>${org.springframework-version}</version>
 </dependency>
    <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jms</artifactId>
  <version>${org.springframework-version}</version>
 </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>${org.springframework-version}</version>
 </dependency>
    <dependency>            
      <groupId>org.apache.geronimo.specs</groupId>            
      <artifactId>geronimo-jms_1.1_spec</artifactId>            
      <version>1.1</version>        
    </dependency>
    <dependency>
   <groupId>activemq-core</groupId>
   <artifactId>activemq-core</artifactId>
   <version>5.6.0</version>
 </dependency>
 <dependency>  
   <groupId>javax.management.j2ee</groupId>    
   <artifactId>management-api</artifactId>    
   <version>1.1-rev-1</version>
 </dependency>
 <dependency>
   <groupId>slf4j-api</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>1.6.6</version>
 </dependency>

    <dependency>
  <groupId>commons-dbcp</groupId>
  <artifactId>commons-dbcp</artifactId>
  <version>1.2.2</version>
 </dependency>
     <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.0.5</version>
      </dependency>    
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

×××××××××××××××××××××××××××××××××××××××××××××××××× 

1.消息监听器(TextListener.java):

public class TextListener implements MessageListener {

 public void onMessage(Message message) {
  ActiveMQMapMessage msg = null;
  ActiveMQTextMessage ms = null;
  //System.out.println("ONMessage-----------------" + message.toString());
  try {
   if (message instanceof ActiveMQMapMessage) {
    msg = (ActiveMQMapMessage) message;
    //String sentDate = msg.getString("date");
    //String reMessage = msg.getString("message");
    //int sentCount = msg.getInt("count");
    //System.out.println("-------------New Message Arrival-----------"
    //    + new Date());
    //System.out.println("It's " + sentCount + " time From Darcy: "
    //  + reMessage + "   ---Send time :" + sentDate);
   }else if(message instanceof ActiveMQTextMessage){
    ms = (ActiveMQTextMessage)message;
    System.out.println("他:"+ms.getText());
   }
  } catch (JMSException e) {
   System.out.println("JMSException in onMessage(): " + e.toString());
  } catch (Throwable t) {
   System.out.println("Exception in onMessage():" + t.getMessage());
  }
 }

}

2.消息发布端(SpringPublish.java):

public class SpringPublish {
 private JmsTemplate template;
 private Destination[] destinations;

 public void chart() {
  boolean chart = true;
  int count = 0;
  while (chart) {
   count++;
   Scanner cin = new Scanner(System.in);
   //System.out.println("输入聊天内容,输入exit停止聊天");
   String text = cin.nextLine();
   if (text.equals("exit")) {
    chart = false;
   }
   System.out.println("我:" + text);
   sendChartMessage(count, text);
  }

 }

 protected void sendChartMessage(int count, String strMessage) {
  MyMessageCreator creator = new MyMessageCreator(count, strMessage);
  template.send(destinations[0], creator);
 }

 public JmsTemplate getTemplate() {
  return template;
 }

 public void setTemplate(JmsTemplate template) {
  this.template = template;
 }

 public Destination[] getDestinations() {
  return destinations;
 }

 public void setDestinations(Destination[] destinations) {
  this.destinations = destinations;
 }

}

3.消息生产者(MyMessageCreator.java):

public class MyMessageCreator implements MessageCreator {

 private int msgNo;
 private String strMessage;

 public MyMessageCreator(int no, String paramMessage) {
  this.msgNo = no;
  this.strMessage = paramMessage;
 }

 public Message createMessage(Session session) throws JMSException {
  MapMessage message = session.createMapMessage();
  message.setString("date", new Date().toString());
  message.setString("message", strMessage);
  message.setInt("count", msgNo);
  return message;
 }

}

4.测试类:

public class SpringJmsTestMain {
 private SpringPublish publisher;
 private DefaultMessageListenerContainer javaConsumer;

 public SpringPublish getPublisher() {
  return publisher;
 }

 public void setPublisher(SpringPublish publisher) {
  this.publisher = publisher;
 }

 public void testJMS() {
  javaConsumer.start();
  publisher.chart();

 }

 public void setJavaConsumer(DefaultMessageListenerContainer javaConsumer) {
  this.javaConsumer = javaConsumer;
 }

 public DefaultMessageListenerContainer getJavaConsumer() {
  return javaConsumer;
 }
 
 public static void main(String[] args){
  SpringJmsTestMain spring = new SpringJmsTestMain();
  ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  spring.setPublisher((SpringPublish)context.getBean("publisher"));
  spring.setJavaConsumer((DefaultMessageListenerContainer)context.getBean("javaConsumer"));
  spring.testJMS();
 }

测试结果:

1.在Console中输入一些字符然后回车

2.打开http://localhost:8161/admin/

3.选择Queues,然后会看到你所发送的信息,如下图:

 

点击Send To 后:

控制台信息为:

springMVC activemq简单聊天室 立即下载

相关推荐

ActiveMQ实战——实现一个简易版的聊天室

NULL 博文链接:https://shhyuhan.iteye.com/blog/1280477

分析-MQ消息队列中间件-在IM即时通讯系统的用途

MQ消息队列在IM即时通讯的用途 1)用户聊天消息的离线存储环节:因为IM消息的发送属于高吞吐场景,直接操作DB可能会让DB崩溃,所有离线消息在落地入库前,可以先扔到MQ消息队列中,再由单独部署的消费者来有节奏地存储到DB中; 2)用户的行为数据收集环节:因为用户的聊天消息和指令等,可以用于大数据分析,而且基于国家监管要求也是必须要存储一段时间的,所以此类数据的收集同样可以用于MQ消息队列,再由单独部署的消费者存储到DB中; 用户的操作日志收集环节:log这种数据价值不高,但关键时刻又非常有用,而且数

CodeDabaicai的博客 2487

webchat聊天室(websocket+activemq编写)

webchat聊天室(websocket+activemq编写),适合新手学习,想学习websocket或者activemq的同学可以下载看看,质量保证~

Spring Boot与JMS消息中间件的集成

JMS是Java平台中的一项消息传递API,用于在两个应用程序或分布式系统之间发送消息。它提供了一种异步通信机制,可以提高系统的可扩展性和解耦性。常见的JMS消息中间件包括ActiveMQ、RabbitMQ和IBM MQ。通过本文的介绍,我们了解了如何在Spring Boot中集成ActiveMQ和RabbitMQ作为JMS消息中间件。通过这些配置和代码示例,可以轻松地在Spring Boot应用中实现消息的发送和接收,提升系统的可扩展性和解耦性。

技术研究中心 921

ActiveMQ使用Ajax实现多人聊天室

ActiveMQ使用Ajax实现多人聊天室。

activemq+swing 实现的聊天工具(可执行文件和完整工程源码

activemq+swing 实现的聊天工具(可执行文件和完整工程源码, activemq+swing 实现的聊天工具(可执行文件和完整工程源码) 可执行文件右键运行即可 执行Start.java可启动程序

使用 ActiveMQ 中间件 实现消息传递可以实现QQ聊天

1.这是使用ActiveMQ 中间件的jar包 activemq-all-5.4.2.jar 来实现的消息发送与接受的Demo(完全原创的哈..): 2.请大家多多指教: 3. 4./** 5. * 启动ActiveMQ内置服务 6. * 7. * @author WLei 2011-4-12 8. */ 9.public class ActiveM...

xxx的专栏 906

详解STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用

本文详细解析了STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用。通过CubeMX配置、代码实现和常见问题解决方案,帮助开发者高效实现多通道数据同步采集,提升工业自动化和嵌入式系统的数据采集效率与精度。

ii567的博客 364

中间件技术ActiveMQ消息中间件的使用

一. ActiveMQ介绍通过ActiveMQ消息服务交换消息。消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。这些消息传送操作是使用一组实现 ActiveMQ应用编程接口 (API) 的对象来执行的。二. 软件开发目的2.1 软件目的利用消息中间件接口JMS、消息服务器ActiveMQ 和Java Swing实现一个简单的聊天工具,掌握消息中间件的应用。2. 2程序要求 实现界

Rain的博客 3721

避坑指南:Abaqus网格划分中90%用户会遇到的5个质量陷阱(附解决方案)

本文深入剖析Abaqus网格划分中90%用户会遇到的5个典型质量陷阱,包括单元扭曲、扫掠网格失败、尺寸梯度控制等,并提供工程级解决方案。通过Python脚本和虚拟拓扑等技巧,帮助用户提升网格质量,确保有限元分析结果的可靠性,适用于CAE工程师和仿真分析师。

weixin_29243279的博客 98

Python语言在工业控制中的简单应用

在工业控制中,经常需要对采集到的数据进行分析和处理,Python的这些库可以简化这一过程。传统的工业控制系统多依赖于专用的控制硬件和软件,但随着技术的发展,开放性和灵活性成为了新的需求焦点。还有,Python社区活跃,提供了大量的开源代码和模块,这对于工业控制领域来说是一个巨大的资产。Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的社区资源而在工业界获得了快速的发展和广泛的应用。在工业控制领域,Python的应用日益增多,这得益于其跨平台性、脚本语言的灵活性以及与硬件设备交互的能力。

2303_78014702的博客 1720

手把手教你如何玩转消息中间件(ActiveMQ)

情景引入 情景分析 基本概念的引导 本模块主要讲解关于消息中间件的相关基础知识,也是方便我们后面的学习。 什么是中间件? 非操作系统软件,非业务应用软件,不是直接给最终用户使用,不能直接给用户带来价值的软件,我们就可以称为中间件(比如Dubbo,Tomcat,Jetty,Jboss都是属于的)。 什么是消息中间件? 百度百科解释:消息中间件利用高效可靠的消息传递机制进行平...

Cs_hnu_scw的博客 7万+

实战指南!基于STM32的智能环境监测系统(代码+硬件设计+云端控制)

本文详细介绍了基于STM32的智能环境监测系统的设计与实现,包括硬件选型、电路设计、软件架构和云端控制。系统通过DHT11温湿度传感器和MQ-2烟雾传感器实时监测环境数据,STM32F103C8T6主控芯片处理数据并通过ESP8266上传至中国移动物联网平台,支持手机APP远程监控。项目成本低、稳定性高,适合智能家居和环境监测应用。

weixin_29194817的博客 433

JMS——使用ActiveMQ打造点对点聊天器

这里使用了acticveMQ的点对点,使用Spring配置,实现了简单的点对点聊天功能 所需依赖 org.apache.activemq activemq-core 5.5.1 org.springframework spring-jms

yyf的博客 3368

手把手教你学Simulink实例--基于Simulink的电力电子系统电池管理系统(BMS)设计与仿真实例

本文详细介绍了基于Simulink的电池管理系统(BMS)设计与仿真全过程。首先阐述了BMS在安全防护、寿命延长和性能优化方面的必要性,分析了新能源汽车、光伏储能等典型应用场景的技术指标要求。接着详细讲解了Thevenin等效电路和多电平电池模型构建方法,并给出SOC估算、故障诊断等核心算法的MATLAB实现代码。通过设计正常充放电、过充保护等多场景仿真测试,验证了系统在SOC跟踪精度(误差<1.5%)和故障响应速度(<10ms)方面的优异性能。文章还提出了参数优化方法和未来AI融合、数字孪生等发展方向,提

xiaoheshang_123的博客 376

基于深度确定性策略梯度的永磁同步电机强化学习控制方法

本文提出了一种基于深度确定性策略梯度(DDPG)的永磁同步电机(PMSM)电流内环智能控制方法。首先建立了PMSM在d-q坐标系下的数学模型,分析了传统矢量控制双闭环系统中PI控制器的局限性。针对电流内环控制问题,设计了包含电流跟踪误差、转速信息和历史控制量的状态空间,将电压输出作为动作空间,并构建了兼顾跟踪精度和响应速度的奖励函数。通过DDPG算法训练智能体,使其能够自适应调整控制策略。仿真结果表明,与固定参数的PI控制器相比,DDPG控制器在动态响应速度和抗干扰能力方面具有明显优势,为PMSM高性能控制

huanghm88的专栏 103

ActiveMQ详细使用

情景引入 小白:起床起床起床起床。。。。快起床~ 我:怎么了又,大惊小怪,吓到我了。 小白:我有事有事想找你,十万火急呢~~ 我:你能有什么事?反正我不信。。那你说说看~~ 小白:就是我有两个小表弟,叫大白和二白,他们现在每天睡觉之前都要分别和我聊天,让我给...

a13727494097的博客 369

【实验】ENSP 实战:酒店有线 + 无线三层组网全配置(VLAN 规划 + AC/AP+SSID 绑定)

三层架构:出口路由器 → 核心交换机 → 汇聚交换机 → 接入交换机 / AP / 终端。

jundao1997的专栏 430

ActiveMQ(消息中间件)

一、消息中间件是什么? 消息中间就是在两个系统或两个客户端之间进行消息传送的一个中间件,常用的消息中间件有ActiveMQ、RabbitMQ、RocketMQ和kafka。(消息中间件对比) 二、什么是ActiveMQ ActiveMQ是一种开源的基于JMS(Java Message Servie)规范的一种消息中间件的实现,ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。 三、ActiveMQ使用场景 ActiveMQ常被应用与系统业务的解耦,

qq_35690700的博客 1187

AXI2APB_bridge 设计

此处研究AHB Slave到 APB master的桥接器,实现接口转化,例如下图之后是参数描述

Starry__的博客 4035

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SPRING整合JMS进行网络通信

什么是JMS? jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。 JMS的优势 当前,CORBA、DCOM、RMI等RPC中间件技术已广泛应用于各个领域。但

xo_zhang的专栏 6106

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java 同步消息服务_spring整合JMS实现同步收发消息(基于ActiveMQ的实现)

本文介绍了spring整合JMS实现同步收发消息(基于ActiveMQ的实现),分享给大家,具体如下:1. 安装ActiveMQ注意:JDK版本需要1.7及以上才行到Apache官方网站下载最新的ActiveMQ的安装包,并解压到本地目录下,下载链接如下:http://activemq.apache.org/download.html,解压后的目录结构如下:bin目录结构如下:如果我们是32位的机...

weixin_29061465的博客 514

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

activemq使用jms php,使用JMS完成消息通信

前言对于WEB系统,向用户发送邮件、短信、站内信等几乎是必备的基础功能,但这些任务相对于所见即所得的立即响应式的请求对实时性的要求并不高,同时任务处理的量还很大。在复杂多系统的情形下,还要考虑多个子系统的通信问题。无论是从实际业务需求还是从软件工程的设计角度出发,消息通信都有必要成为一个独立的模块。本文以一个非常简单的业务场景为例,即系统给用户发送通知邮件,来讲一讲如何构建简单的消息通信。引入JM...

weixin_31967777的博客 198

关于JMS与SPRING的整合实例(基于Apache ActiveMQ)

什么是JMS? jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。 JMS的优势 当前,CORBA、DCOM、RMI等RPC中间件技术已广泛应

johennes的专栏 1097
上一篇: Spring AOP的基础知识
下一篇: Spring 单元测试和集成测试
努力突破
博客等级 码龄17年 36粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值