中间件之实习三 消息中间件应用开发

十分钟入门消息中间件 看不懂你来打我 阅读详情

一 实习目的

利用消息中间件接口JMS、消息服务器ActiveMQ 和Java Swing实现一个简单的聊天工具,掌握消息中间件的应用。

二 实习要求

   1、开发环境

     Windows 7/XP,Eclipse, JDK1.6, apache-activemq-5.4.3, Java Swing

2、功能要求

(1)实现界面化的聊天工具,支持二人之间互发消息。

(2)界面上必须标注软件版权信息,包括姓名、学号等个性化信息。

(3)发送消息过程中,发送这首先把消息发送到消息服务器ActiveMQ,接收者从消息服务器上取消息;消息发送者和接收者不需要同时运行(在线),实现即使对方处在离线状态下也可以进行消息的发送和接收。

三 实习过程

1、ActiveMQ 安装和配置

(1)解压缩到apache-activemq-5.4.3-bin.zip到一个目录,例如C:\ apache-activemq-5.4.3

(2)配置文件在C:\apache-activemq-5.4.3\conf目录中:activemq.xml、credentials.properties、log4j.properties(本次实习不需要配置)。

(3)启动ActiveMQ:运行C:\ apache-activemq-5.4.3\bin\activemq.bat

(4)测试

ActiveMQ默认使用的TCP连接端口是61616, 通过查看该端口的信息可以测试ActiveMQ是否成功启动 netstat -an|find "61616"

在CMD下输入:netstat -an|find "61616" 显示下列信息表示成功。

  TCP           0.0.0.0:61616          0.0.0.0:0             LISTENING

(5)登陆管理界面(本次实习不需要进入管理界面)

 浏览器中输入:http://localhost:8161/admin/,用户名密码:admin,admin

2、开发

(1)在eclipse中导入并运行MessageMiddleWare中的三个例子,了解消息发送者、接收者编程。

(2)在建立一个工程,导入库文件activemq-all-5.4.3.jar(在apache-activemq-5.4.3\lib可找到该文件);也可直接在MessageMiddleWare工程中开发。

(3)使用Java Swing开发界面,界面上包括消息发送窗口、接收窗口(或二者在同一个窗口)、发送按钮等,界面下方需显示个性化的版权信息。

(4)参考MessageMiddleWare中的例子,编写消息发送类和接收类。发送类中需要连接ActiveMQ 服务器,创建队列,发送消息;接收类中需要ActiveMQ 服务器,读取发送者发送消息所用的队列。接收类必须实现为一个单独的线程,时刻侦听是否有消息到来。

(5)至少使用2个以上的队列,A给B发送消息时使用一个队列,B给A发送时使用另一个队列(若使用同一个队列,可能导致消息混乱)。

(6)开发完毕,打包为可运行包(不要把MessageMiddleWare放进去),双击可以直接运行。

3、相关软件见附件

ActiveMQ实现单线程多队列

发送者A:

package example3;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.DeliveryMode;

import javax.jms.Destination;

import javax.jms.MessageProducer;

import javax.jms.Session;

import javax.jms.TextMessage;



import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;



public class Sender {

    private static final int SEND_NUMBER = 5;

    ConnectionFactory connectionFactory;//连接工厂,JMS 用它创建连接

    Connection connection = null;//JMS 客户端到JMS Provider 的连接

    Session session;//一个发送或接收消息的线程

    Destination destination;//消息的目的地

    MessageProducer producer;//生产者,消息发送者

