一 . ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,也是一款易于使用的消息中间件。
MQ(Message Queue)消息队列,是一个用于消息接受和转发的容器,可用于消息推送。
二 . ActiveMQ的安装。
下载ActiveMQ 官方网站:http://activemq.apache.org/
然后解压,在解压后的bin目录下找到activemq.bat文件,双击即可(前提条件是配置好Java环境变量)。
如图,则表示服务启动成功,同时,保持服务后台启动(不要关闭该控制台)。
在浏览器地址栏输入:http://localhost:8161/admin 用于监控ActiveMQ。
三 . ActiveMQ实例1(消息的发送与接收)


1 import javax.jms.Connection; 2 import javax.jms.ConnectionFactory; 3 import javax.jms.DeliveryMode; 4 import javax.jms.Destination; 5 import javax.jms.MessageProducer; 6 import javax.jms.Session; 7 import javax.jms.TextMessage; 8 import org.apache.activemq.ActiveMQConnection; 9 import org.apache.activemq.ActiveMQConnectionFactory; 10 11 public class Sender { 12 private static final int SEND_NUMBER = 2; 13 14 public static void main(String[] args) { 15 ConnectionFactory connectionFactory; 16 Connection connection = null; 17 Session session; 18 Destination destination; 19 MessageProducer producer; 20 connectionFactory = new ActiveMQConnectionFactory( 21 ActiveMQConnection.DEFAULT_USER, 22 ActiveMQConnection.DEFAULT_PASSWORD, 23 "tcp://localhost:61616"); 24 try { 25 connection = connectionFactory.createConnection(); 26 connection.start(); 27 session = connection.createSession(Boolean.TRUE, 28 Session.AUTO_ACKNOWLEDGE); 29 destination = session.createQueue("FirstQueue"); 30 producer = session.createProducer(destination); 31 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 32 sendMessage(session, producer); 33 session.commit(); 34 } catch (Exception e) { 35 e.printStackTrace(); 36 } finally { 37 try { 38 if (null != connection) 39 connection.close(); 40 } catch (Throwable ignore) { 41 } 42 } 43 } 44 45 public static void sendMessage(Session session, MessageProducer producer) 46 throws Exception { 47 for (int i = 1; i <= SEND_NUMBER; i++) { 48 TextMessage message = session 49 .createTextMessage("使用ActiveMq发送的消息"+ i); 50 System.out.println("发送消息:" + "使用ActiveMq发送的消息" + i); 51 producer.send(message); 52 } 53 } 54 }


