아주 기본적인 시나리오에서 몇 가지 문제가 있습니다. 자바 웹 앱 (스프링 3)이 있으며 스택에 객체를 저장하고 싶습니다. 그런 다음 스케줄러를 사용하여 스택의 객체를 관리하려고하므로 쿼츠 작업을 구현했습니다. 평범하고 단순합니다. 첫 번째 서비스 클래스에 스택을 삽입하고 작업 클래스에 @Autowired 주석을 삽입한다. 서비스 클래스의 경우 테이블이 성공적으로 주입되지만 작업 클래스의 경우 테이블은 널입니다.두 스레드간에 공유되는 빈에 적용하면 @Autowired가 작동하지 않습니다.
클래스가
package it.unifi.det.telemat.vr.data;
@Component
public class IndexedNodesStack extends HashMap<IndexedObject, Boolean>{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public synchronized int size() {
// TODO Auto-generated method stub
return super.size();
}
//all the HashMap methods are implemented in a synchronized wrapper method
}
첫 번째 클래스 (@Autowired이 성공) 함께
package it.unifi.det.telemat.vr.service;
@Service
public class InnerNodeManager extends ConcreteNodeManager{
@Autowired
private IndexedNodesStack indexedNodesStack; //<--- it is actually autowired!
private void manageIndexedNodes(Boolean isPut, String lri, String features)
{
IndexedObject indexedObject = new IndexedObject();
indexedObject.setId(lri);
if(features != null && isPut)
indexedObject.generateFeatures(features);
indexedNodesStack.put(indexedObject, isPut);
}
}
작업 클래스 (@Autowired 실패)
package it.unifi.det.telemat.vr.service.scheduler;
@Component
public class QuartzJSearchJob extends QuartzJobBean{
@Autowired
private IndexedNodesStack indexedNodesStack; //<--- this variable is null :-(
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException
{
//do work
}
}
: 여기에 코드입니다
편집 : 여기에 servlet.xml이 있습니다.
<context:component-scan base-package="it.unifi.det.telemat.vr" />
<bean name="searchJob"
class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="it.unifi.det.telemat.vr.service.scheduler.QuartzJSearchJob" />
</bean>
<bean id="searchJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="searchJob" />
<property name="cronExpression" value="0/50 * * * * ?" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="searchJobTrigger" />
</list>
</property>
</bean>
어쩌면 나는이 필드에서 내 첫 시도이기 때문에 스레드 간의 리소스 공유에 대한 지식이 부족할 수도 있습니다. 내가 무엇이 누락 되었습니까?
봄으로 제대로 초기화되지 않는 이유를 설명하기 위해 개체를 만드는 방법을 보여줘야합니다. 어떻게 초기화되는거야? – ianpojman
작업이 @Component 주석을 통해 생성되었습니다. (수정하기 위해 제 질문을 편집했습니다) – MaVVamaldo