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

问题:

移动开通一个短信网关供系统发送短信,后来随着业务增加、以及外系统短信接口接入,导致本系统短信模块处理量急剧增加,每秒发送短信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;
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值