当前位置:首页 > 开发 > 编程语言 > 消息中间件 > 正文

性能优化(案例二)-JMS缓冲短信网关

发表于: 2011-05-06   作者:Dead_knight   来源:转载   浏览次数:
摘要: 问题: 移动开通一个短信网关供系统发送短信,后来随着业务增加、以及外系统短信接口接入,导致本系统短信模块处理量急剧增加,每秒发送短信50-80条,每逢访问高峰期,导致短信网关堵塞。   其次是短信模块部署在应用系统现网环境中,应用系统与短信模块性能上相互影响,不稳定。   方案: 由于短信模块直接与短信网关打交道,而应用系统、外系统想发送短息直接与短信模块打交道

问题:

移动开通一个短信网关供系统发送短信,后来随着业务增加、以及外系统短信接口接入,导致本系统短信模块处理量急剧增加,每秒发送短信50-80条,每逢访问高峰期,导致短信网关堵塞。

 

其次是短信模块部署在应用系统现网环境中,应用系统与短信模块性能上相互影响,不稳定。

 

方案:

由于短信模块直接与短信网关打交道,而应用系统、外系统想发送短息直接与短信模块打交道

可单独部署一个短信服务域,本系统、外系统直接访问短信服务域公布的接口访问即可。

通过在短信模块与短信网关中间建立一个缓冲池(JMS)缓冲短消息

 

实施:

步骤一、

服务域的部署(省略)

 

步骤二、

配置JMS(省略)

 

步骤三、

改造原先短信发送的代码

JMS连接初始化:

    private QueueConnection connection;
    private QueueSession session;
    private QueueSender sender;

    public void initialize() throws Exception
    {
        if (log.isInfoEnabled()) {
            log.info("Starting JMS Queue Sender Service...");
        }
       
        try
        {
            InitialContext jndi = getInitialContext("t3://host:port");
            QueueConnectionFactory factory = (QueueConnectionFactory)jndi.lookup("QueueConnectionFactory");
            connection = factory.createQueueConnection();
            session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
            Queue queue = (Queue)jndi.lookup("SMSQueue");  
            sender = session.createSender(queue);
            connection.start();

        }
        catch(Exception e)
        {
            throw e;
        }
    }

    //发送短信数据方法

    public void sendNotification(Serializable message)
    {
        try
        {
            ObjectMessage object = session.createObjectMessage();
            object.setObject(message);
            sender.send(object);
            log.info("Message Sender send object:" + object.getObject());
        }
        catch(JMSException e)
        {
            log.error("A problem was encountered when create Object Message", e);
            e.printStackTrace();
        }
    }

 

步骤四、

短信服务域增加消费JMS消息的监听器

    public void initialize() throws Exception
    {
        if (log.isInfoEnabled()) {
            log.info("Starting JMS Queue Receiver Service...");
        }
       
        try
        {
            InitialContext jndi = new InitialContext();
            QueueConnectionFactory factory = (QueueConnectionFactory)jndi.lookup("QueueConnectionFactory");
            connection = factory.createQueueConnection();
            session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
            Queue queue = (Queue)jndi.lookup("SMSQueue");  
            sender = session.createSender(queue);
            connection.start();
            QueueReceiver receiver = session.createReceiver(queue);
            receiver.setMessageListener(new MessageListener(){
                public void onMessage(Message message)
                {
                    try
                    {
                        ObjectMessage objectMessage = null;
                       
                        if (!(message instanceof ObjectMessage)) {
                            log.error("Cannot handle message of type (class=" + message.getClass().getName() + "). Notification ignored.");
                            return;
                        }

                        objectMessage = (ObjectMessage) message;

                        //check the message content
                        if (!(objectMessage.getObject() instanceof MessageEntity)) {
                            log.error("An unknown cluster notification message received (class=" + objectMessage.getObject().getClass().getName() + "). Notification ignored.");
                            return;
                        }

                        if (log.isDebugEnabled()) {
                            log.debug(objectMessage.getObject());
                        }
                        //实际调用短信网关发送短信的方法

                        handleNotification(objectMessage.getObject());
                    } catch (JMSException jmsEx) {
                        log.error("Cannot handle cluster Notification", jmsEx);
                    }
                }
               
            });
        }
        catch(Exception e)
        {
            throw e;
        }
    }

性能优化(案例二)-JMS缓冲短信网关

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
前几天一同事反映海外工厂A的SSRS报表比较慢,让我检查优化一下。于是我检查了下2015-07-13到2015-0
之前看到一篇关于优化Android性能的文章,写的很不错。但由于一直没有使用过,最近恰好优化Performa
声明: 一不小心使用了QQ的图标,希望不会惹到什么麻烦! 当然,绝不会使用qq图标作为具有商业用途的
我们的一个Reporting Service服务上部署了比较多的SSRS报表,其中有一个系统的SSRS报表部署后,执行
一个可用的案例 现在我们已经对Instruments中动画性能工具非常熟悉了,那么可以用它在现实中解决一
在当今互联网和电商盛行的情况下,网站的性能受到了极大地挑战。大数据,高并发成为大型网站的标志
原文出处: 胡凯的博客(@胡凯me) 欢迎分享原创到伯乐头条 Google前几天刚发布了Android性能优化典
这篇文章的 demo 是在 (一)的基础上进行的调整,逻辑基本相似。本文只列和 上一篇出不同的代码。
[文章作者:狂奔的鹿(陆松林) 本文版本:v1.0 转载请注明原文链接:http://www.cnblogs.com/dynamic
淘宝无线 API 网关的性能优化与高可用性实践 面临无线端大规模并发用户和复杂网络情况下,无线 API
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号