zoukankan      html  css  js  c++  java
  • 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

    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) 发送消息(一个邮件模型),这个模型会保存起来,所以不是发送模型是不费时间的。

    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 plaincopy
    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

  • 相关阅读:
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    CodeForces
    Code froces 831 A. Unimodal Array
    无聊随便敲敲
  • 原文地址:https://www.cnblogs.com/chenying99/p/3164702.html
Copyright © 2011-2022 走看看