Spring Remoting (HttpInvoker) e problema com criação de beans (escopo)

0 respostas
LucianoM86

Olá,

Tenho um serviço sendo exposto via HttpInvoker (org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter) e uma classe de teste com alguns métodos.
applicationContext.xml

...
	<bean id="logRequisicaoService" 
		class="log.LoggerRequisicaoImpl"/>
..

logRequisicao-servlet.xml

...
	<bean id="httpLogRequisicaoService"
		class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"
		p:service-ref="logRequisicaoService">
		<property name="serviceInterface">
			<value>log.LoggerRequisicao</value>
		</property>
	</bean>

	<bean id="urlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/logRequisicao">httpLogRequisicaoService</prop>
			</props>
		</property>
	</bean>
..

applicationContext-client.xml

...
   <bean id="logRequisicaoService"
         class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
      <property name="serviceUrl">
         <value>http://localhost:8080/logremoto/logRequisicao</value>
      </property>
      <property name="serviceInterface">
         <value>log.LoggerRequisicao</value>
      </property>
   </bean>
...

TestClass

...
	@Test
	public void test1() {
		LoggerRequisicao logger = Utils.getBean("logRequisicaoService");
		logger.info(1, "Loading XML Data");
		logger.warn(1, "Another message");
		logger.closeFile(1);
		
		//assertions
		
		logger.deleteLog(1);
	}

	@Test
	public void test2() {
		LoggerRequisicao logger = Utils.getBean("logRequisicaoService");
		...
	}

O problema é que minha classe (LoggerRequisicao) não é thread-safe, não posso ter apenas uma instância dela compartilhada por todas as chamadas remotas. Ai começaram os problemas. Procurei bastante a respeito e sei que tem como definir outro escopo para o bean diferente de singleton (padrão). Tentei de várias formas:

applicationContext.xml

...
	<bean id="logRequisicaoService" 
		class="log.LoggerRequisicaoImpl" scope="prototype"/>
..

logRequisicao-servlet.xml

...
	<bean id="httpLogRequisicaoService"
		class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"
		p:service-ref="logRequisicaoService">
		<property name="serviceInterface">
			<value>log.LoggerRequisicao</value>
		</property>
	</bean>
..

Resultado: Ele só cria uma instância do mesmo jeito como se não definisse nada.

applicationContext.xml

...
	<bean id="logRequisicaoService" 
		class="log.LoggerRequisicaoImpl" scope="prototype"/>
..

logRequisicao-servlet.xml

...
	<bean id="httpLogRequisicaoService"
		class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"
		p:service-ref="logRequisicaoService" scope="prototype">
		<property name="serviceInterface">
			<value>log.LoggerRequisicao</value>
		</property>
	</bean>
..

Resultado: Ele cria uma instância para cada chamada. Nesse caso por exemplo:

LoggerRequisicao logger = Utils.getBean("logRequisicaoService");
		logger.info(1, "Loading XML Data");
		logger.warn(1, "Another message");
		logger.closeFile(1);

Ele criaria 3 ou 4 instâncias.

O que realmente gostaria era que fosse criada 1 instância por getBean, ou na classe de teste, 1 instância por teste. Eu realmente procurei bastante na net e testei de diversas formas mas não consegui fazer funcionar.

Alguém sabe como posso resolver esse problema?Já tentei de várias formas e realmente não sei como resolver… :frowning:

Desde já obrigado
Luciano

Criado 28 de dezembro de 2009
Respostas 0
Participantes 1