Como fazer um serviço "disparar" em um horário definido por mim?

7 respostas
khichfy

Pessoal o que acontece é o seguinte:

Tenho uma tabela que é populada atraves de um sinal de negociação da bolsa de valores, ou seja, pra cada negocio realizado pelo investidor, a bovespa envia de tempos em tempos(alguns segundos) os dados desses negocios.
Acontece que essa tabela está GIGANTE e as views que foram montadas em cima dela estão com desempenho horrivel…

Bom, para resolver isso, mandaram eu criar um serviço que toda noite vai rodar.

O serviço tem como objetivo, jogar os dados atuais(vou ver pela data) numa tabela de NEGOCIOS_ATUAIS, e migrar aqueles negocios que deixaram de set atuais para a tabela HISTORICO_NEGOCIOS.

Sacaram? eu vou ficar dançando com os dados pra la e pra ca…
mas ainda sou estagiário :frowning: e to desesperado com essa tarefa…

1- Minha primeira pergunta é como vou usar thread para disparar o tal serviço por exemplo 00:00 (meia noite) ?

se alguem puder me dar um rumo, fico demais agradecido
Abraços
Julio

7 Respostas

M

bem vejo isso de duas formas:

Se a aplicação for standalone vc usa o Quartz
Se a aplicação for J2EE 2.1 vc usa http://java.sun.com/j2ee/1.4/docs/api/javax/ejb/EJBContext.html#getTimerService()

:smiley:

maiconramones

Tu pode dar uma olhada no quartz, com ele tu consegue agendar tarefas.

http://www.opensymphony.com/quartz/

Abraço,

Guitar_Men

Ou vc pode criar uma tarefa no windows no braço mesmo, tal horario dispara um .bat com o comando pra chamar sua aplicação. É o jeito mais fácil e rápido !!!

marcos.junqueira

Creio que a melhor opção seja o quartz, você pode até clusterizar o bicho…

G

eh isso ae… cria um bat e pronto

vlws

khichfy

nao posso criar bat nem nada que saia do padrão…

descobri que o spring tem um contexto chamado JOB com um bean como mostro abaixo:

<bean id="dayTrigger"
		class="org.springframework.scheduling.quartz.CronTriggerBean"
		lazy-init="false">
		<property name="cronExpression" value="0 0 0 * * ?"></property>
		<property name="jobDetail">
			<bean
				class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
				<property name="targetObject">
					<bean
						class="br.com.hsn.service.impl.DayShiftPublisher" />
				</property>
				<property name="targetMethod" value="publish" />
			</bean>
		</property>
	</bean>

esse bean acima parece que vai ser executado sempre meia noite por causa do value=“0 0 0 * * ?”

então criei uma classe da seguinte maneira:

package br.com.hsn.service.impl;

import javax.sql.DataSource;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;

import br.com.hsn.service.event.DayShiftEvent;

public class TransactionArchiverImpl implements ApplicationListener {

	private DataSource dataSource;
	
	@Transactional
	@Override
	public void onApplicationEvent(ApplicationEvent event) {
		if (event instanceof DayShiftEvent) {
			// arquivar registros antigos de negocios
			JdbcTemplate t = new JdbcTemplate(dataSource);
			String sql = "select * from IT_CARTEIRA";
			t.execute(sql);
		}
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
}

e criei no contexto SERVICES:
para setar o datasource na classe…

<bean id="TransactionArchiverImpl"
		class="br.com.hsn.service.impl.TransactionArchiverImpl">
		<property name="dataSource" ref="dataSource" />
	</bean>

então minha ideia é adiantar o relogio do meu S.O para 11:59 e esperar pra ver se pelo menos vai chamar essa classe…
bizarro… acho que to viajando… mas se funcionar eu aviso

se funcionar, o problema passará a ser usar o jdbctemplate corretamente…

t+

marcos.junqueira

sim, o spring integra com o quartz, vc pode usar o jobstore para armazenar seus jobs no banco…

Criado 12 de março de 2008
Ultima resposta 12 de mar. de 2008
Respostas 7
Participantes 6