Sincronização de Banco de Dados - Quartz [RESOLVIDO]

Olá!

Gostaria de uma orientação a respeito de uma aplicação. O problema é o seguinte:

Eu tenho um programa servidor e um cliente rodando em uma empresa. Esta aplicação controla entre outras coisas, estoque de produtos.

O que eu quero fazer é disponibilizar este estoque na web, para que possa ser acessado de qualquer lugar por uma pessoa autorizada.

A página web está pronta. A minha dúvida é quanto à sincronização do banco de dados contido na empresa(pode ser qualquer banco) e o banco de dados(MySQL) na web.

Alguém pode me orientar em como fazer isso? Tenho que utilizar EJB?

Muito obrigado!

as duas aplicações nao podem acessar o mesmo banco?

Esqueci de avisar que há várias filiais, cada uma com seu bd. Cada programa(não são escritos em java) contido nas filiais atualizará um único banco de dados contido na web. Este bd da web conterá informações de todas as filiais.

acho q o ideal eh na sua aplicação, ter alguma tarefa rodando q fica buscando atualizações nos bancos das filiais…ateh pra não ter a necessidade de vc mexer nos bancos das filiais e nem nas aplicações…mas isso vai dar um trampo hein…boa sorte

Obrigado por responder pedrobusko!

Então, é justamente isso que eu pretendo fazer. Uma tarefa q fica rodando na máquina das filiais e atualizando o bd da web.

A minha dúvida é quanto ao acesso ao banco da web. Devo usar EJB?

Muito obrigado!

depende do volume da sua aplicação e da robustez exigida…soh pelo fato de vc ja ter optado pelo uso do mySQL, acredito que vc não terá a necessidade de EJB…

faça uma previsão do número de usuários simultâneos, do número de transações simultâneas e diárias, pense num modelo para essa sincronização de dados, os relatórios q serão exigidos, tudo isso vai ajudar a dimensionar a sua aplicação…

Supondo que a empresa possua 5 filiais, a atualização aconteça a cada 1 hora e a empresa funcione 10 horas por dia:

Teria 5(filiais) x (10 atualizações/dia) = 50 atualizações por dia.

Seriam 5 atualizações por hora, em horários intercalados, ou seja, uma atualização a cada 12 minutos.

Me corrija se fiz algo(ou tudo) errado… :grin:

Se eu não utilizasse EJB, eu faria essa conexão da tarefa c/ o bd da web de que maneira?

Obrigado!

cara…isso vc falou soh num plano para a sincronização do banco…e acredito q a melhor forma seria fazer a sincronização de todos banco, simultaneamente…ou então…dependendo da infra-estrutura, e da qtd de dados…fazer on demand, e no final do dia fazer sumarizado…entendeu? tipo assim, o usuario do site vai consultar produtos…então vc sincroniza apenas o q for necessario para aquela consulta…

ou então melhor ainda…a empresa faz um belo trabalho de rede…onde virtualmente todo mundo fica numa mesma rede…aih a coisa fica mais rapida, por nao precisar ficar dando volta na nuvem da internet…

bom cara, sinceramente teria q conhecer melhor esse ambiente e os requisitos do seu sistema pra pensar melhor em alguma coisa…

ah, mas para definir a arquitetura do seu sistema, alem de definir bem esse lance dos bancos…eh necessario aquilo q eu falei antes…uma previsão de usuários, transações, etc…

como eu disse, pra dar uma sugestão mais precisa, precisava conhecer melhor o ambiente…

vlw

O sistema é genérico e pode funcionar c/ qualquer empresa e qualquer banco de dados. Ele não pode ficar amarrado a alguma determinada tecnologia da empresa.

A idéia é a de que algum funcionário da empresa consulte este banco de dados na web para ver o estoque do mesmo produto em uma outra filial.

A idéia de interligar a empresa é ótima, porém, o que eu quero é algo simples, que seja adaptável para qualquer empresa. Por isso, estou fazendo a tarefa em java, e criando um padrão de arquivo e o programador da empresa vai ter q gerar para q minha tarefa faça a atualização no bd da web.

Como é uma aplicação genérica, não tenho condições de fazer um cálculo apurado.

Gostaria de saber como seria feita a conexão desta tarefa em java c/ meu banco de dados da web :grin:

Muito obrigado

…pegando o barco andando…
sugestão!
Crie uma(ou várias) tarefas que tenham por objetivo conectar ao banco externo, ler os dados e atualizar o banco local…
A tarefa pode ser agendada de modo a fazer esse trabalho quantas vezes por dia vc determinar…
Uma alternativa open-source é o quartz…
saiba mais aqui:
http://www.onjava.com/pub/a/onjava/2006/03/01/job-scheduling-in-web-application.html?page=1

t+

aqui no PJ tem um tutorial de JDBC q pode lhe ser muito util…outra opção eh o Hibernate, mas eu soh indico o uso depois q vc estiver manjando de fazer conexões e operações via JDBC…

É possível usar o quartz com tomcat sem nenhum framework?

sim, eh possivel sim…o quartz eh um framework para vc agendar tarefas, vc configura o q vc vai executar e quando ira executar…semelhante ao cron do linux…

Muito obrigado a todos pelas dicas! Me ajudaram bastante! :grin:

