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命令既然还能直接发邮件 ...
随机推荐
- CXF客户端异常
基于CXF2.3.0 Caused by: java.lang.InstantiationException: org.apache.cxf.wstx_msv_validation.WoodstoxV ...
- C#路径/文件/目录/I/O常见操作汇总<转载>
文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...
- WIN7开无线
可以的,WIN7自身就带有这个功能的,不过默认是不开启的,也可以下载一个软件来弄.1.请却仍您使用的操作系统是微软的Windows 7或者Windows server 2008 R2,正版盗版皆可.( ...
- uva 10047 The Monocycle(搜索)
好复杂的样子..其实就是纸老虎,多了方向.颜色两个状态罢了,依旧是bfs. 更新的时候注意处理好就行了,vis[][][][]要勇敢地开. 不过这个代码交了十几遍的submission error,手 ...
- zollei的心动噪声探索性识别
<Exploratory Identification of Cardiac Noise in fMRI Images> 这个方法,最特别的地方在于, 是从静息态的大脑数据中,抽取心动结构 ...
- HWM的实验
HWM是数据段中使用空间和未使用空间之间的界限,假如现有自由链表上的数据块不能满足需求,Oracle把HWM指向的数据块加入到自由链表上,HWM向前移动到下一个数据块.简单说,一个数据段中,HWM左边 ...
- 【转】mac终端安装node时候,显示“-bash: brew: command not found”,怎么解决?
原文网址:https://segmentfault.com/q/1010000004221389/a-1020000004221408 mac终端安装node时候,显示“-bash: brew: co ...
- HDU 4422 The Little Girl who Picks Mushrooms
题意:一共有5座山,已知小女孩在n座山采了n篮蘑菇,如果n小于5则在其他的山里采了任意重量的蘑菇,给出每篮蘑菇的重量,她回去的时候会遇到仨女巫要她交出三篮蘑菇的重量和恰好为1024的倍数,否则就把她的 ...
- Party at Hali-Bula
题意: n个人参加party,给出n个人的工作关系树,一个人和他的顶头上司不能同时参加,party达到的最大人数并判断邀请的最大人数名单是否唯一. 分析: 树状dp入门 dp[i][f],以i为根的子 ...
- HDU 4325-Flowers(线段树+离散化)
题意: 给出每个花开花的时间段,每询问一个时间点输出该时间点开花的数量 分析: 线段树的区间更新,单点查询,但发现时间很大,没法存区间,就想到了离散化. 离散化就是把要处理的数据统一起来重新标号. # ...