ActiveMQ JMS 在发邮件中的使用

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

主要特点:

1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)

3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

6. 支持通过JDBC和journal提供高速的消息持久化

7. 从设计上保证了高性能的集群,客户端-服务器,点对点

8. 支持Ajax

9. 支持与Axis的整合

10. 可以很容易得调用内嵌JMS provider,进行测试

 

1. ActiveMQ 在linux下的安装和运行

 

(1) 下载ActiveMQ http://activemq.apache.org/download.html

linux下版本  http://www.apache.org/dyn/closer.cgi?path=%2Factivemq%2Fapache-activemq%2F5.5.0%2Fapache-activemq-5.5.0-bin.tar.gz

 

wget http://labs.renren.com/apache-mirror//activemq/apache-activemq/5.5.0/apache-activemq-5.5.0-bin.tar.gz

 

(2) 解压  tar zxvf apache-activemq-5.5.0-bin.tar.gz

 

(3)  运行  apache-activemq-5.5.0/bin/activemq start      默认端口是61616    可以用   netstat -an|grep 61616  来查看

 

(4)  修改端口  在 apache-activemq-5.5.0/conf/activemq.xml   找到

 

 <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>  然后把 61616 该为你想要的端口

 

(5) 设置用户名和密码,来验证客户端的连接

 

  在 apache-activemq-5.5.0/conf/credentials.properties  文件中,修改用户名和密码

 

 

activemq.username=system

activemq.password=manager

guest.password=password

 

 

(6) 停止 activemq ,执行  apache-activemq-5.5.0/bin/activemq stop

 

2.  使用java 来调用

 

(1) 先要获得ConnectionFactory

 

[java] view plain copy
  1. private static ConnectionFactory connectionFactory;  
  2.     /** 
  3.      * 获得连接工厂 
  4.      * */  
  5.     public static ConnectionFactory getJMSConnectionFactory() {  
  6.         if(connectionFactory == null){  
  7.              ConfigModel configModel = ConfigFactory.getConfigModel();  
  8.             //可以设置设定好的用户名和密码  
  9.              connectionFactory = new ActiveMQConnectionFactory(   
  10.                      ActiveMQConnection.DEFAULT_USER,   
  11.                      ActiveMQConnection.DEFAULT_PASSWORD,   
  12.                      "tcp://192.168.0.3:61616");   
  13.         }  
  14.         return connectionFactory;  
  15.     }  

 

 

(2) 发送消息(一个邮件模型),这个模型会保存起来,所以不是发送模型是不费时间的。

 

[java] view plain copy
  1. /** 
  2.      * 发送一个邮件对象 
  3.      * */  
  4.     public static void sendEmailOperationModel(EmailModel emailModel){  
  5.         ConnectionFactory connFactory = getJMSConnectionFactory();  
  6.          try {  
  7.             //JMS 客户端到JMS Provider 的连接   
  8.             Connection connection = connFactory.createConnection();  
  9.             connection.start();  
  10.             // Session: 一个发送或接收消息的线程   
  11.             Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);  
  12.             // Destination :消息的目的地;消息发送给谁.   
  13.             // 获取session注意参数值my-queue是Query的名字   
  14.             Destination destination = session.createQueue(AppConstants.JMS_QUEUE_NAME_EMAIL);  
  15.             // MessageProducer:消息生产者   
  16.             MessageProducer producer = session.createProducer(destination);  
  17.             // 设置失效时间  
  18.             //producer.setTimeToLive(3600 * 1000 * 24 * 2);  
  19.             //设置持久化   
  20.             //producer.setDeliveryMode(DeliveryMode.PERSISTENT);  
  21.             //发送一条消息   
  22.             ObjectMessage objectMessage = session.createObjectMessage(emailModel);  
  23.             //通过消息生产者发出消息   
  24.             producer.send(objectMessage);  
  25.             session.commit();  
  26.             connection.close();  
  27.         } catch (Exception e) {  
  28.             e.printStackTrace();  
  29.         }   
  30.     }  

 

 

(3)  触发来发送邮件,这个是异步操作,不影响系统性能, 需要在系统启动时启动这个线程来监听消息,然后发邮件

 

[c-sharp] view plain copy
  1. public class MailSendManager extends Thread{  
  2.     protected final Log log = LogFactory.getLog(MailSendManager.class);  
  3.     public MailSendManager() {  
  4.     }  
  5.     /** 
  6.      * 等待接受操作信息然后发邮件 
  7.      * */  
  8.     public static void sendEmail(){  
  9.         try {  
  10.             //JMS 客户端到JMS Provider 的连接   
  11.             Connection connection = JMSFactory.getJMSConnectionFactory().createConnection();  
  12.             connection.start();  
  13.             // Session: 一个发送或接收消息的线程   
  14.             Session session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);  
  15.             // Destination :消息的目的地;消息发送给谁.   
  16.             // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置   
  17.             Destination destination = session.createQueue(AppConstants.JMS_QUEUE_NAME_EMAIL);  
  18.             MessageConsumer consumer = session.createConsumer(destination);  
  19.             //应用阻塞模式  
  20.             /*while (true) {  
  21.                 Message message = consumer.receive(); 
  22.                 if(message instanceof ObjectMessage){ 
  23.                     ObjectMessage omsg = (ObjectMessage) message; 
  24.                  
  25.                     //EmailModel operationModel = (EmailModel) omsg.getObject(); 
  26.                     //发送邮件 
  27.                     //MailSender.sendMail(operationModel); 
  28.                     System.out.println("send email ok --------------"); 
  29.                 } 
  30.             } */  
  31.             //应用事件模型  
  32.             consumer.setMessageListener(new MessageListener() {  
  33.                 public void onMessage(Message message) {  
  34.                     try {  
  35.                         if (message instanceof ObjectMessage) {  
  36.                             ObjectMessage omsg = (ObjectMessage) message;  
  37.                             EmailModel operationModel = (EmailModel) omsg.getObject();  
  38.                             //发送邮件  
  39.                             MailSender.sendMail(operationModel);  
  40.                         }  
  41.                     } catch (Exception e) {  
  42.                         e.printStackTrace();  
  43.                     }  
  44.                 }  
  45.             });  
  46.             //session.close();   
  47.             //connection.close();  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }   
  51.     }  
  52.     public void run(){  
  53.         MailSendManager.sendEmail();  
  54.     }  

转载自:http://blog.csdn.net/kindy1022/article/details/6427985

你可能感兴趣的:(activemq)