我在使用ActiveMQ传输文件时,采用的是如下方案:
首先,对文件按字节读取,每次读取一定的字节数比如4096个字节放入字节数组中,然后,将该字节数组封装成字节型的消息发送,发送完成后再读取下一个字节段,一直到读取完毕为止。由于系统考虑到在传输大文件时,可能会由于网络中断等原因造成的文件传输中断,在文件的传输时实现了断点续传的功能,当每次发送成功一条消息后将当前读取的字节位置保存到一个临时文件中,当网络中断时,程序中止,下次启动该程序时先读取临时文件,跳过已读的字节数,再接着读取发送。网络中断可能发生在程序运行的任何地方,本程序中用到了ActiveMQ提供的事务管理,当消息发送以后事务提交并写临时文件,出现异常时事务回滚,在测试的过程中发现,如果是在事务提交语句 session.commit(); 执行时网络中断,此时的事务回滚代码执行了,但是消息好像仍然发送出去了,不知道这是我程序的问题,还是ActiveMQ的问题,在她的官方网站上正好这部分的文档打不开(提示域名不存在),这一个星期都在整这一个问题,真是郁闷了,有哪位仁兄对ActiveMQ有研究的话,给小弟指点一二,弟当感激不尽!
private void sendFile(File file) throws Exception {
long currentRead = this.ReadTempFile(file.getPath()); // 冲临时文件中读取当前传输的字节数
long start = System.currentTimeMillis();
RandomAccessFile rand = new RandomAccessFile(file,"r");
rand.seek(currentRead); // 跳过已读的字节
byte[] buffer = new byte[2048];
int c = -1;
BytesMessage message = null;
while ((c = rand.read(buffer)) >= 0) {
try {
message = session.createBytesMessage();
message.setStringProperty("fileName", file.getPath()); //
message.setLongProperty("fileLength", file.length());
message.writeBytes(buffer, 0, c);
System.out.println("Send: " + c);
producer.send(message); // 发送消息
System.out.println("- 1 -");
this.WriteTempFile(file.getPath(), c); // 写临时文件
System.out.println("- 2 -");
if (transacted) {
session.commit(); // 此处抛出异常时,运行结果与预期不符
System.out.println("- 3 -");
}
} catch (JMSException e1) {
session.rollback();
System.err.println("- 4 -");
}
try {
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
rand.close();
// this.deleteTempFile(file.getPath()); // 删除临时文件
long end = System.currentTimeMillis();
System.out.println("Use time: " + (end - start));
}
分享到:
相关推荐
7. **错误处理和异常管理**:在文件传输过程中可能出现的问题及其解决方案。 通过这些知识点的学习和实践,开发者可以掌握使用JMS和ActiveMQ进行文件传输的核心技能,为构建可靠的、分布式的应用打下坚实的基础。
**ActiveMQ配置文件详解** Apache ActiveMQ 是一个开源的消息中间件,它实现了多种消息协议,如JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol),并且广泛应用于分布式系统中,提供可靠的...
即使文件上传过程中出现错误,由于消息的持久化特性,可以确保消息不会丢失,待问题解决后重新尝试上传。 6. **负载均衡与扩展**:随着系统规模的扩大,可能需要增加ActiveMQ实例来分担负载。ActiveMQ支持集群部署...
**ActiveMQ 使用 SSL 加密文件 Demo** ActiveMQ 是一个开源的消息代理服务器,它遵循 Java Message Service(JMS)规范,提供了可靠的消息传递功能。在实际的生产环境中,为了确保消息传输的安全性,我们通常会使用...
在IT行业中,Apache ActiveMQ是一个广泛使用的开源消息代理,它实现了多种消息协议,如AMQP、STOMP...通过理解ActiveMQ的工作原理,正确配置环境,并使用NMS库,开发者可以轻松地实现在分布式系统中传输和接收文件流。
对于比较小的文件,简单的处理方式是先读取所有的文件成byte[],然后使用ByteMessage,把文件数据发送到broker,像正常的message一样处理。
### ActiveMQ 使用手册知识点概述 #### 一、ActiveMQ 原理与基本构件 **1.1 连接工厂(Connection Factory):** - **定义:** 连接工厂是客户端用来创建连接的对象。在ActiveMQ中,`ActiveMQConnectionFactory` 类...
配置主要涉及到端口设置,ActiveMQ使用特定端口进行管理和消息传输。管理控制台默认端口是8161,消息通讯端口默认是61616,这些可以在ActiveMQ安装目录下的jetty.xml文件中进行修改。如果需要在防火墙中打开这些端口...
在使用这些库文件时,开发者需要注意以下几点: 1. **集成库文件**:首先,需要将提供的lib和dll文件添加到项目的依赖项中,确保编译器能够找到并正确链接这些库。在Qt Creator中,这通常可以通过调整项目设置来...
ActiveMQ运行时会使用两个端口:消息通讯端口(默认61616)和管理控制台端口(默认8161)。需要在防火墙中开放这两个端口。 编辑`/etc/sysconfig/iptables`文件,在其中添加以下行来允许外部访问: ```bash -A ...
在本文中,我们将深入探讨如何使用Go语言实现与ActiveMQ的通信,主要关注消息的收发功能。ActiveMQ是Apache软件基金会开发的一款开源消息中间件,支持多种协议,包括我们这里提到的STOMP(Simple Text Oriented ...
如果需要加密传输,可以使用"WSS://",这相当于WebSocket的SSL/TLS版本。对于ActiveMQ,其默认的WebSocket监听端口是61614。因此,一个完整的WebSocket连接URL可能是这样的:"ws://activemq服务器地址:61614/...
总结来说,ActiveMQ 提供了一套强大的消息传递机制,但需要对它的特性和机制有深入理解,才能有效地预防和解决可能出现的问题。通过理解服务器宕机时的数据存储策略,处理丢消息的策略,优化持久化消息的发送,调整...
在实际使用中,你可能需要根据你的需求修改`conf/activemq.xml`配置文件,设置如网络连接、安全策略、消息队列和主题等参数。同时,通过`bin`目录下的脚本启动和监控ActiveMQ服务,确保其正常运行。 此外,ActiveMQ...
在压缩包"ActiveMQ-5.1"中,可能包含了示例代码和配置文件,你可以根据这些资料动手实践,通过运行例子来加深对ActiveMQ的理解。这些例子涵盖了基本的发送和接收消息,以及一些高级特性,如消息选择器、事务管理等。...
Apache ActiveMQ是业界广泛使用的开源消息中间件,尤其在Linux环境下表现出色。它基于Java语言开发,遵循Apache软件基金会的许可证,并且实现了多种消息传递协议,包括OpenWire、STOMP、AMQP和XMPP等。在Linux系统上...
**标题:“ActiveMQ问题总结”** 在分布式系统中,消息队列扮演着至关重要的角色,它作为组件间通信的一种高效手段,确保了系统的解耦、异步处理和高可用性。ActiveMQ是Apache软件基金会开发的一款开源消息中间件,...
ActiveMQ 能够帮助开发者实现解耦、可靠的消息传输以及高性能的应用程序集成。 #### 基本概念 - **消息队列**:消息队列是消息中间件的核心组成部分之一,用于存放等待处理的消息。在 ActiveMQ 中,生产者可以将...
ActiveMQ作为MQ的实现,它充当消息的生产者和消费者的中介,确保消息的可靠传输,即使在生产者和消费者之间存在网络问题或处理速度不匹配的情况下。 在该测试工程中,我们将重点关注以下几点: 1. **ActiveMQ的...
5. 安全性:ActiveMQ内置了用户认证和授权机制,可以通过SSL/TLS加密传输,保障数据的安全性。 二、ActiveMQ应用场景 1. 微服务通信:在微服务架构中,ActiveMQ作为服务间通信的桥梁,实现异步解耦和数据同步。 2. ...