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
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
- private static ConnectionFactory connectionFactory;
- /**
- * 获得连接工厂
- * */
- public static ConnectionFactory getJMSConnectionFactory() {
- if(connectionFactory == null){
- ConfigModel configModel = ConfigFactory.getConfigModel();
- //可以设置设定好的用户名和密码
- connectionFactory = new ActiveMQConnectionFactory(
- ActiveMQConnection.DEFAULT_USER,
- ActiveMQConnection.DEFAULT_PASSWORD,
- "tcp://192.168.0.3:61616");
- }
- return connectionFactory;
- }
(2) 发送消息(一个邮件模型),这个模型会保存起来,所以不是发送模型是不费时间的。
- /**
- * 发送一个邮件对象
- * */
- public static void sendEmailOperationModel(EmailModel emailModel){
- ConnectionFactory connFactory = getJMSConnectionFactory();
- try {
- //JMS 客户端到JMS Provider 的连接
- Connection connection = connFactory.createConnection();
- connection.start();
- // Session: 一个发送或接收消息的线程
- Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
- // Destination :消息的目的地;消息发送给谁.
- // 获取session注意参数值my-queue是Query的名字
- Destination destination = session.createQueue(AppConstants.JMS_QUEUE_NAME_EMAIL);
- // MessageProducer:消息生产者
- MessageProducer producer = session.createProducer(destination);
- // 设置失效时间
- //producer.setTimeToLive(3600 * 1000 * 24 * 2);
- //设置持久化
- //producer.setDeliveryMode(DeliveryMode.PERSISTENT);
- //发送一条消息
- ObjectMessage objectMessage = session.createObjectMessage(emailModel);
- //通过消息生产者发出消息
- producer.send(objectMessage);
- session.commit();
- connection.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
(3) 触发来发送邮件,这个是异步操作,不影响系统性能, 需要在系统启动时启动这个线程来监听消息,然后发邮件
- public class MailSendManager extends Thread{
- protected final Log log = LogFactory.getLog(MailSendManager.class);
- public MailSendManager() {
- }
- /**
- * 等待接受操作信息然后发邮件
- * */
- public static void sendEmail(){
- try {
- //JMS 客户端到JMS Provider 的连接
- Connection connection = JMSFactory.getJMSConnectionFactory().createConnection();
- connection.start();
- // Session: 一个发送或接收消息的线程
- Session session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);
- // Destination :消息的目的地;消息发送给谁.
- // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
- Destination destination = session.createQueue(AppConstants.JMS_QUEUE_NAME_EMAIL);
- MessageConsumer consumer = session.createConsumer(destination);
- //应用阻塞模式
- /*while (true) {
- Message message = consumer.receive();
- if(message instanceof ObjectMessage){
- ObjectMessage omsg = (ObjectMessage) message;
- //EmailModel operationModel = (EmailModel) omsg.getObject();
- //发送邮件
- //MailSender.sendMail(operationModel);
- System.out.println("send email ok --------------");
- }
- } */
- //应用事件模型
- consumer.setMessageListener(new MessageListener() {
- public void onMessage(Message message) {
- try {
- if (message instanceof ObjectMessage) {
- ObjectMessage omsg = (ObjectMessage) message;
- EmailModel operationModel = (EmailModel) omsg.getObject();
- //发送邮件
- MailSender.sendMail(operationModel);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- //session.close();
- //connection.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void run(){
- MailSendManager.sendEmail();
- }
转载自:http://blog.csdn.net/kindy1022/article/details/6427985
ActiveMQ JMS 在发邮件中的使用的更多相关文章
- iOS中如何切换到发短信、打电话、发邮件
我们在做APP的时候,难免会遇到需要调用短信,电话等程序的时候.如美团. 当然,这些都只是一些简单的方法就可以实现,但是时间久了也会淡忘,所以想写这边博客.一是为了再捡起来复习一下,另一个相当于留个备 ...
- 实现celery中出现拥挤队列时,及时发邮件通知
里面有几个常用的功能,以后值得借鉴. 如获取脚本目录,IP,获取shell返回值,发送邮件等.. 上午写完,中午测试,下午上线~~ #!/usr/bin/env python # -*- coding ...
- iOS中打电话、打开网址、发邮件、发短信等
常用小功能 小功能简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话-方法1 最简单最直接的方式:直接跳到拨号界面 NSURL *url = [ ...
- shell中mail发邮件的问题
今天为了监控一下脚本,按照网上说的利用mail 发邮件,mail -s "error预警2" peien@1221.qq.com<'邮件内容',发现出现cc,不知道啥问题,也 ...
- Springboot与ActiveMQ、Solr、Redis中分布式事物的初步探索
Springboot与ActiveMQ.Solr.Redis中分布式事物的初步探索 解决的场景:事物中的异步问题,当要求数据库与solr服务器的最终一致时. 程序条件: 利用消息队列,当数据库添加成功 ...
- ActiveMQ入门系列之应用:Springboot+ActiveMQ+JavaMail实现异步邮件发送
现在邮件发送功能已经是几乎每个系统或网址必备的功能了,从用户注册的确认到找回密码再到消息提醒,这些功能普遍的会用到邮件发送功能.我们都买过火车票,买完后会有邮件提醒,有时候邮件并不是买完票立马就能收到 ...
- # PHP - 使用PHPMailer发邮件
PHPMailer支持多种邮件发送方式,使用起来非常简单 1.下载PHPMailer https://github.com/PHPMailer/PHPMailer,下载完成加压后, 把下边的两个文件复 ...
- 测试MailUtils,作用是发邮件
package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...
- 学习linux之用mail命令发邮件
背景 这两天工作比较闲,网上各种冲浪(这个词暴露我的网龄了).看到一位大神的文章更闲 <>.端详一番,原来是用R语言拼接字符串后用shell命令发出去.发现shell命令既然还能直接发邮件 ...
随机推荐
- poj 2029 Get Many Persimmon Trees (dp)
题目链接 又是一道完全自己想出来的dp题. 题意:一个w*h的图中,有n个点,给一个s*t的圈,求这个圈能 圈的最多的点 分析:d[i][j]代表i行j列 到第一行第一列的这个方框内有多少个点, 然后 ...
- BZOJ2226: [Spoj 5971] LCMSum
题解: 考虑枚举gcd,然后问题转化为求<=n且与n互质的数的和. 这是有公式的f[i]=phi[i]*i/2 然后卡一卡时就可以过了. 代码: #include<cstdio> # ...
- ASP.NET MVC @helper使用说明
简单的 @helper 方法应用场景 Razor中的@helper语法让您能够轻松创建可重用的方法,此方法可以在您的视图模板中封装输出功能.他们使代码能更好地重用,也使代码更具有可读性. 在我们定义@ ...
- 试图从数据库 ‘UFData_001_2003' 中提取的逻辑页 (1:10720) 属于对象 '0',而非对象 'syscolumns'
数据库可以使用,可以备份,但对备份进行恢复时报错,使用sp_attach_db对两个物理文件进行连接时,报同样错误: 服务器: 消息 605,级别 21,状态 1,行 1 试图从数据库 ‘UFData ...
- AspNet WebApi OData 学习
OData介绍:是一个查询和更新数据的Web协议.OData应用了web技术如HTTP.Atom发布协议(AtomPub)和JSON等来提供对不同应用程序,服务 和存储的信息访问.除了提供一些基本的操 ...
- I.MX6 Linux udev porting
/*********************************************************************** * I.MX6 Linux udev porting ...
- shell 的判断与比较
1 shell 的$! ,$?, $$,$@ $n $1 the first parameter,$2 the second... $# The number of co ...
- oracle查询某个用户下的所有视图
SYS>select view_name from dba_views where owner = 'NS_RAS3'; VIEW_NAME--------------------------- ...
- 转载RabbitMQ入门(3)--发布和订阅
发布和订阅 (使用java 客户端) 在先前的指南中,我们创建了一个工作队列.这工作队列后面的假想是每一个任务都被准确的传递给工作者.在这部分我们将会做一些完全不同的事情–我们将一个消息传递给多个消费 ...
- 【转】iOS类似Android上toast效果
原文网址:http://m.blog.csdn.net/article/details?id=50478737 做过Android开发的人都知道toast,它会在界面上显示一排黑色背景的文字,用于提示 ...