配置短信接口的定时器定时发送心跳包和鉴权

根据WebService接口定时发送短信和心跳包,自己提高自己做的一个小Demo,俗话说得好,好记性不如烂笔头,当然哥也是一个慷慨的人,所以分享出来和大家一起学习和参考哈哈

application.java

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
	xmlns:cxf="http://cxf.apache.org/core"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
		http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
		http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.0.xsd
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
		
		<bean id="smsJobServiceImpl" class="com.sxit.alarm.service.SmsJobServiceImpl"/>
		<!-- <bean id="smsJobServiceImpl" class="com.sxit.alarm.test.Firstquartz"/> -->
		
		<!--配置定时器触发详情 -->
	 	<bean id="timeDitail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="smsJobServiceImpl"/>
		<property name="targetMethod" value="sendActive"/>
		</bean>
		
		<!--定义时间间隔触发器  -->
		<!-- <bean id="timeTigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="timeDitail"></property>
		<property name="cronExpression" value="*/40 * * * * ?"/>
		<property name="startDelay" value="0"></property>    
		</bean> -->
		
		<bean id="timeTigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail" ref="timeDitail"></property>
		<property name="startDelay" value="0"></property>    
		<property name="repeatInterval">
			<value>40000</value>
		</property>
		</bean>
		
		<!--启动定时器  -->
		<bean id="startJob" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="timeTigger" />
			</list>
		</property>
	</bean>
	
</beans>

package com.sxit.alarm.ford;

import java.rmi.RemoteException;

import org.apache.log4j.Logger;

import com.sxit.alarm.service.SmsJobServiceImpl;
import com.sxit.alarm.webservice.AppServiceClient;
import com.sxit.alarm.webservice.model.DeliverMsg;
import com.sxit.alarm.webservice.model.RespInfo;
import com.sxit.alarm.webservice.model.SendRespMsg;
/**
 * 
 * @author lfq
 * 2015-4
 * 移动短信接口
 *
 */
public class Sms{
	/**
	 * 日志对象
	 */
	protected static Logger logger = Logger.getLogger("Sms");
	/**
	 * 鉴权接口
	 * @param header
	 * @param spid
	 * @param password
	 * @return
	 * @throws RemoteException
	 */
	public static RespInfo auth(
			com.sxit.alarm.webservice.model.InfoHeader header,
			java.lang.String spid, java.lang.String password) throws RemoteException{
		AppServiceClient.setEndPoint("http://218.206.27.231:8085/mas/services/AppService");
		return AppServiceClient.auth(header, spid, password);
		
		
	}
	/**
	 * 完整发送短信接口,内部调用了短信下发的相关接口
	 * @param servicenumber
	 * @param content
	 * @param spid
	 * @param spasswd
	 * @param receiveList
	 * @throws RemoteException
	 */
	public static void sendNotifySms(String servicenumber, String content,
			String spid, String spasswd, String[] receiveList)
			throws RemoteException{
		AppServiceClient.sendNotifySms(servicenumber, content, spid, spasswd, receiveList);
	}
	
	/**
	 * 注销接口:会话注销接口 
	 * @param header
	 * @param passport
	 * @return
	 * @throws java.rmi.RemoteException
	 */
	public static RespInfo terminate(
			com.sxit.alarm.webservice.model.InfoHeader header,
			java.lang.String passport) throws java.rmi.RemoteException {
		if (SmsJobServiceImpl.getPassport()!=null&&"".equals(SmsJobServiceImpl.getPassport())) {
			return AppServiceClient.terminate(header,SmsJobServiceImpl.getPassport() );
		}
			logger.error("terminate令牌为空");
		  return null;
		
	}
	