Não estou conseguindo rodar o quartz no tomcat =(

Alguém sabe o porque este erro?

14/02/2007 20:18:07 org.quartz.plugins.xml.JobInitializationPlugin processFile SEVERE: Error scheduling jobs: null org.quartz.xml.ValidationException at org.quartz.xml.JobSchedulingDataProcessor.maybeThrowValidationException(JobSchedulingDataProcessor.java:791) at org.quartz.xml.JobSchedulingDataProcessor.processFile(JobSchedulingDataProcessor.java:402) at org.quartz.xml.JobSchedulingDataProcessor.processFileAndScheduleJobs(JobSchedulingDataProcessor.java:439) at org.quartz.xml.JobSchedulingDataProcessor.processFileAndScheduleJobs(JobSchedulingDataProcessor.java:425) at org.quartz.plugins.xml.JobInitializationPlugin.processFile(JobInitializationPlugin.java:380) at org.quartz.plugins.xml.JobInitializationPlugin.start(JobInitializationPlugin.java:354) at org.quartz.core.QuartzScheduler.startPlugins(QuartzScheduler.java:1804) at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:367) at org.quartz.impl.StdScheduler.start(StdScheduler.java:149) at org.quartz.ee.servlet.QuartzInitializerServlet.init(QuartzInitializerServlet.java:126) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1105) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:932) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3917) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4201) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:608) at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:535) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021) at org.apache.catalina.core.StandardHost.start(StandardHost.java:718) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442) at org.apache.catalina.core.StandardService.start(StandardService.java:450) at org.apache.catalina.core.StandardServer.start(StandardServer.java:709) at org.apache.catalina.startup.Catalina.start(Catalina.java:551) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)

quartz.properties

[code]#============================================================================

Configure Main Scheduler Properties

#============================================================================

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================

Configure ThreadPool

#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 4

#============================================================================

Configure JobStore

#============================================================================

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#============================================================================

Configure Plugins

#============================================================================

org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin

init plugin will load jobs.xml as a classpath resource i.e. /jobs.xml if not found on file system

org.quartz.plugin.jobInitializer.fileName=jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = false
org.quartz.plugin.jobInitializer.scanInterval = 30

org.quartz.plugin.jobInitializer.wrapInUserTransaction = true[/code]

web.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
[/code]

jobs.xml

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;quartz xmlns=&quot;http&#58;//www.opensymphony.com/quartz/JobSchedulingData&quot; xmlns&#58;xsi=&quot;http&#58;//www.w3.org/2001/XMLSchema-instance&quot; overwrite-existing-jobs=&quot;true&quot;&gt; &lt;job&gt; &lt;job-detail&gt; &lt;name&gt;teste&lt;/name&gt; &lt;group&gt;teste&lt;/group&gt; &lt;description&gt;Descrição&lt;/description&gt; &lt;job-class&gt;teste.Teste&lt;/job-class&gt; &lt;job-data-map allows-transient-data=&quot;false&quot;&gt; &lt;entry&gt; &lt;key&gt;burger-type&lt;/key&gt; &lt;value&gt;hotdog&lt;/value&gt; &lt;/entry&gt; &lt;entry&gt; &lt;key&gt;dressing-list&lt;/key&gt; &lt;value&gt;ketchup,mayo&lt;/value&gt; &lt;/entry&gt; &lt;/job-data-map&gt; &lt;/job-detail&gt; &lt;trigger&gt; &lt;cron&gt; &lt;name&gt;my-trigger&lt;/name&gt; &lt;group&gt;MYTRIGGER_GROUP&lt;/group&gt; &lt;job-name&gt;teste&lt;/job-name&gt; &lt;job-group&gt;teste&lt;/job-group&gt; &lt;cron-expression&gt;0/15 * * ? * *&lt;/cron-expression&gt; &lt;/cron&gt; &lt;/trigger&gt; &lt;/job&gt; &lt;/quartz&gt;

teste.java

[code]/*

  • Teste.java
  • Criado em February 14, 2007, 3:55 PM

*/

package teste;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
*

  • @author Eloi
    */
    public class Teste implements Job {

    private static int contador=0;

    /** Creates a new instance of Teste */
    public Teste() {
    }

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    System.out.println("Teste executado!");
    }

}
[/code]

nao está achando os jobs…fera…

Estrutura das pastas:

[code]WEB-INF

  • classes
    • teste
      • Teste.class
    • jobs.xml
    • quartz.properties
  • lib
  • web.xml
    META-INF

    index.jsp
    [/code]
    Os arquivos do quartz não estão nos locais certos?

Fiz o arquivo jobs.xml seguindo o exemplo do site…

E agora quem poderá me defender?

dá uma procurada naqueles exemplos…ou nos tutoriais do site do quartz…

Tem um exemplo bem bacana…q. mostra a seguinte estrutura:

  • quartz.properties
  • classe scheduler (para agendar/executar os jobs)
  • classe job (sua tarefa…claro q. vc pode ter N jobs)

algo assim:

SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory&#40;&#41;;

  Scheduler sched = schedFact.getScheduler&#40;&#41;;

  sched.start&#40;&#41;;

  JobDetail jobDetail = new JobDetail&#40;&quot;myJob&quot;,
                                      null,
                                      DumbJob.class&#41;;

  Trigger trigger = TriggerUtils.makeHourlyTrigger&#40;&#41;; // fire every hour
  trigger.setStartTime&#40;TriggerUtils.getEvenHourDate&#40;new Date&#40;&#41;&#41;&#41;;  // start on the next even hour
  trigger.setName&#40;&quot;myTrigger&quot;&#41;;

  sched.scheduleJob&#40;jobDetail, trigger&#41;;

Lesson no. 1:
http://www.opensymphony.com/quartz/wikidocs/TutorialLesson1.html

t+

PROBLEMA RESOLVIDO!!!

Retirei o arquivo job.xml e segui um tutorial para carregar o job por um servlet.

Aí vai o link com um tutorial para utilizar o quartz com J2EE.
http://www.theserverside.com/tt/blogs/showblog.tss?id=QuartzSchedulerInJ2EE

Obrigado a todos pela atenção!!!