Tem como controlar transações entre serviços via Vraptor?  XML
Índice dos Fóruns » Frameworks e Bibliotecas brasileiros
Autor Mensagem
bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Olá pessoal,

Eu tenho o Vraptor em meus serviços e surgiu essa dúvida do assunto do tópico.

Eu tenho um serviço criado que é responsável por fazer uma "orquestração", só que este mesmo serviço deve, também, garantir a transação, ou seja, se algo der errado no segundo serviço, o primeiro deve dar rollback.

Se alguém puder me ajudar, ficarei grato.

De antemão, obrigado pela ajuda.

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

Ter tem sim... O que você quer se chama transação distribuída, e é uma coisa bastante complexa de ser feita.

Já tem coisa pronta, tipo o Spring Transaction, ou algum recurso de servidor de aplicações, é só usar isso a partir do VRaptor.

--
Caelum
www.caelum.com.br

bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Olá Lucas, obrigado pela sua resposta.

Então, eu tentei usar o do Spring, porém não tive sucesso.

Por exemplo, tenho um método assim (dentro de um Controller):


E dentro desse método eu faço a chamada para os dois outros serviços.

Contudo, quando eu tenho o nesse método, ele não é executado. Dá logo um erro na execução.

Se tem como fazer, como poderia ser? Tem algum exemplo?

Vale lembrar que dentro de cada método dos meus outros dois serviços eu tenho eles assinados como sendo transacionais.

Obrigado, de antemão.

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

qual erro?

--
Caelum
www.caelum.com.br

bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Infelizmente não tenho ele agora, o problema está no trabalho.

Na segunda te passarei o erro.

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Olá Lucas, tudo bem?

Refiz os testes aqui e segue o erro:

12/12/2011 09:13:32 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lancaExameController': Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class br.com.scmba.servico.lanca.exame.laboratorio.domain.controller.LancaExameController]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329)
at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:263)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1083)
at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:85)
at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:46)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:5
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:12
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class br.com.scmba.servico.lanca.exame.laboratorio.domain.controller.LancaExameController]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:212)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:476)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:362)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:141
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
... 30 more
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:71
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:200)
... 37 more


Aqui vai a minha classe (o meu Controller):


Pela mensagem de erro eu acredito que eu não consigo usar o @Transactional fora do escopo do Spring, ou seja, dentro de um bean que seja gerenciado por ele.

Se eu retirar a anotação, esse erro não acontece, porém, eu não consigo manter a execução dos serviços dentro de uma transação única.

Estou fazendo algo de errado?

Obrigado mais uma vez.

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

se vc usa @Transactional do Spring, as classes não podem ter construtores com argumentos, ou vc tem que sempre referenciar as dependências via interface.

No caso dos Controllers, o único jeito é tirando o construtor. Nos outros componentes vc pode criar uma interface e continuar a usar os construtores.

jeito fácil. Troque:


por:

--
Caelum
www.caelum.com.br

bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Lucas,

Fiz o que você sugeriu e funcionou. Consigo utilizar o @Transactional. Contudo, ele não garante a transação remotamente.

Eu não entendi muito bem quando sugeriu utilizar Interfaces para os outros componentes. Esses seriam os componentes do Spring ou do Vraptor (Controllers)?

E por mais que eu replique isso (a maneira que você sugeriu para adotar a transação do Spring) para os outros controladores, como repassar a transação para os outros controladores?

Andei pesquisando isso, mas não tive muito sucesso.

Obrigado pela ajuda.

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

seriam componentes tanto do Spring qto do VRaptor... a idéia é ter sempre uma interface para o componente, e ao invés das outras classes referenciarem a implementação, referenciar a interface (nas dependencias).

Por padrão o Spring não vai garantir transações remotas mesmo, vc vai ter que configurar coisas a mais. Não conheço de cabeça como fazer isso, precisa pesquisar mesmo...

tenta algo como spring distributed transactions, two phase commit, coisas do tipo

--
Caelum
www.caelum.com.br

 
Índice dos Fóruns » Frameworks e Bibliotecas brasileiros
Ir para:   
Powered by JForum 2.1.8 © JForum Team