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 1054 The Troublesome Frog (暴力搜索 + 剪枝优化)
题目链接 看到分类里是dp,结果想了半天,也没想出来,搜了一下题解,全是暴力! 不过剪枝很重要,下面我的代码 266ms. 题意: 在一个矩阵方格里面,青蛙在里面跳,但是青蛙每一步都是等长的跳, 从一 ...
- HDU 4923
题目大意: 给出一串序列Ai{0,1},求一个序列Bi[0,1](Bi<Bi+1),使得sigama(Ai-Bi)^2最小 思路: 若B相同,则取A的平均数可使方差最小 若B有序, 若A== ...
- WebActivatorEx
using System; using NLog; using System.Web.Optimization; [assembly: WebActivatorEx.PreApplicationSta ...
- acdream 1684 娜娜梦游仙境系列——莫名其妙的插曲 (gcd)
题意:一开始有一个集合,集合里有n个不同的数,然后Alice(娜娜)与Bob轮流进行操作,每人都可以任意选择两个数a,b,不妨设a>b,不过要求a-b不在集合中,把a-b放入集合(集合元素个数只 ...
- GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法
GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...
- Java [Leetcode 205]Isomorphic Strings
题目描述: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the ...
- jquery仿邮箱文本输入框自动加载邮箱后缀
在像百度这样的网站注册时,你会看到输入邮箱会出现自动给用户输入补全主流邮箱.这种对于增加用户体验的小例子已司空见惯.正好看到人家写的这种js功能.还挺不错,使用起来很方便,几乎不用写神呢代码.&quo ...
- Android-AnimationDrawable(二)
首先可以先定义一个逐帧播放的xml: <?xml version="1.0" encoding="utf-8"?> <animation-li ...
- jdbc:oracle:thin:@192.168.3.98:1521:orcl(详解)
整理自互联网 一. jdbc:oracle:thin:@192.168.3.98:1521:orcljdbc:表示采用jdbc方式连接数据库oracle:表示连接的是oracle数据库thin:表示连 ...
- C++ STL算法系列3---求和:accumulate
该算法在numeric头文件中定义. 假设vec是一个int型的vector对象,下面的代码: //sum the elements in vec starting the summation wit ...