package com.work.activemq;
/**
* @author wangmingjie
* @date 2009-7-29上午09:00:48
*/
import java.io.File;
import java.io.IOException;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.BlobMessage;
import org.apache.activemq.command.ActiveMQQueue;
public class BlobMessageSendTest {
private String user = ActiveMQConnection.DEFAULT_USER;
private String password = ActiveMQConnection.DEFAULT_PASSWORD;
// private String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private String url = "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/";
private String subject = "Blob Queue";
private Destination destination = null;
private ActiveMQConnection connection = null;
private ActiveMQSession session = null;
private MessageProducer producer = null;
// 初始化
private void initialize() throws JMSException, Exception {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory( url);
connection = (ActiveMQConnection)connectionFactory.createConnection();
/*
* !!!!!!!!!!!!!!!!!!!!!!!!! very important. If it is set to true
* (default) the uploader is lost in translation ;)
* !!!!!!!!!!!!!!!!!!!!!!!!!
*/
connection.setCopyMessageOnSend(false);
session = (ActiveMQSession)connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue(subject);
// destination = session.createTopic(subject);
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
// 发送消息
public void produceMessage(File file) throws JMSException, Exception {
initialize();
BlobMessage msg = session.createBlobMessage(file);
connection.start();
System.out.println("Producer:->Sending message: " + file.getName());
producer.send(msg);
System.out.println("Producer:->Message sent complete!");
}
// 关闭连接
public void close() throws JMSException {
System.out.println("Producer:->Closing connection");
if (producer != null)
producer.close();
if (session != null)
session.close();
if (connection != null)
connection.close();
}
/**
* 测试成功,能够发送到服务器上。
* @param args
* @throws IOException
*/
public void send() throws IOException {
long start = System.currentTimeMillis();
/*
* First you must tell how the Blob repository can be found. Use
* ActiveMQ 5.1.0+ as broker because the fileserver webapp works there
* out of the box.
*/
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(
"tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/");
ActiveMQConnection conn = null;
ActiveMQSession session = null;
try {
conn = (ActiveMQConnection) cf.createConnection();
session = (ActiveMQSession) conn.createSession(false,
Session.AUTO_ACKNOWLEDGE);
Destination destination = new ActiveMQQueue("Blob Queue");
MessageProducer producer = session.createProducer(destination);
/*
* !!!!!!!!!!!!!!!!!!!!!!!!! very important. If it is set to true
* (default) the uploader is lost in translation ;)
* !!!!!!!!!!!!!!!!!!!!!!!!!
*/
conn.setCopyMessageOnSend(false);
// File file = File.createTempFile("amq-data-file-", ".dat");
// // lets write some data
// BufferedWriter writer = new BufferedWriter(new FileWriter(file));
// writer.append("Hello World!");
// writer.close();
File file = new File("d:/BUG管理需求和设计.doc");
/*
* i have used an simple ascii file instead of the picture you want
* to use
*/
BlobMessage message = session.createBlobMessage(file);
/*
* should only work if you receive the message
*/
// System.out.println(message.getInputStream());
producer.send(message);
/*
* After all you can see a new file under
* $Brokerlocation$/webapps/fileserver/
*/
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
if (session != null) {
session.close();
}
if (conn != null) {
conn.close();
}
} catch (JMSException ex) {
}
}
System.out.println("共花费了"+(System.currentTimeMillis() - start)+"毫秒!");
}
}
package com.work.activemq;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.BlobMessage;
/**
* @author wangmingjie
* @date 2009-7-29上午09:05:10
*/
public class BlobMessageReceiveTest implements MessageListener {
private String user = ActiveMQConnection.DEFAULT_USER;
private String password = ActiveMQConnection.DEFAULT_PASSWORD;
// private String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private String url = "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/";
private String subject = "Blob Queue";
private Destination destination = null;
private ActiveMQConnection connection = null;
private ActiveMQSession session = null;
private MessageConsumer consumer = null;
private static int count = 1; //计数器
// 初始化
private void initialize() throws JMSException, Exception {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
url);
connection = (ActiveMQConnection)connectionFactory.createConnection();
/*
* !!!!!!!!!!!!!!!!!!!!!!!!! very important. If it is set to true
* (default) the uploader is lost in translation ;)
* !!!!!!!!!!!!!!!!!!!!!!!!!
*/
connection.setCopyMessageOnSend(false);
session = (ActiveMQSession)connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue(subject);
// destination = session.createTopic(subject);
consumer = session.createConsumer(destination);
}
// 消费消息
public void consumeMessage() throws JMSException, Exception {
initialize();
connection.start();
System.out.println("Consumer:->Begin listening...");
// 开始监听
consumer.setMessageListener(this);
// Message message = consumer.receive();
}
// 关闭连接
public void close() throws JMSException {
System.out.println("Consumer:->Closing connection");
if (consumer != null)
consumer.close();
if (session != null)
session.close();
if (connection != null)
connection.close();
}
// 消息处理函数
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage txtMsg = (TextMessage) message;
String msg = txtMsg.getText();
System.out.println("Consumer:->Received: " + msg);
}else if (message instanceof BlobMessage) {
try {
InputStream inStr = ((BlobMessage)message).getInputStream();
BufferedInputStream bin = new BufferedInputStream(inStr);
File file = new File("c:/new.rar");
FileOutputStream fos = new FileOutputStream(file);
byte[] block = new byte[4096];//大小不同,文件就可能损坏。
while (true) {
int readLength = bin.read(block);
if (readLength == -1)
break;// end of file
fos.write(block, 0, readLength); //一定要写入实际读取内容
}
bin.close();
inStr.close();
fos.flush();
fos.close();
System.out.println("第"+count+++"次Consumer:->Received BlobMessage wangmj ");
} catch (IOException e) {
e.printStackTrace();
}
}else {
System.out.println("Consumer:->Received: " + message);
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.work.activemq;
import java.io.File;
/**
* @author wangmingjie
* @date 2009-7-29上午09:21:53
*/
public class BlobMessageClient {
/**
* topic方式,必须先启动消费者,然后是生产者,否则接收不到消息。
* queue方式,最好先启动生产者,然后启动消费者,否则也容易收不到消息。
* @param args
*/
public static void main(String[] args) throws Exception {
BlobMessageSendTest producer = new BlobMessageSendTest();
BlobMessageReceiveTest consumer = new BlobMessageReceiveTest();
String fileName = "e:/javagood/clearbug1.6.zip";
// String fileName = "d:/JAVA+开发视频会议系统详细设计.doc";
File file = new File(fileName);
producer.produceMessage(file);
producer.close();
// 延时500毫秒之后停止接受消息
Thread.sleep(2000);
// 开始监听
consumer.consumeMessage();
// 延时500毫秒之后发送消息
Thread.sleep(2000);
consumer.close();
}
}