使用ActiveMQ的BLOBMessage

这里是指发送大一点的文本文件或者图片。


发送BLOBMessage:

package com.ibm.cbic.rtls.file;

import java.io.File;

import javax.jms.*;
import javax.swing.JFileChooser;

import org.apache.activemq.*;

/**
 * 通过 ActiveMQ 发送文件的程序
 * 
 * @author hailiang
 */
public class FileSender {

	/**
	 * @param args
	 * @throws JMSException
	 */
	public static void main(String[] args) throws JMSException {

		// 选择文件
		JFileChooser fileChooser = new JFileChooser();
		fileChooser.setDialogTitle("选择文件");
		if (fileChooser.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) {
			return;
		}
		File file = fileChooser.getSelectedFile();

		// 获取 ConnectionFactory
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				"tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/");

		// 创建 Connection
		Connection connection = connectionFactory.createConnection();
		connection.start();

		// 创建 Session
		ActiveMQSession session = (ActiveMQSession) connection.createSession(
				false, Session.AUTO_ACKNOWLEDGE);

		// 创建 Destination
		Destination destination = session.createQueue("File.Transport");

		// 创建 Producer
		MessageProducer producer = session.createProducer(destination);
		producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// 设置为非持久性
		// 设置持久性的话,文件也可以先缓存下来,接收端离线再连接也可以收到文件

		// 构造 BlobMessage,用来传输文件
		BlobMessage blobMessage = session.createBlobMessage(file);
		blobMessage.setStringProperty("FILE.NAME", file.getName());
		blobMessage.setLongProperty("FILE.SIZE", file.length());
		System.out.println("开始发送文件:" + file.getName() + ",文件大小:"
				+ file.length() + " 字节");

		// 7. 发送文件
		producer.send(blobMessage);
		System.out.println("完成文件发送:" + file.getName());

		producer.close();
		session.close();
		connection.close(); // 不关闭 Connection, 程序则不退出
	}
}

接受BLOBMessage:

package com.ibm.cbic.rtls.file;

import java.io.*;

import javax.jms.*;
import javax.jms.Message;
import javax.swing.*;

import org.apache.activemq.*;

public class FileReciever {

	/**
	 * @param args
	 * @throws JMSException
	 */
	public static void main(String[] args) throws JMSException {

		// 获取 ConnectionFactory
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				"tcp://localhost:61616");

		// 创建 Connection
		Connection connection = connectionFactory.createConnection();
		connection.start();

		// 创建 Session
		Session session = connection.createSession(false,
				Session.AUTO_ACKNOWLEDGE);

		// 创建 Destinatione
		Destination destination = session.createQueue("File.Transport");

		// 创建 Consumer
		MessageConsumer consumer = session.createConsumer(destination);

		// 注册消息监听器,当消息到达时被触发并处理消息
		consumer.setMessageListener(new MessageListener() {

			// 监听器中处理消息
			public void onMessage(Message message) {
				if (message instanceof BlobMessage) {
					BlobMessage blobMessage = (BlobMessage) message;
					try {
						String fileName = blobMessage
								.getStringProperty("FILE.NAME");
						System.out.println("文件接收请求处理:" + fileName + ",文件大小:"
								+ blobMessage.getLongProperty("FILE.SIZE")
								+ " 字节");

						JFileChooser fileChooser = new JFileChooser();
						fileChooser.setDialogTitle("请指定文件保存位置");
						fileChooser.setSelectedFile(new File(fileName));
						if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
							File file = fileChooser.getSelectedFile();
							OutputStream os = new FileOutputStream(file);

							System.out.println("开始接收文件:" + fileName);
							InputStream inputStream = blobMessage
									.getInputStream();

							// 写文件,你也可以使用其他方式
							byte[] buff = new byte[256];
							int len = 0;
							while ((len = inputStream.read(buff)) > 0) {
								os.write(buff, 0, len);
							}
							os.close();
							System.out.println("完成文件接收:" + fileName);
						}

					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		});
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值