acho que foi erro de Ctrl+C e Ctrl+V
Beleza!
Coloquei o código de envio de email no método run() da MyFirstApplicationTask:
@Component
@ApplicationScoped
public class MyFirstApplicationTask implements ApplicationTask {
private ImovelDAO imovelDAO;
private ContatoDAO contatoDAO;
public MyFirstApplicationTask(TaskScheduler scheduler, ImovelDAO imovelDAO
, ContatoDAO contatoDAO) {
//Aqui você poderá receber componentes que não estejam em
//escopo de request ou session
this.schedule(scheduler);
this.contatoDAO = contatoDAO;
this.imovelDAO = imovelDAO;
}
public void schedule(TaskScheduler scheduler) {
scheduler.schedule(this, new CronTrigger("0 * * * * ?"));
}
public void run(){
HtmlEmail email = new HtmlEmail();
List<Contato> contatos = contatoDAO.listaContatos();
for(Contato contato : contatos) {
try {
email.setDebug(true);
email.setHostName("smtp.gmail.com");
email.setFrom("eu@gmail.com", "Gerente");
email.setAuthentication("eu","senha");
email.setSSL(true);
email.addTo(contato.getEmail());
email.setSubject("Newsletter - Imobiliária");
// embed the image and get the content id
URL url = new URL("http://www.tabetealmeida.com.br/_imagens/logo.png");
String cid = email.embed(url, "Imobiliária logo");
// set the html message
List <Imovel> imoveis = imovelDAO.lista();
StringBuilder html = new StringBuilder();
html.append("<html><body><img src=\"cid:"+cid+"\"><br><body>Olá " + contato.getPessoa().getNome() +"!" + "<br>" +
"Estamos enviando as últimas novidades, Confira!" + "<br>" + "<br/>");
for (Imovel imovel : imoveis) {
// Formatando a data de inclusao
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String dataInclusao = formatter.format(imovel.getDataInclusao());
// Formatando o valor
BigDecimal valor = imovel.getValor();
NumberFormat nf = NumberFormat.getCurrencyInstance();
html.append(
"Código: " + imovel.getCodImovel() + "<br>" +
"Título: " + imovel.getTitulo() + "<br>" +
"Tipo: " + imovel.getTipo().getNome() + "<br>" +
"Modalidade: " + imovel.getModalidade().getTipoModalidade() + "<br>" +
"Bairro: " + imovel.getEndereco().getBairro() + "<br>" +
"Estado: " + imovel.getEndereco().getEstado() + "<br>" +
"Área: " + imovel.getArea() + "<br>" +
"Valor: " + nf.format(valor) + "<br>" +
"Quartos: " + imovel.getQuartos() + "<br>" +
"Data de inclusão: " + dataInclusao + "<br/><br/>");
}
html.append("Att. <br/> Bruno - Gerente de vendas - =P"+"</body></html>");
email.setHtmlMsg(html.toString());
//enviando conteudo em HTML que vem por parametro
//email.setContent("conteudo", "text/html");
// set the alternative message
email.setTextMsg("Seu servidor de e-mail não suporta mensagem HTML");
// send the email
email.send();
} catch (EmailException e) {
System.out.println(e.getMessage());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
A saida é esta:
20:56:38,805 INFO [DefaultListableBeanFactory] Overriding bean definition for bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': replacing [Root bean: class [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [br.com.caelum.vraptor.ioc.spring.InjectionBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
20:56:38,806 DEBUG [VRaptorApplicationContext] Bean factory for Root WebApplicationContext: org.springframework.beans.factory.support.DefaultListableBeanFactory@1389b3f: defining beans [defaultTypeFinder,defaultResourceNotFoundHandler,XStreamXMLDeserializer,noRoutesConfiguration,emptyElementsRemoval,defaultInterceptorRegistry,defaultTypeNameExtractor,asmBasedTypeCreator,defaultMethodNotAllowedHandler,encodingHandlerFactory,hibernateProxyInitializer,defaultAcceptHeaderToFormat,objenesisProxifier,defaultMultipartConfig,JSR303ValidatorFactory,validatorFactoryCreator,defaultRestDefaults,defaultRouter,messageInterpolatorFactory,defaultDeserializers,paranamerNameProvider,pathAnnotationRoutesParser,defaultResourceTranslator,defaultRoutes,defaultConverters,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,resourceLookupInterceptor,executeMethodInterceptor,HTMLSerialization,applicationConfiguration,defaultHttpResult,jsonDeserializer,defaultPageResult,emptyResult,instantiateInterceptor,flashInterceptor,interceptorListPriorToExecutionExtractor,ognlParametersProvider,downloadInterceptor,defaultValidationViewsFactory,defaultRepresentationResult,defaultRefererResult,defaultFormatResolver,defaultResult,defaultRestHeadersHandler,outjectResult,forwardToDefaultViewInterceptor,parametersInstantiatorInterceptor,XStreamXMLSerialization,defaultStatus,JSR303Validator,jstlLocalization,commonsUploadMultipartInterceptor,deserializingInterceptor,replicatorOutjector,XStreamJSONSerialization,defaultLogicResult,defaultValidator,defaultPathResolver,defaultMethodInfo,bigDecimalConverter,bigIntegerConverter,booleanConverter,byteConverter,characterConverter,doubleConverter,enumConverter,floatConverter,integerConverter,localeBasedCalendarConverter,localeBasedDateConverter,longConverter,primitiveBooleanConverter,primitiveByteConverter,primitiveCharConverter,primitiveDoubleConverter,primitiveFloatConverter,primitiveIntConverter,primitiveLongConverter,primitiveShortConverter,shortConverter,uploadedFileConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,defaultRequestExecution,defaultInterceptorStack,entityManagerCreator,entityManagerFactoryCreator,JPATransactionInterceptor,modalidadeDAO,tipoDAO,usuarioDAO,fotoDAO,statusDAO,contatoDAO,proprietarioDAO,imovelDAO,loginController,tipoController,empresaController,fotoController,usuarioController,statusController,proprietarioController,modalidadeController,contatoController,newsletterController,indexController,relatoriosController,homeController,imovelController,noCacheInterceptor,newsletter,imagens,taskSchedulerFactory,myFirstRequestTask,customMultipartConfig,jasperMaker,myFirstApplicationTask,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,localeBasedBigDecimalConverter,localeBasedDoubleConverter,localeBasedFloatConverter,org.springframework.aop.config.internalAutoProxyCreator,cacheBasedTypeCreator]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@10fe2b9
20:56:39,126 DEBUG [VRaptorApplicationContext] Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@1dfd90f]
20:56:39,127 DEBUG [VRaptorApplicationContext] Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@1238785]
20:56:39,140 INFO [DefaultListableBeanFactory] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1389b3f: defining beans [defaultTypeFinder,defaultResourceNotFoundHandler,XStreamXMLDeserializer,noRoutesConfiguration,emptyElementsRemoval,defaultInterceptorRegistry,defaultTypeNameExtractor,asmBasedTypeCreator,defaultMethodNotAllowedHandler,encodingHandlerFactory,hibernateProxyInitializer,defaultAcceptHeaderToFormat,objenesisProxifier,defaultMultipartConfig,JSR303ValidatorFactory,validatorFactoryCreator,defaultRestDefaults,defaultRouter,messageInterpolatorFactory,defaultDeserializers,paranamerNameProvider,pathAnnotationRoutesParser,defaultResourceTranslator,defaultRoutes,defaultConverters,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,resourceLookupInterceptor,executeMethodInterceptor,HTMLSerialization,applicationConfiguration,defaultHttpResult,jsonDeserializer,defaultPageResult,emptyResult,instantiateInterceptor,flashInterceptor,interceptorListPriorToExecutionExtractor,ognlParametersProvider,downloadInterceptor,defaultValidationViewsFactory,defaultRepresentationResult,defaultRefererResult,defaultFormatResolver,defaultResult,defaultRestHeadersHandler,outjectResult,forwardToDefaultViewInterceptor,parametersInstantiatorInterceptor,XStreamXMLSerialization,defaultStatus,JSR303Validator,jstlLocalization,commonsUploadMultipartInterceptor,deserializingInterceptor,replicatorOutjector,XStreamJSONSerialization,defaultLogicResult,defaultValidator,defaultPathResolver,defaultMethodInfo,bigDecimalConverter,bigIntegerConverter,booleanConverter,byteConverter,characterConverter,doubleConverter,enumConverter,floatConverter,integerConverter,localeBasedCalendarConverter,localeBasedDateConverter,longConverter,primitiveBooleanConverter,primitiveByteConverter,primitiveCharConverter,primitiveDoubleConverter,primitiveFloatConverter,primitiveIntConverter,primitiveLongConverter,primitiveShortConverter,shortConverter,uploadedFileConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,defaultRequestExecution,defaultInterceptorStack,entityManagerCreator,entityManagerFactoryCreator,JPATransactionInterceptor,modalidadeDAO,tipoDAO,usuarioDAO,fotoDAO,statusDAO,contatoDAO,proprietarioDAO,imovelDAO,loginController,tipoController,empresaController,fotoController,usuarioController,statusController,proprietarioController,modalidadeController,contatoController,newsletterController,indexController,relatoriosController,homeController,imovelController,noCacheInterceptor,newsletter,imagens,taskSchedulerFactory,myFirstRequestTask,customMultipartConfig,jasperMaker,myFirstApplicationTask,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,localeBasedBigDecimalConverter,localeBasedDoubleConverter,localeBasedFloatConverter,org.springframework.aop.config.internalAutoProxyCreator,cacheBasedTypeCreator]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@10fe2b9
20:56:39,194 INFO [ThreadPoolTaskScheduler] Initializing ExecutorService
20:56:39,257 INFO [DefaultListableBeanFactory] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1389b3f: defining beans [defaultTypeFinder,defaultResourceNotFoundHandler,XStreamXMLDeserializer,noRoutesConfiguration,emptyElementsRemoval,defaultInterceptorRegistry,defaultTypeNameExtractor,asmBasedTypeCreator,defaultMethodNotAllowedHandler,encodingHandlerFactory,hibernateProxyInitializer,defaultAcceptHeaderToFormat,objenesisProxifier,defaultMultipartConfig,JSR303ValidatorFactory,validatorFactoryCreator,defaultRestDefaults,defaultRouter,messageInterpolatorFactory,defaultDeserializers,paranamerNameProvider,pathAnnotationRoutesParser,defaultResourceTranslator,defaultRoutes,defaultConverters,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,resourceLookupInterceptor,executeMethodInterceptor,HTMLSerialization,applicationConfiguration,defaultHttpResult,jsonDeserializer,defaultPageResult,emptyResult,instantiateInterceptor,flashInterceptor,interceptorListPriorToExecutionExtractor,ognlParametersProvider,downloadInterceptor,defaultValidationViewsFactory,defaultRepresentationResult,defaultRefererResult,defaultFormatResolver,defaultResult,defaultRestHeadersHandler,outjectResult,forwardToDefaultViewInterceptor,parametersInstantiatorInterceptor,XStreamXMLSerialization,defaultStatus,JSR303Validator,jstlLocalization,commonsUploadMultipartInterceptor,deserializingInterceptor,replicatorOutjector,XStreamJSONSerialization,defaultLogicResult,defaultValidator,defaultPathResolver,defaultMethodInfo,bigDecimalConverter,bigIntegerConverter,booleanConverter,byteConverter,characterConverter,doubleConverter,enumConverter,floatConverter,integerConverter,localeBasedCalendarConverter,localeBasedDateConverter,longConverter,primitiveBooleanConverter,primitiveByteConverter,primitiveCharConverter,primitiveDoubleConverter,primitiveFloatConverter,primitiveIntConverter,primitiveLongConverter,primitiveShortConverter,shortConverter,uploadedFileConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,defaultRequestExecution,defaultInterceptorStack,entityManagerCreator,entityManagerFactoryCreator,JPATransactionInterceptor,modalidadeDAO,tipoDAO,usuarioDAO,fotoDAO,statusDAO,contatoDAO,proprietarioDAO,imovelDAO,loginController,tipoController,empresaController,fotoController,usuarioController,statusController,proprietarioController,modalidadeController,contatoController,newsletterController,indexController,relatoriosController,homeController,imovelController,noCacheInterceptor,newsletter,imagens,taskSchedulerFactory,myFirstRequestTask,customMultipartConfig,jasperMaker,myFirstApplicationTask,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,localeBasedBigDecimalConverter,localeBasedDoubleConverter,localeBasedFloatConverter,org.springframework.aop.config.internalAutoProxyCreator,cacheBasedTypeCreator]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory@10fe2b9
20:56:39,258 INFO [ThreadPoolTaskScheduler] Shutting down ExecutorService
23/09/2010 20:56:39 org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myFirstApplicationTask' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/imobiliaria/WEB-INF/classes/br/com/imobiliaria/component/MyFirstApplicationTask.class]: Unsatisfied dependency expressed through constructor argument with index 1 of type [br.com.imobiliaria.dao.ImovelDAO]: : Error creating bean with name 'imovelDAO': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'imovelDAO': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:718)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:194)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:993)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:897)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:574)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:68)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:82)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:110)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:103)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3838)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4488)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:519)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'imovelDAO': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:339)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:838)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:780)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:697)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:784)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:711)
... 34 more
Caused by: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:123)
at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:40)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
... 40 more
23/09/2010 20:56:39 org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
23/09/2010 20:56:39 org.apache.catalina.core.StandardContext start
SEVERE: Context [/imobiliaria] startup failed due to previous errors
23/09/2010 20:56:39 org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
20:56:39,269 INFO [XmlWebApplicationContext] Closing Root WebApplicationContext: startup date [Thu Sep 23 20:56:37 BRT 2010]; root of context hierarchy
20:56:39,269 INFO [DefaultListableBeanFactory] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@10fe2b9: defining beans [org.springframework.security.web.PortMapperImpl#0,org.springframework.security.web.context.HttpSessionSecurityContextRepository#0,org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy#0,org.springframework.security.authentication.ProviderManager#0,org.springframework.security.access.vote.AffirmativeBased#0,org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0,org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator#0,org.springframework.security.authentication.AnonymousAuthenticationProvider#0,org.springframework.security.web.savedrequest.HttpSessionRequestCache#0,org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint#0,org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0,org.springframework.security.config.http.UserDetailsServiceInjectionBeanPostProcessor#0,org.springframework.security.filterChainProxy,org.springframework.security.provisioning.JdbcUserDetailsManager#0,org.springframework.security.authentication.dao.DaoAuthenticationProvider#0,org.springframework.security.authentication.DefaultAuthenticationEventPublisher#0,org.springframework.security.authenticationManager,dataSource]; root of factory hierarchy
23/09/2010 20:56:39 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
log4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.
Implementei no lugar certo agora né? hehe
Implementou no lugar certo sim, só tem um problema:
Vc não pode receber componentes Request scoped (o Dao) dentro de componentes ApplicationScoped =(
tem várias maneiras de resolver isso, uma delas é receber uma SessionFactory no construtor da Task e instanciar os Daos na mão
SessionFactory na MyFirstApplicationTask? Mas se vou instanciar na mão preciso dessa session, a unica SessionFactory que existe aqui é a do Hibernate…
Deu boa Lucas, mandou o email, instanciei na mão lá:
List<Contato> contatos = new ContatoDAO().listaContato();
List <Imovel> imoveis = new ImovelDAO().lista();
Vc tinha outra idéia pra não ter que instanciar dessa forma?
seus daos recebem session no construtor?
da onde eles pegam a session?
se não forem eles que tomam conta da session, vc pode tentar anotá-los com @PrototypeScoped,
que vai funcionar tanto pra ApplicationScope quanto para RequestScope
Isso, meus DAO’s pegam session no construtor:
public ContatoDAO(Session session) {
this.session = session;
}
Vou deixar assim então, está funcionando.
Já que é a MyFirstApplicationTask que executa o envio de emails, como poderia aproveitar a MyFirstRequestTask e MyResource?
Valeu!!
o que vc quer dizer por aproveitar?
Acho que entendi o esquema Lucas, fiz o seguinte:
Na classe MyFirstApplicationTask eu injetei no cnstrutor e declarei a minha classe News, que é a que possui o código de envio de email, e na News que é a tarefa a ser executada anotei com:
@Component
@PrototypeScoped
public class News {
// código de envio de email
}
Agora posso executar várias tarefas, basta colocar lá no método run() da MyFirstApplicationTask.
Tá enviando os email normalmente. \o/
Uma dúvida nesse envio é que a conexão fica aberta até terminar de enviar para todos os contatos, se tiver uns 1.000 contatos vai demorar bastante, vc já viu alguém usar o método com cópia oculta addBcc() ?
email.addBcc(email);
Ai iria enviar um email só com cópia oculta para os outros 999, só que para implementar isso fica complicado, na lista de contatos vêm a galera toda e o envio é feito usando um for, onde para cada contato é enviado um email.
Abraço!!
de que conexão vc tá falando?
vc precisa que todos sejam feitos ao mesmo tempo?
É na conexão com a conta de email, pois para cada contato é enviado um email, achei que com um envio fosse possível enviar um email com cópia oculta para os demais contatos. =)
Já tô com o esquema do Velocity + Sitemesh pra decorar a mensagem de email, como eu crio o arquivo .vm ? Eu criei uma JSP e depois renomeei para .vm, aí o texto ficou sem destaque, é isso mesmo??
Abraço!!
vc precisa criar um email html pra isso funcionar…
e só renomear JSP pra VM não vai rolar… vc tem que usar as tags do VM
Não entendi Lucas… =/
Eu crio uma JSP e renomeio para .vm ou crio uma pagina HTML e renomeio para .vm?
A dúvida é só essa mesmo, como criar e se o texto fica sem destaque, o lance do VTL eu já vi como é. =)
Abraço!!
Pelo que eu tô lendo o velocity não é o que eu pensava, ele faz o que a jstl faz na JSP, sendo que arquivo .vm não fica com o texto em destaque (colorido), se eu entregar uma página vm pra um webdesigner enfeitar, vai me matar. =/
Não vi nada referente a estilos CSS no manual dele. Pelo menos no sitemesh, o estilo css pode ser usado normalmente nas páginas, já que se trata de páginas JSP, o webdesigner pode colocar as
não dá pra usar css em emails…
tem q fazer os estilos na mão ou fazendo com imagens
Pois é… =/
Consegui colocar o avatar dos imóveis no corpo do email, mas reparei que para cada contato, o tempo de envio é de aproximadamente 2min, para conectar à conta, pegar a lista dos imóveis, colocar os dados no email e adicionar o avatar, se eu tiver uns 1000 contatos no banco o tempo seria de 2000min ou 33 Horas e meia. É assim que funciona mesmo esse lance? hehe
Abraço! o/
[quote=Lucas Cavalcanti]não dá pra usar css em emails…
tem q fazer os estilos na mão ou fazendo com imagens[/quote]
Dá sim
Você pode escrever inline ou via attachment associando o CID no URL do CSS.