블로그 이미지

Rurony's Training Gym

Rurony의 트레이닝 도장! by Rurony


Spring quartz(Scheduler) 사용

Spring Bean을 Injection하여 사용자 접근 통계의 하루 누적치 통계를 수행하기 위한 Scheduler 사용 예제. 

1. Quartz 라이브러리 추가 (maven dependency 사용)
jar download url : http://mvnrepository.com/artifact/quartz/quartz/1.5.2

2. Service Class
Quartz Class에 Injection할 Service Bean.
public class StatServiceImpl implements StatService, ApplicationContextAware {
[...]
public void insertStat(String date) {
                //해당날짜의 log select.
StatBean stat = logDao.getLogStatByDate(date);
if (logger.isInfoEnabled()) {
logger.info(date + " Date Stat : " + stat.toString());
}
int checkStat = statDao.checkStat(date);
if (checkStat > 0) {
statDao.updateStat(stat);    //통계 update
if (logger.isInfoEnabled()) {
logger.info(date + " Date Stat Update");
}
} else {
statDao.insertStat(stat);    //통계 insert
if (logger.isInfoEnabled()) {
logger.info(date + " Date Stat Insert");
}
}
String accessLogDir = "/accessLog/";
String address = constantVo.getUrlContext() + "/admin/store/accessStat/dayStat?offsetDate=" + date;
String localFileName = context.getServletContext().getRealPath(constantVo.getDataUrl() + accessLogDir + date + ".html");

                //해당날짜의 접속통계 페이지를 HTML로 download
int downOk = downloadURL(address, localFileName);
if (downOk == 1) {
if (logger.isInfoEnabled()) {
logger.info(date + " Date Page Download");
}
logDao.deleteLog(date);    //해당날짜의 log delete
if (logger.isInfoEnabled()) {
logger.info(date + " Date Log Delete");
}
}
}
[...]
}

3. Quartz Class
@Inject, @Autowired로 Injection이 안되는 것 같음? 아래 Spring Bean 설정에서 Bean을 선언 하여 사용.
public class StatInsert extends QuartzJobBean {
private StatService statService; //could not autowired
public void setStatService(StatService statService) {
this.statService = statService;
}
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
[...]
statService.insertStat(date);
}
}

4. Spring Bean 설정
Spring Quartz Scheduler는 interval time 동작 방식과 cron tab 동작 방식이 있음.
접속 통계 누적 Scheduler는 cronExpression을 통한 매일 0시 5분에 실행 하도록 구현.
Injection할 Service Bean(들)은 jobDataAsMap의 entry로 등록하여 사용.
<!-- Service Bean -->
<bean id="statService" class="com.rurony.format.access.service.StatServiceImpl" />

<!-- Spring Quartz Scheduler Bean Setting -->
<!-- Simple Quartz Scheduler -->
<!--
<bean id="simpleQuartzJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.rurony.format.schedule.StatInsert"/>
<property name="jobDataAsMap">
<map>
<entry key="statService">
<ref local="statService"/>
</entry>
</map>
</property>
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="simpleQuartzJob"/>
<property name="startDelay" value="6000"/>
<property name="repeatInterval" value="6000"/>
</bean>
-->

<!-- Cron Quartz Scheduler -->
<!-- Scheduler Bean -->
<bean id="cronQuartzJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.rurony.format.schedule.StatInsert" />
<property name="jobDataAsMap">
<map>
<entry key="statService">
<ref local="statService"/>
</entry>
</map>
</property>
</bean>

<!-- Scheduler Trigger cronExpression setting -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="cronQuartzJob"/>
<!-- <property name="cronExpression" value="1 * * * * ?"/> -->
<!-- <property name="cronExpression" value="0 30 9 * * ?"/> -->
<property name="cronExpression" value="0 5 0 * * ?"/> <!-- 매일 0시 5분 0초 에 실행 -->
</bean>

<!-- Scheduler Trigger  -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- <ref bean="simpleTrigger"/> -->
<ref bean="cronTrigger"/>
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
    <prop key="org.quartz.threadPool.threadCount">5</prop>
    <prop key="org.quartz.threadPool.threadPriority">4</prop>
    <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
    <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean>



Top

Spring Bean을 Servlet Filter에서 사용

Spring Bean을 Injection하여 Servlet Filter를 활용한 사용자 접근 통계 예제.
 
1. Service Class
Filter Class에 Injection할 Service Bean.
public class LogServiceImpl implements LogService {
@Autowired
private LogDao logDao;
public void insertLog(LogBean log) {
logDao.insertLog(log);
}
[...]
}

2. Filter Class 

component-scan으로 자동 등록된 Bean은 Injection이 안되는 것 같음? 아래 Spring Bean 설정에서 Bean을 선언 하여 사용.
public class AccessLogFilter implements Filter {
@Autowired
private LogService logService;
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest sReq, ServletResponse sRes, FilterChain chain) throws IOException, ServletException {
[...]
chain.doFilter(sReq, sRes);
logService.insertLog(log);
}

public void destroy() {
}
}

3. Spring Bean 설정
<!-- Service Bean -->
<bean id="logService" class="com.rurony.format.access.service.LogServiceImpl" />
 <!-- Filter Bean -->
<bean id="accessLogFilter" class="com.rurony.format.filter.AccessLogFilter" />

4. web.xml 설정
스프링에서 제공하는 DelegatingFilterProxy를 사용하여 설정, 위 Spring Bean 설정에서 선언된 Filter Bean의 id와 filter-name을 같게 설정.
<filter>
<filter-name>accessLogFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
  
<filter-mapping>
<filter-name>accessLogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Top

MSSQL 트랜잭션 로그 파일 초기화

1. MSSQL ERROR LOG
1) 오류 9002, 심각도 17, 상태 6
 
2) 'db_name'의 데이터베이스의 로그파일이 꽉찼습니다.
데이터베이스의 트랜잭션 로그를 백업하여 사용가능한 일부 로그 공간을 확보하십시오.
 
3) 이 SQL Server는 8동시 쿼리를 위해 최적화되어 있습니다.
이 제한이 1개의 쿼리에 의해 초과 되었으며 성능이 저하될 수 있습니다. 

2. PAGE ERROR MESSAGE
1) Microsoft OLE DB Provider for SQL Server error '80040e31' Timeout expired

3. 확인 및 처리
1) source add :
dbcmd.CommandTimeout=0
2) query exec :
C:\Program Files\Microsoft SQL Server\MSSQL\Data [db_name_Log.ldf]
db_name_Log.ldf 용량 ==> 26GB

-- [db_name] 트랜잭션 로그정보 초기화
-- backup log db_name with truncate_only
-- [db_name] 트랜잭션 로그파일의 물리적인 크기를 줄임
-- dbcc shrinkdatabase (db_name)
 
db_name_Log.ldf 용량 ==> 1MB
--//dbcc shrinkfile (파일이름)
 
Top

prev 1 2 3 4 5 ··· 8 next