첫 두 기사에서는 SMS 메시지를 보내고 SMS 메시지를 보내는 빈도를 제한하는 동기/비동기식을 구현했습니다. 이 기사에서는 매일 SMS 메시지를 동일한 사용자 (휴대 전화 번호 및 IP에 따라 판단)에게 보내는 횟수를 제한하는 것을 소개합니다.
1. 데이터 테이블 구조
하루 종일 보내는 레코드를 기록해야하므로 데이터를 여기에 데이터베이스에 저장합니다. 데이터 테이블 구조는 다음과 같습니다.
유형은 등록, 비밀번호 재설정 등과 같은 검증 코드의 유형입니다.
SendTime의 기본값은 현재 시간입니다.
2. 일일 발송 시간 수를 제한하십시오
이전 기사에서 언급 한 인터페이스 및 엔티티 클래스를 사용해야합니다.
DailyCountFilter.java
공개 클래스 DailyCountFilter는 smsfilter {private int ipdailymaxsendcount; Private Int MobiledailyMaxSendCount; 개인 smsdao smsdao; // 일부 쓸모없는 코드가 생략됩니다 @override public boolean filter (smsentity smsentity) {if (smsdao.getMobilecount (smsentity.getMobile ())> = MobiledailyMaxSendCount) {return false; } if (smsdao.getipcount (smsentity.getip ())> = ipdailymaxSendCount) {return false; } smsdao.saveentity (smsentity); 진실을 반환하십시오. }}기본 코드는 매우 간단합니다. 먼저, 지정된 휴대 전화 번호로 전송 된 시간이 최대 전송 시간에 도달했는지 여부를 결정한 다음 지정된 IP 요청에 의해 보낸 시간 수가 최대 수에 도달했는지 여부를 결정하십시오. 이들 중 어느 것도 없다면, 휴대 전화 번호, IP 및 기타 정보를 데이터베이스에 저장하십시오.
물론이 클래스에는 특정 문제가 있습니다. 다른 스레드는 최대 숫자가 최대 수를 초과하는지 여부와 저장되는 엔티티 데이터를 판단하는 것 사이에 새로운 데이터를 저장했을 수 있습니다. 이로 인해 위의 두 가지 판단은 절대적으로 정확하지 않습니다.
직렬화 수준 트랜잭션을 사용하여 오류가 없을 수 있지만 비용이 너무 높습니다. 그러므로 우리는 여기서 처리를 수행하지 않을 것입니다. 전송 주파수 제한을 구현했기 때문입니다. 주파수 필터를 사용하여 한 번 필터하고 전송 주파수를 제한하면 위에서 언급 한 문제는 기본적으로 불가능합니다.
또 다른 문제가 있습니다. 시간이 지남에 따라이 테이블은 점점 커져서 쿼리 성능이 다소 열악하게됩니다. 이전 기사에서와 같이 쓸모없는 데이터를 가끔씩 삭제할 수 있습니다. 또한 테이블을 동적으로 작성한 다음 새 테이블에 데이터를 삽입 할 수 있습니다.
3. 동적 테이블을 사용하십시오
여기서 우리는 두 번째 솔루션을 채택합니다. 데이터 테이블의 이름은 "sms_four-digit year_two-sigit month", 예 : "SMS_2016_02"입니다. 데이터를 삽입 할 때는 현재 시간을 기준으로 테이블 이름을 가져온 다음 삽입하십시오. 또한 쿼츠를 사용하여 다음 달과 다음 달에 2시에 데이터 테이블을 생성하십시오.
먼저 DailyCountFilter 클래스를 수정 하고이 클래스에 작업 계획을 추가하고 정기적으로 데이터 테이블을 생성합니다.
DailyCountFilter.java
// 위의 코드를 기반으로 다음 코드를 추가하십시오. 공개 클래스 DailyCountFilter는 smsfilter {private scheduler sched; @override public void init ()는 schedulerexception {smsdao.createtable (0); // 이번 달의 데이터 테이블 작성 smsdao.createtable (1); // 다음 달의 데이터 테이블 작성 schedulerFactory sf = new stdschedulerFactory (); sched = sf.getScheduler (); // 쿼츠 컨테이너 생성 jobDatamap jobDatamap = new jobDatamap (); jobDatamap.put ( "smsdao", smsdao); // 작업을 실행할 때 사용해야하는 데이터 맵을 만듭니다. // 작업 객체를 작성하여 실제 작업을 실행하는 작업 객체를 실행합니다. jobDetail job = jobBuilder.newjob (createSmstableJob.class) .usingjobdata (jobDatamap) .withidentity ( "SMS 테이블 작업 만들기"). build (); // 작업 실행을 트리거하기위한 시간 규칙을 설명하는 데 사용되는 트리거 객체를 만듭니다. // 예를 들어, Crontrigger trigger = triggerBuilder.newtrigger () .withEdentity ( "SMS 테이블 트리거") .withSchedule (CronscheduleBuilder.cronschedule ( "0 2 20 *?")))). Month.build (); Sched.Schedulejob (직업, 방아쇠); // 작업을 등록하고 규칙을 트리거 일정을 트리거합니다 .start (); // 스케줄 시작} @override public void destrove () {try {sched.shutdown (); } catch (schedulerexception e) {}} public static class createSmstablejob 구현 작업 {@override public void execute (jobExecutionContext Context) jobExecutionException {jobDatamap datamap = context.getJobdetail (). getjobdatamap (); smsdao smsdao = (smsdao) datamap.get ( "smsdao"); // 통과 된 SMSDAO 객체 SMSDAO.Createtable (1); // 다음 달의 데이터 테이블 작성 smsdao.createtable (2); // 다음 달의 데이터 테이블 생성}}}다음으로 SMSDAO의 일부 코드를 살펴 보겠습니다.
smsdao.java
공개 클래스 smsdao { / *** 새 로그 테이블 생성** @param monthexcursion 개월 오프셋* / public void createTable (int monthexcursion) {String SQL = "존재하지 않으면 테이블 작성" + getTablename (monthexcursion) + "like sms"; // sql statement}/ *** smsentity entity 객체 저장*/ public void saventity (smsentity smsentity) {String sql = "삽입" + getNowTablename () + "(모바일, IP, 유형) 값 (?,?)"; // SQL 문을 실행}/ *** 지정된 휴대 전화 번호를 가져 와서 오늘 SMS를 요청하십시오** @param 모바일 사용자 모바일 번호* @return Times Today 오늘*/ public long getmobilecount (string mobolecount) {string sql = "select count (id)" + getnowtablename () + "where mobile =? = curdate ()"; // SQL 문을 실행하고 쿼리 결과를 반환} // getipCount 메소드가 생략됩니다./ *** 지금 사용 된 테이블의 이름 가져 오기*/ private String getNowTablename () {return getTablename (0); } private dateformat dateformat = new SimpledateFormat ( "yyyy_mm"); / *** 월 오프셋 월의 테이블 이름 가져 오기** @param monthexcursion 개월 오프셋 오프셋* @return 테이블 해당 월의 이름/ 개인 문자열 getTablename (int monthexcursion) {calendar calendar = calendar.getInstance (); calendar.add (calendar.month, monthexcursion); 날짜 = calendar.gettime (); "sms_" + dateformat.format (날짜)를 반환합니다. }}SMSDAO에서 Createtable 방법의 성공적인 작동을위한 전제 조건이 있으며, 이는 SMS 데이터 테이블이 있다는 것입니다. CreateTable 방법은 SMS 테이블의 구조를 복사하여 새 데이터 테이블을 만듭니다.
문자 메시지 (휴대 전화 번호, IP, 시간 등)를 직접 삭제하는 대신 데이터를 보내는 데이터를 보유합니다. 왜냐하면 누군가가 서비스 제공 업체의 SMS 도착률을 판단하는 등의 문자 메시지 등을 판단하는 등의 정보를 얻기 위해 향후 이러한 데이터를 분석해야 할 수도 있기 때문입니다.
위의 내용은이 기사에 관한 모든 것입니다. 계속주의를 기울일 수 있기를 바랍니다.