您好,登錄后才能下訂單哦!
在寫運維工單的消息推送時,直接使用郵件發送會導致系統反應特別慢,所以研究了一下rabbitmq+celery來實現郵件發送的異步執行
部署rabbitmq
RabbitMQ是基于Erlang的,所以首先必須配置Erlang環境。
從Erlang的官網 http://www.erlang.org/download.html 下載最新的erlang安裝包,我下載的版本是 otp_src_R15B01.tar.gz。
tar xvzf otp_src_R15B01.tar.gz cd otp_src_R14B03 ./configure make make install
安裝完Erlang,開始安裝RabbitMQ-Server。
主要參考官方文檔:http://www.rabbitmq.com/build-server.html
需要安裝一個比較新的Python版本。安裝略。
'''
這一步我沒有做,安裝也沒收到影響,在此僅是記載
需要安裝simplejson。從此處下載最新的版本: http://pypi.python.org/pypi/simplejson#downloads 。我下載的版本是 simplejson-2.2.1.tar.gz
$ tar xvzf simplejson-2.2.1.tar.gz $ cd simplejson-2.2.1 $ sudo python setup.py install
''''
然后安裝RabbitMQ Server。從此處下載源代碼版本的RabbitMQ: http://www.rabbitmq.com/server.html。我下載的版本是 rabbitmq_server-3.5.4.tar.gz
$ tar xvzf rabbitmq_server-3.5.4.tar.gz $ cd rabbitmq_server-3.5.4 $ make # TARGET_DIR=/usr/local SBIN_DIR=/usr/local/sbin MAN_DIR=/usr/local/man make install
在sbin/目錄下出現了三個命令:
rabbitmqctl rabbitmq-env rabbitmq-server
安裝成功。
運行
找到sbin/目錄,運行程序:
/usr/local/sbin/rabbitmq-server –detached
停止程序:
/usr/local/sbin/rabbitmqctl stop
在settings.py中加入rabbitmq配置:
BROKER_HOST = "127.0.0.1" BROKER_PORT = 5672 BROKER_USER = "guest" BROKER_PASSWORD = "guest" BROKER_VHOST = "/"
'''以下為參考資料'''
配置
主要參考官方文檔:http://www.rabbitmq.com/configure.html
一般情況下,RabbitMQ的默認配置就足夠了。如果希望特殊設置的話,有兩個途徑:
一個是環境變量的配置文件 rabbitmq-env.conf ;
一個是配置信息的配置文件 rabbitmq.config;
注意,這兩個文件默認是沒有的,如果需要必須自己創建。
rabbitmq-env.conf
這個文件的位置是確定和不能改變的,位于:/etc/rabbitmq目錄下(這個目錄需要自己創建)。
文件的內容包括了RabbitMQ的一些環境變量,常用的有:
#RABBITMQ_NODE_PORT= //端口號
#HOSTNAME=
RABBITMQ_NODENAME=mq
RABBITMQ_CONFIG_FILE= //配置文件的路徑
RABBITMQ_MNESIA_BASE=/rabbitmq/data //需要使用的MNESIA數據庫的路徑
RABBITMQ_LOG_BASE=/rabbitmq/log //log的路徑
RABBITMQ_PLUGINS_DIR=/rabbitmq/plugins //插件的路徑
具體的列表見:http://www.rabbitmq.com/configure.html#define-environment-variables
rabbitmq.config
這是一個標準的erlang配置文件。它必須符合erlang配置文件的標準。
它既有默認的目錄,也可以在rabbitmq-env.conf文件中配置。
文件的內容詳見:http://www.rabbitmq.com/configure.html#config-items
部署celery
直接執行
pip install django-celery
在settings.py中加入以下配置
import djcelery djcelery.setup_loader() ... INSTALLED_APPS = ( ... 'djcelery', ... )
最后創建Celery所需的數據表, 如果使用South作為數據遷移工具, 則運行:
python manage.py migrate
否則運行: (Django 1.6或Django 1.7都可以)
python manage.py syncdb
到此django+rabbitmq+celery的環境就部署完了,下面是郵件發送的代碼,這里是用的django自帶的郵件發送功能
在settings.py中加入郵件發送配置:
EMAIL_HOST='outlook.office365.com' EMAIL_HOST_USER='**@**.com' EMAIL_HOST_PASSWORD='***' EMAIL_USE_TLS = True
創建一個新py文件,命名為tasks.py
from celery.task import Task from celery import task from workflow import models from django.core.mail import EmailMessage from django.template import loader from worksystem.settings import EMAIL_HOST_USER @task() def send_email(subject, content, to_name_list): html_content = loader.render_to_string( 'sendmail.html', #需要渲染的html模板 { 'content':content } ) msg = EmailMessage(subject, html_content, EMAIL_HOST_USER, to_name_list) msg.content_subtype = "html" # Main content is now text/html msg.send()
sendmail.html模版:
<!DOCTYPE html> <html lang="en"> <h>您好,您有新工單消息提醒,詳情請點擊 http://**.**.com/</h> <table class="cellspacing="1px" "> <thead> <tr> <th >列名</th> <th >相應值</th> </tr> </thead> <tbody> {% for item in content %} <tr> <th >主鍵ID</th> <th >{{ item.id }}</th> </tr> <tr> <th >工單名稱</th> <th >{{ item.title }}</th> </tr> <tr> <th >申請人</th> <th >{{ item.creator }}</th> </tr> <tr> <th >工單類型</th> <th >{{ item.type }}</th> </tr> <tr> <th >創建時間</th> <th >{{ item.create_time|date:"Y-m-d H:i:s" }}</th> </tr> <tr> <th >審批人</th> <th >{{ item.approveuser }}</th> </tr> <tr> <th >描述</th> <th >{{ item.description }}</th> </tr> <tr> <th >處理人</th> <th >{{ item.deal_user }}</th> </tr> <tr> <th >運帷回復</th> <th >{{ item.opsreply }}</th> </tr> <tr> <th >狀態</th> <th >{{ item.state }}</th> </tr> {% endfor %} </tbody> </table> </html>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。