	/**
	 * 下发短信接口:用户鉴权成功后,通过此接口可以进行短信下发
	 * @param header
	 * @param passport
	 * @param sequence
	 * @param srcid
	 * @param receiverList
	 * @param content
	 * @param reportFlag
	 * @return
	 * @throws java.rmi.RemoteException
	 */
	public static RespInfo sendSms(
			com.sxit.alarm.webservice.model.InfoHeader header,
			java.lang.String passport, int sequence, java.lang.String srcid,
			java.lang.String[] receiverList, java.lang.String content,
			boolean reportFlag) throws java.rmi.RemoteException {
		if (SmsJobServiceImpl.getPassport()!=null&&"".equals(SmsJobServiceImpl.getPassport())) {
			return AppServiceClient.sendSms(header, SmsJobServiceImpl.getPassport(), sequence, srcid, receiverList, content, reportFlag);
		}
			logger.error("sendSms令牌通行证为空");
		  return null;
		
	}
	/**
	 * 心跳接口:为了保证用户身份及通行证有效,每90秒自动触发此接口
	 * @param header
	 * @param passport
	 * @return
	 * @throws java.rmi.RemoteException
	 */
	public static RespInfo sendActive(
			com.sxit.alarm.webservice.model.InfoHeader header,
			java.lang.String passport) throws java.rmi.RemoteException {
		 return AppServiceClient.sendActive(header, passport);
	}
	/**
	 * 获取应答状态接口:用户获取已经提交消息msgid接口[支持1000条消息缓存]
	 * @param header
	 * @param passport
	 * @return
	 * @throws java.rmi.RemoteException
	 */
	public static DeliverMsg[] getDeliver(
			com.sxit.alarm.webservice.model.InfoHeader header,
			java.lang.String passport) throws java.rmi.RemoteException {
		if (SmsJobServiceImpl.getPassport()!=null&&"".equals(SmsJobServiceImpl.getPassport())) {
			return AppServiceClient.getDeliver(header, SmsJobServiceImpl.getPassport());
		}
			logger.error("getDeliver令牌通行证为空");
		  return null;
	}
	/**
	 * 状态报告和上行消息接口:用户获取已经提交消息msgid接口[支持1000条消息缓存]
	 * @param header
	 * @param passport
	 * @return
	 * @throws java.rmi.RemoteException
	 */
	public static SendRespMsg[] getSendResp(
			com.sxit.alarm.webservice.model.InfoHeader header,
			java.lang.String passport) throws java.rmi.RemoteException {
		if (SmsJobServiceImpl.getPassport()!=null&&"".equals(SmsJobServiceImpl.getPassport())) {
			return AppServiceClient.getSendResp(header, SmsJobServiceImpl.getPassport());
		}
			logger.error("getSendResp令牌通行证为空");
		  return null;
	}
	/**
	 * 获取时间戳接口
	 * @return
	 */
	public static String getTimeStamp() {
		return AppServiceClient.getTimeStamp();
	} 

}

package com.sxit.alarm.service;

import java.rmi.RemoteException;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import org.apache.log4j.Logger;

import com.sxit.alarm.webservice.model.RespInfo;
/**
 * WebService接口
 * 
 */
@WebService
public interface SmsJobService {
	
	 /**
	  * 心跳接口,90秒执行一次
	  * @throws RemoteException
	  */
	 public void sendActive() throws RemoteException;
	/**
	 * 鉴权接口,服务器启动执行一次
	 * @throws RemoteException
	 */
	 public void auth() throws RemoteException;
	 /**
	  * 发送短信接口
	  * @throws RemoteException
	  */
	 public RespInfo sendSms(int sequenceId,String[] receiverList, String content,String tailNum) throws RemoteException;

	 
	
	
}
package com.sxit.alarm.service;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.util.Properties;

import org.apache.log4j.Logger;
import com.sxit.alarm.ford.Sms;
import com.sxit.alarm.webservice.model.InfoHeader;
import com.sxit.alarm.webservice.model.RespInfo;
public class SmsJobServiceImpl implements SmsJobService {
	private static String endpoint;
	private static int authCode =1;
	private static String passport;// 保存通行证
	private static String pid;
	private static String password;
	
