消息中间件之ActiveMQ

一 . 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 }
View Code
 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 }
View Code

该项目需要导入相应版本的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 }
View Code
 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 }
View Code

 

      

posted @ 2016-04-26 08:56  小z1情调  阅读(160)  评论(0编辑  收藏  举报