    Sender() {

        // TextMessage message;

        // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar

        connectionFactory = new ActiveMQConnectionFactory(

                ActiveMQConnection.DEFAULT_USER,

                ActiveMQConnection.DEFAULT_PASSWORD,

                "tcp://localhost:61616");

        try {

         connection = connectionFactory.createConnection();//构造从工厂得到连接对象

         connection.start();//启动

         session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);//获取操作连接,此处是Boolean.TRUE,是否支持事务,如果为true,则会忽略第二个参数

            destination = session.createQueue("AQueue");//获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置

            producer = session.createProducer(destination);// 得到消息生成者【发送者】

            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// 设置不持久化,此处学习,实际根据项目决定

            sendMessage(session, producer);// 构造消息,此处写死,项目就是参数,或者方法获取

            session.commit();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

   

    public void sendMessage(Session session, MessageProducer producer) throws Exception {

        for (int i = 1; i <= SEND_NUMBER; i++) {

            TextMessage message = session.createTextMessage(this.getClass().getName()+" 发送的消息" + i);System.out.println(this.getClass().getName()+" 发送的消息" + i);// 发送消息到目的地方

            producer.send(message);

        }

    }

    public static void main(String[] args) {

            new Sender();

    }

}

发送者B

package example3;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.DeliveryMode;

import javax.jms.Destination;

import javax.jms.MessageProducer;

import javax.jms.Session;

import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;



public class Sender2 {

    private static final int SEND_NUMBER = 5;

    ConnectionFactory connectionFactory;//连接工厂,JMS 用它创建连接

    Connection connection = null;//JMS 客户端到JMS Provider 的连接

    Session session;//一个发送或接收消息的线程

    Destination destination;//消息的目的地

    MessageProducer producer;//生产者,消息发送者

    Sender2() {

        // TextMessage message;

        // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar

        connectionFactory = new ActiveMQConnectionFactory(

                ActiveMQConnection.DEFAULT_USER,

                ActiveMQConnection.DEFAULT_PASSWORD,

                "tcp://localhost:61616");

        try {

            connection = connectionFactory.createConnection();//构造从工厂得到连接对象

            connection.start();//启动

            session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);//获取操作连接,此处是Boolean.TRUE,是否支持事务,如果为true,则会忽略第二个参数

            destination = session.createQueue("BQueue");//获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置

            producer = session.createProducer(destination);// 得到消息生成者【发送者】

            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// 设置不持久化,此处学习,实际根据项目决定

            sendMessage(session, producer);// 构造消息,此处写死,项目就是参数,或者方法获取

            session.commit();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            try {

                if (null != connection)

                    connection.close();

            } catch (Throwable ignore) {

            }

        }

    }

 

    public void sendMessage(Session session, MessageProducer producer) throws Exception {

        for (int i = 1; i <= SEND_NUMBER; i++) {

            TextMessage message = session.createTextMessage(this.getClass().getName()+" 发送的消息" + i);

            System.out.println(this.getClass().getName()+" 发送的消息" + i);// 发送消息到目的地方

            producer.send(message);

        }

    }



    public static void main(String[] args) {

            new Sender2();

    }

}

接收者:

package example3;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.MessageConsumer;

import javax.jms.Session;

import javax.jms.TextMessage;



import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;



public class Receiver{

        ConnectionFactory connectionFactory;//连接工厂,JMS 用它创建连接

    Connection connection = null;//JMS 客户端到JMS Provider 的连接

    Session session;//一个发送或接收消息的线程

    Destination destination;//A消息的目的地

    MessageConsumer consumer;//A消费者,消息接收者

    Destination destination2;//B消息的目的地

    MessageConsumer consumer2;//B消费者,消息接收者

   

