Весенние бобы загружены несколько раз - PullRequest
0 голосов
/ 21 мая 2011

Я пишу веб-сервисы Apache CXF и использую Spring для загрузки моих бинов.Мой единственный бин вызывает внешний процесс (MATLAB) из Java.Мое определение bean выглядит следующим образом:

<bean id="matlabEngine" class="org.burch.pca.matlab.MatlabEngine"
    init-method="start" scope="singleton">
    <constructor-arg value="${matlab.engine.path}"></constructor-arg>
</bean>

<bean
    class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="searchContextAttributes" value="true" />
    <property name="contextOverride" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:/pca-engine.properties</value>
        </list>
    </property>
</bean>

Часть моего bean-компонента MatlabEngine выглядит следующим образом:

/**
 * Path to MATLAB engine.
 */
private String pathToEngine;

public MatlabEngine(String pathToEngine) throws MatlabConnectionException, MatlabInvocationException{
    super();
    setPathToEngine(pathToEngine);
}

/**
 * Starts engine and goes to path defined by argument
 * @param pathToEngine
 * @throws MatlabConnectionException
 * @throws MatlabInvocationException
 */
public void start() throws MatlabConnectionException, MatlabInvocationException{
  //Create a factory
  RemoteMatlabProxyFactory factory = new RemoteMatlabProxyFactory();

  //Get a proxy, launching MATLAB in the process
  proxy = factory.getProxy();

  //Display welcoming messages in MATLAB Command Window
  proxy.eval(MatlabCommandsRegistry.disp(MATLAB_ENGINE_WELCOME_1));
  proxy.eval(MatlabCommandsRegistry.disp(MATLAB_ENGINE_WELCOME_2));

  if(pathToEngine!= null && !"".equals(pathToEngine)){
      logM("Switching to engine directory...");
      String goToEngineRootDir = MatlabCommandsRegistry.cd(pathToEngine);
      proxy.eval(goToEngineRootDir);
      logM("Sucessfully changed engine dir to "+pathToEngine);
  }
}

Когда я развертываю веб-сервисы в Tomcat, он прекрасно запускает процесс MATLAB (beanзагружается).

Однако, когда я создаю запрос клиента к конечной точке веб-службы с этим кодом:

public static void main(String args[]) throws Exception {

    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

    factory.getInInterceptors().add(new LoggingInInterceptor());
    factory.getOutInterceptors().add(new LoggingOutInterceptor());
    factory.setServiceClass(UploadService.class);
    factory.setAddress("http://localhost:8080/auth-ws-1.0.0/services/upload");
    UploadService client = (UploadService) factory.create();

    UploadEntity resume=new UploadEntity();
    resume.setFileName("Image490");
    resume.setFileType("jpg");

    //Work arround data handler....
    DataSource source = new FileDataSource(new File("C:\\Users\\Pictures\\thumb.png"));
    DataHandler dataHandle = new DataHandler(source);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    dataHandle.writeTo(stream);
    resume.setPayload(stream.toByteArray());
    client.uploadFile(resume);
    System.exit(0);

}

, мой сервер выдает новый экземпляр процесса MATLAB (bean загружается снова - оченьтяжелый и нежелательный).Что я могу сделать, чтобы был только один компонент, который будет использоваться для обработки всех запросов и запросов?Я новичок в Spring, и я думаю, что моя проблема в том, что я имею дело с несколькими контекстами здесь.Я хочу, чтобы они поделились одним экземпляром одиночного компонента, но не знаю, как с этим справиться.

Спасибо, что уделили время!

1 Ответ

1 голос
/ 21 мая 2011

Вам следует включить одноэлементный режим для вашего боба.

Посмотрите на это: http://static.springsource.org/spring/docs/1.2.x/reference/beans.html#beans-factory-modes

Определение бина может выглядеть так:

<!-- Spring property loading bean -->
<bean
    class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer" singleton="true">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="searchContextAttributes" value="true" />
    <property name="contextOverride" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:/pca-engine.properties</value>
        </list>
    </property>
</bean>

Я думаю, что вы должны разумно управлять жизненным циклом процесса MATLAB, чтобы уменьшить загрузку ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...