1 import javax.jms.Connection; 2 import javax.jms.ConnectionFactory; 3 import javax.jms.Destination; 4 import javax.jms.MessageConsumer; 5 import javax.jms.Session; 6 import javax.jms.TextMessage; 7 import org.apache.activemq.ActiveMQConnection; 8 import org.apache.activemq.ActiveMQConnectionFactory; 9 10 public class Receiver { 11 public static void main(String[] args) { 12 ConnectionFactory connectionFactory;//连接工厂,JMS用它创建连接 13 Connection connection = null; //JMS客户端到JMS Provider 的连接 14 Session session; //一个发送或接收消息的线程 15 Destination destination; //消息的目的地 16 MessageConsumer consumer; //消息接收者 17 connectionFactory = new ActiveMQConnectionFactory( 18 ActiveMQConnection.DEFAULT_USER, 19 ActiveMQConnection.DEFAULT_PASSWORD, 20 "tcp://localhost:61616"); 21 try { 22 connection = connectionFactory.createConnection(); 23 connection.start(); 24 session = connection.createSession(Boolean.FALSE, 25 Session.AUTO_ACKNOWLEDGE); 26 destination = session.createQueue("FirstQueue"); 27 consumer = session.createConsumer(destination); 28 while (true) { 29 TextMessage message = (TextMessage) consumer.receive(500000); 30 if (null != message) { 31 System.out.println("收到消息: " + message.getText()); 32 } else { 33 break; 34 } 35 } 36 } catch (Exception e) { 37 e.printStackTrace(); 38 } finally { 39 try { 40 if (null != connection) 41 connection.close(); 42 } catch (Throwable ignore) { 43 } 44 } 45 } 46 }
该项目需要导入相应版本的jar包,如:activemq-all-5.2.0.jar
该代码只能用于本地的发送与接收,若要进行同局域网的通信则需要修改连接工厂的tcp参数。
发送方将消息发送到ActiveMQ Console,不需要修改,而接收方要将localhost改为本机的局域网IP地址。如:"tcp://10.12.10.36:61616"。
注意:发送方每发送一次消息只能有一个接受者来接收,即消息只能被接受一次。
四 . ActiveMQ实例2 (文件的接收与发送)


1 import java.io.File; 2 import javax.jms.*; 3 import javax.swing.JFileChooser; 4 import org.apache.activemq.*; 5 6 public class FileSender { 7 8 public static void main(String[] args) throws JMSException { 9 JFileChooser fileChooser = new JFileChooser(); 10 fileChooser.setDialogTitle("请选择要传送的文件"); 11 if (fileChooser.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) { 12 return; 13 } 14 File file = fileChooser.getSelectedFile(); 15 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( 16 "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/"); 17 Connection connection = connectionFactory.createConnection(); 18 connection.start(); 19 ActiveMQSession session = (ActiveMQSession) connection.createSession( 20 false, Session.AUTO_ACKNOWLEDGE); 21 Destination destination = session.createQueue("File.Transport"); 22 MessageProducer producer = session.createProducer(destination); 23 producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //传输模式为非持久性,设置持久性的话,文件也可以先缓存下来,接收端离线再连接也可以收到文件 24 BlobMessage blobMessage = session.createBlobMessage(file); 25 blobMessage.setStringProperty("FILE.NAME", file.getName()); 26 blobMessage.setLongProperty("FILE.SIZE", file.length()); 27 System.out.println("开始发送文件:" + file.getName() + ",文件大小:" 28 + file.length() + " 字节"); 29 producer.send(blobMessage); 30 System.out.println("完成文件发送:" + file.getName()); 31 producer.close(); 32 session.close(); 33 connection.close(); 34 } 35 }


1 import java.io.*; 2 import javax.jms.*; 3 import javax.jms.Message; 4 import javax.swing.*; 5 import org.apache.activemq.*; 6 7 public class FileReceiver { 8 public static void main(String[] args) throws JMSException { 9 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( 10 "tcp://localhost:61616"); 11 Connection connection = connectionFactory.createConnection(); 12 connection.start(); 13 Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE); 14 Destination destination = session.createQueue("File.Transport"); 15 MessageConsumer consumer = session.createConsumer(destination); 16 consumer.setMessageListener(new MessageListener() { 17 public void onMessage(Message message) { 18 if (message instanceof BlobMessage) { 19 BlobMessage blobMessage = (BlobMessage) message; 20 try { 21 String fileName = blobMessage.getStringProperty("FILE.NAME"); 22 System.out.println("件接收请求处理:" + fileName + ",文件大小:" 23 + blobMessage.getLongProperty("FILE.SIZE")+ " 字节"); 24 JFileChooser fileChooser = new JFileChooser(); 25 fileChooser.setDialogTitle("请指定文件保存位置"); 26 fileChooser.setSelectedFile(new File(fileName)); 27 if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { 28 File file = fileChooser.getSelectedFile(); 29 OutputStream os = new FileOutputStream(file); 30 System.out.println("开始接收文件:" + fileName); 31 InputStream inputStream = blobMessage.getInputStream(); 32 byte[] buff = new byte[256]; 33 int len = 0; 34 while ((len = inputStream.read(buff)) > 0) { 35 os.write(buff, 0, len); 36 } 37 os.close(); 38 System.out.println("完成文件接收:" + fileName); 39 } 40 } catch (Exception e) { 41 e.printStackTrace(); 42 } 43 } 44 } 45 }); 46 } 47 }