    Receiver() {

        try {

                System.out.println("ActiveMQ 服务器正在接收信息");

                connectionFactory = new ActiveMQConnectionFactory(

                        ActiveMQConnection.DEFAULT_USER,

                        ActiveMQConnection.DEFAULT_PASSWORD,

                        "tcp://localhost:61616");

            connection = connectionFactory.createConnection();//构造从工厂得到连接对象

            connection.start();//启动

            session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);//获取操作连接,此处是Boolean.FALSE,第二个参数为false时,paramB的值可为Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一个,此处为自动确认,客户端发送和接收消息不需要做额外的工作。哪怕是接收端发生异常,也会被当作正常发送成功。

            destination = session.createQueue("AQueue");

            consumer = session.createConsumer(destination);

            destination2 = session.createQueue("BQueue");

            consumer2 = session.createConsumer(destination2);

            while (true) {

                TextMessage message = (TextMessage) consumer.receiveNoWait();//设置接收者接收消息的时间,为了便于测试,这里设定为100s

                TextMessage message2 = (TextMessage) consumer2.receiveNoWait();

                if (null != message) {

                    System.out.println("收到A消息" + message.getText());

                }

                else if (null != message2) {

                    System.out.println("收到B消息" + message2.getText());

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            try {

                if (null != connection)

                    connection.close();

            } catch (Throwable ignore) {

            }

        }

    }

    public static void main(String[] args) {

            new Receiver();

    }

}

执行结果如图所示:

 

 

什么是消息中间件?中间件有哪些? 消息中间件(Message Oriented Middleware,简称 MOM)是一种软件系统,用于在分布式环境中提供消息传递和信息传输服务。它位于应用程序之间,为应用提供一种标准的、可靠的方式去发送和接收消息。消息中间件通常包含消息队列、路由、传输协议等组件,支持异步通信和解耦设计。消息中间件是分布式系统中的重要组件,广泛应用于异步处理、应用解耦、流量削峰、数据同步和任务调度等场景。根据具体需求(如消息量、延迟要求、事务性等),选择合适的消息中间件可以帮助实现系统的解耦、异步处理和高可用性。 阅读详情

相关推荐

消息中间件

ActiveMQ是Apache软件基金下的一个开源软件,支持JMS规范,支持 OpenWire、STOMP、AMQP和MQTT多种通信协议,能够进行持久化,支持Java 、C/C++、.NET、Perl、PHP、Python、Ruby等多种客户端语言,有监控,有管理界面,但是社区活跃度相对不高,有用户反馈会有丢失消息的情况。RPC是指远程过程调用,也就是说两台服务器A、B,一个应用部署在A服务器上,想要调用B服务器上应用提供的处理业务,处理完后然后在A服务器继续执行下去,把异步的消息以同步的方式执行。

cgk_ALEM的博客 1350

springboot 2.0 教程-10-集成消息中间件

阅读原文:https://blog.bywind.cn/articles/2018/11/28/1543373589258.html 视频教程:https://www.bilibili.com/video/av35595465 课程源码:https://github.com/ibywind/springboot-learn 关注公众号 查看更多技术干货 还可加群 , 众多好基友在等你 sprin...

御风大世界 | https://blog.bywind.cn 766

实验三 消息中间件应用开发:ActiveMQ实现单线程多队列

中间件技术 实验三 消息中间件应用开发: - 优快云博客 https://blog.youkuaiyun.com/lly1122334/article/details/80139790

【技术栈】消息中间件MQ

1. 什么是MQ MQ属于分布式系统中的一个子系统(消息子系统),主要负责消息(或数据)的发送、接收,利用其可靠有效的异步消息传递机制来集成其它子系统。 2. MQ的特点 MQ的特点: 1. 异步处理:一个长的同步流程,可以被拆解为短的异步流程(原则:异步流程可以延后操作,并不影响前面的交易) 2. 系统解耦:MQ前后的子系统进行解耦,松耦合可以使得前后子系统互不影响或减少影响,只要生产者成功把消息放入MQ中,消费者消费成功与否与生产者无关 3. 缓冲能力:MQ子系统也可以理解为一个缓存区,消

暮雨亦成詩 683

消息中间件实例项目

activemq实现,提供消费方和消费方简单实例代码,分为点对点,发布订阅(发布订阅分为持久化和非持久化,非持久化需要消费方在线才可以收到消息。持久化,消费方如果没有在线,上线之后可以接收到消息)

西北农林科技大学-中间件原理-(实验一~实验四).zip

实验一 远程过程调用中间件及数据访问中间件 实习二 消息中间件应用开发 实习三 IoCDI和RPC框架实现 实习四 Web Services 开发 说明一下这个是2020年西北农林科技大学的中间件实验,可能针对性比较强,外校的慎下。声明一下:我不能保证每年老师实验题目都一样,所以有出入那很抱歉啦。仅供参考,实验要自己动手做哦。

rabbitMQ初识及其入门

0. 学习目标 能够说出什么是消息中间件 能够安装RabbitMQ 能够编写RabbitMQ的入门程序 能够说出RabbitMQ的5种模式特征 能够使用Spring整合RabbitMQ 1. 消息中间件概述 1.1. 什么是消息中间件 MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。 为什么使用MQ 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。 开发中消息队列通常

LCreator的博客 652

ActiveMQ实例

activemq与spring整合,activemq与swing整合 activemq与ajax整合

自定义简易版消息中间件

java简易版消息中间件

m0_58046039的博客 464

无人机避障——Mid360+Fast-lio感知建图+Ego-planner运动规划(胎教级教程)

本工作将 Mid360 激光雷达、Fastlio-SLAM 和 Ego-Planner 集成,实现无人机的环境感知、定位建图和运动规划(仿真过程)—— 胎教级教程。

weixin_45390670的博客 1万+

GAN网络(论文阅读):Generative Adversarial Nets

当判别器效果比较好时,D(G(z))值为0,则log(1-D(G(z)))值为0,当判别器效果不好,会输出一个大于0 的数,则log(1-D(G(z)))值就为一个负数,在极端情况下,会得到负无穷大,此时判别失误。在价值函数的第二项中存在问题,在早期G比较弱的时,生成的数据和真实数据相差很大,D就容易训练的比较好,很容易区分,就会导致log(1-D(G(z)))变成0 ,这样很难求梯度来优化G,所以更新G时,将优化函数改为log(D(G(z)))。最终使G赢,即G生成的数据D判别不出来。

m0_54248968的博客 2293

消息中间件(Message Oriented Middleware,MOM)是一种基于异步消息传递模式的通信机制,它通过消息传递的方式实现系统各个组件之间的数据交换和通信。

(Kafka、RocketMQ、ActiveMQ、RabbitMQ)消息中间件的使用流程及对比

weixin_47181095的博客 1277

手把手教你用Cadence VPWLF源和参数扫描:搞定非周期激励与gmid曲线绘制(避坑指南)

本文详细介绍了如何在Cadence Virtuoso中使用VPWLF源生成复杂非周期激励信号,并结合gmid方法进行双参数扫描优化电路设计。通过实战案例和避坑指南,帮助工程师高效解决波形生成和参数可视化难题,提升模拟电路设计效率。

weixin_29260291的博客 427

什么是消息中间件

定义 消息中间件属于分布式系统中一个字系统,关注于数据的发送和接收,利用高效可靠的异步信息传递机制对分布式系统中的其余各个子系统进行集成。 为什么要用消息中间件 假设一个电商交易的场景,用户下单之后调用库存系统减库存,然后需要调用物流系统进行发货,如果交易、库存、物流是属于一个系统的,那么就是接口调用。但是随着系统的发展,各个模块越来越庞大、业务逻辑越来越复杂,必然是要做服务化和业务拆分的。这个时候就需要考虑这些系统之间如何交互,第一反应就是RPC(Remote Procedure Call)。系统继续发

程序yuan同学 1万+

ST电机库实战:从状态机到稳健启动流程的深度解析

本文深度解析了ST电机库中状态机的核心作用与稳健启动流程。状态机作为电机控制的“交通指挥官”,通过IDLE、CHARGE_BOOT_CAP、ALIGNMENT等一系列状态的严格跳转,确保了永磁同步电机(PMSM)和直流无刷电机(BLDC)的安全启动与可靠运行,是避免硬件损坏和实现平稳控制的关键。

weixin_29161785的博客 227

Flowable任务节点动态预测:基于任务ID与参数获取下一节点及候选分配策略

本文深入探讨了Flowable工作流引擎中任务节点动态预测功能的实现。通过解析任务ID与运行时参数,模拟流程执行路径,精准预测下一节点及候选用户/组集合,从而提升用户体验与系统透明度。核心在于利用自定义命令实现表达式求值,并深度解析候选者分配策略,确保预测结果与实际流程执行一致。

nnn11的博客 741

消息中间件(消息队列)

消息中间件

骑个小蜗牛的博客 3万+

QNX系统中的密码哈希格式——数据安全深度分析

综上所述,QNX系统中的Shadowed密码哈希格式提供了一种有效的数据安全机制,能够保护用户密码的安全性。通过将用户密码的哈希值存储在系统文件中,并结合哈希算法和盐值的使用,可以有效地防止明文密码泄露和密码破解。密码哈希是一种常用的安全技术,用于将用户密码转换为不可逆的哈希值,以保护用户的敏感信息。在QNX操作系统中,存在一种称为Shadowed密码哈希格式的机制,用于存储用户密码的安全散列值。当用户登录系统时,系统会将用户输入的密码与保存的哈希值进行比对,以验证密码的正确性。在上述代码中,首先使用。

UneDatabase的博客 253

消息中间件有哪些

1、学习中间件的方式和技巧 理解中间件在项目架构中的作用,以及各中间件的底层实现 可以使用一些类比的生活概念去理解中间件 使用一些主流图或者脑图的方式去梳理各个中间件在架构中的作用 尝试使用Java技术去实现中间件 静下来去思考中间件在项目中设计和使用的原因 如何找到对应的替代方案 尝试编写博客总结类同中间件技术的对比和使用场景 学会查看中间件的源码以及开源项目和博客 2、消息中间件的应用场景 跨系统数据传递 高并发的流量削峰 数据的分发和异步处理 大数据分析与传递 分布式事务 比

学Java,找哪吒 1万+

复现报告:《多回路人机控制系统仿真及II型PIO分析》方法复现与代码实现

本文复现了谭文倩硕士论文《多回路人机控制系统仿真及II型PIO分析》中的关键方法,重点实现了频域驾驶员模型辨识和参数灵敏度分析。通过数字化提取论文图表数据,构建了结构驾驶员模型传递函数,并验证了参数变化对系统特性的影响。采用MATLAB实现了描述函数计算、模型参数辨识和灵敏度分析算法,为后续神经网络模型辨识和II型PIO研究奠定了基础。由于缺乏原始实验数据,部分结果通过数值模拟获得,但仍有效重现了论文的核心分析方法。~~~~~

huanghm88的专栏 175

小梅哥Xilinx FPGA学习笔记11——亚稳态

亚稳态就是D触发器输入信号在其数据窗口期内发生变化,导致D触发器的输出进入一段时间的不稳定状态,有可能发生振荡,并最终随机稳定在高电平或者低电平。

m0_51430584的博客 631

(一)消息中间件,为什么要用消息中间件,解决了什么问题

什么是消息中间件? 中间件被描述为为应用程序提供操作系统所提供的服务之外的服务,简化应用程序的通信、输入输出的开发,使他们专注于自己的业务逻辑。 消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不...

a281246240的专栏 9481

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

消息中间件是什么?有什么用?常见的消息中间件有哪些?

消息中间件是什么?有什么用?常见的消息中间件有哪些?以及四种消息中间件的对比

m0_62569064的博客 2659

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

消息中间件(MQ)

一、什么是消息中间件 关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 二、为什么需要消息中间件 1、系统解耦 假设你有个系统A,这个系统A会产出一个核心数据,现在下游有系统B和系统C需要这个数据。 那简单,系统A就是直接调用系统B和系统C的接口发送数据给他们就好了。 问题:如果现在要是来了系统D、系统E、系统F、系统G,等等,十来个其他系统慢慢的都需要这份核心数据呢?如下图: 使用MQ...

原名:@程序员大禹 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 信息安全实习:实习三 基于RSA的公钥加密 Swing界面(报告+详细代码)
下一篇: 中间件之实习四 Web Services 开发
GoodTime1110
博客等级 码龄6年 301粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值