	/**
	 * 日志对象
	 */
	protected static Logger logger = Logger.getLogger("SmsClient");
 
	
 
	// 获得通行证
	public static String getPassport() {
		return passport;
	}

	public static int getAuthCode() {
		return authCode;
	}

 
	@Override
	public synchronized  void  sendActive() {
		RespInfo sendActive = null;
		final InfoHeader header = new InfoHeader();
		header.setCode("sendActive");
		if(passport!=null)
		{
			try {
				sendActive = Sms.sendActive(header, passport);
			} catch (RemoteException e) {
				logger.error(e.getMessage(),e);
			}
		}
	   
		if(sendActive==null||sendActive.getRespCode()!=0||authCode!=0)
		{
			if(sendActive!=null)
			{
				//System.out.println("authauthauthauthauth"+sendActive.getRespCode());
				logger.info("authauthauthauthauth"+sendActive.getRespCode());
			}
			authCode=1;//心跳失败后重新赋值为1
		passport="";//心跳失败后删除原有的passport值
			try {
				auth();
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
				logger.error(e.getMessage(),e);
			}
		}
	}
	
	
	@Override
	public void auth() throws RemoteException {
		final InfoHeader header = new InfoHeader();
		// 设置消息头
		header.setCode("auth");
		// 调用鉴权接口
		RespInfo auth = Sms.auth(header, pid, password);

		if (auth.getRespCode() != 0) {// 鉴权不成功,等待5s,再次鉴权成功,直到成功为止!
			if(auth.getRespCode() == 104 && passport != null && !"".equals(passport))
			{
				final InfoHeader header1 = new InfoHeader();
				header1.setCode("terminate");
				try{
					RespInfo info = Sms.terminate(header1, passport);
					if(info == null)
					{
						//System.out.println("terminate fail");
						logger.info("terminate fail");
					}else{
						//System.out.println("104 callback terminate code:" + info.getRespCode());
						logger.info("104 callback terminate code:"+ info.getRespCode());
					}
				}catch (Exception e){
					
					//e.printStackTrace();
					logger.error(e.getMessage(),e);
				}
			}
			//System.out.println("authing..."+auth.getRespCode()+auth.getRespMessage());
			logger.info("authing..."+auth.getRespCode()+auth.getRespMessage());
			int count = 0;
			while (count<2) {
				count++;
				try {
					Thread.sleep(5 * 1000);
					header.setCode("auth");
					auth = Sms.auth(header, pid, password);
					//System.out.println("authCode="+authCode+" password "+passport);
					logger.info("authCode="+authCode+" password "+passport);
					if (auth.getRespCode() == 0) {//鉴权成功,退出循环
						authCode = auth.getRespCode();
						passport = auth.getRespMessage();
						break;
					}
				} catch (InterruptedException e) {
					//e.printStackTrace();
					logger.error(e.getMessage(),e);
				}
			}

		}
		else//鉴权成功则给authCode和passport赋值			
		{
			authCode = auth.getRespCode();// 设置通行证代码
			passport = auth.getRespMessage();// 设置通行证
		}
	}


	@Override
	public RespInfo sendSms(int sequenceId, String[] receiverList, String content, String tailNum)
			throws RemoteException {
		final InfoHeader header = new InfoHeader();
		if (authCode == 0) {
			header.setCode("sendSms");
			return Sms.sendSms(header, passport, sequenceId, tailNum,
					receiverList, content, true);
		} else {
			//System.out.println("authCode!=0");\
			logger.info("authCode!=0");
			return null;
		}
	}

	
	// 注销
			public static void terminate() throws RemoteException {
				final InfoHeader header = new InfoHeader();
				if(authCode==0){
					header.setCode("terminate");
					Sms.terminate(header, passport);
				}else{
					//System.err.println("鉴权成功后才能注销...");
					
				}
				
			}

	
	

	
}

猜你喜欢

转载自blog.csdn.net/weixin_40151334/article/details/81180239