读书人

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

发布时间: 2012-08-30 09:55:54 作者: rapoo

性能优化(案例二)-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 (+ 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;
??????? }
??? }

读书人网 >软件架构设计

热点推荐