Spring MVC对单例的多个请求

时间:2015-03-02 13:38:33

标签: java spring spring-mvc singleton stanford-nlp

我遇到了Spring MVC的问题。我正在使用Stanford NLP,我把它初始化为singleton类。

@Component
@Scope("singleton")
public class JavaNLP implements NlpInterface
{
  private DependencyNLP nlp_object = null;

  @PostConstruct
  public void init()
  {
    if (nlp_object == null) {
      nlp_object = new DependencyNLP();
      nlp_object.init("tokenize, ssplit, pos, lemma, ner, parse, dcoref");
    }
  }
  @Override
  public void init(String name, DataContainer container)
  {
    this.container = container;
    nlp_object.annotate(container.getText());
  }
  @Override
  public void execute()
  {
     ...
  }
}

每个请求都在调用init(String name, DataContainer container)execute。问题出在 70%请求 nlp_object未初始化。

控制器内部:

@Autowired
@Qualifier("javaNLP")
private NlpInterface nlpInterface;

@RequestMapping(value = "/parse", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, headers = {"Content-type=application/json"})
  public @ResponseBody
  String parseWithGazetteerinJSON(@RequestBody DataContainer container)
  {
    String name = "Parsing text";

    nlpInterface.init(name, container);
    nlpInterface.execute();
    JSONArray triples = nlpInterface.getTriplesAsJSON();

    return triples.toString();
  }

编辑1

不幸的是,它仍然无法正常工作。我想我发现了问题所在,只是不知道如何修复它。

我将配置+调用init函数放入config

<mvc:annotation-driven />
<context:component-scan base-package="com.metadata.tripletws.model" />
<context:component-scan base-package="com.metadata.tripletws.controller" />
<bean id="nlp" class="com.metadata.tripletws.service.Nlp" init-method="init"></bean>

我创建了一个名为Nlp的新对象,它只是DependencyNLP(外部库)的一个包络

@Component
public class Nlp
{

  private DependencyNLP nlp;

  public void init()
  {
    nlp = new DependencyNLP();
    nlp.init();
  }

  public DependencyNLP getInstance()
  {
    return nlp;
  }

  public void execute()
  {
     ...
  }
  ...
}

然后我将此代码添加到控制器:

DependencyNLP nlpInstance = nlp.getInstance();
System.out.println(nlpInstance);
nlpInstance.annotate(container.getSection().getText());
nlpInstance.execute(...);

并定义了私有自动变量

@Autowired
private Nlp nlp;

印刷 nlpInstance 始终相同。这最终有意义。但这是我强烈要求的问题。请求相互影响。

有人知道怎么让它运行吗?

由于

1 个答案:

答案 0 :(得分:0)

不要在nlp_object方法中初始化@PostConstruct,而是将其作为资源注入NlpInterface的实现

不确定这是否能解决您的问题,但如果是我,我会试一试。

此外,您init()方法(如果必须采用这种方法)应与同步块外部和内部的双if ( singletonObj == null)门同步。