Ошибка 404 BPEL WebService при втором запуске

Я пытаюсь настроить процесс HelloWorld bpel с Apache-ODE. Я поместил ode.war(1.3.5/1.3.6) в Tomcat 7.0.50 и развернул свой процесс helloworld, используя веб-интерфейс ODE.

Мой процесс просто получает сообщение. Затем сообщение переводится в пространство имен другого веб-сервиса и вызывает его. Результат затем переводится обратно в первое пространство имен и используется в качестве ответа. Все файлы wsdl и portLinkType упакованы вместе с процессом. Вот мой процесс:

<bpel:assign name="myInputInitialization">
    <bpel:copy>
        <bpel:from>
            <bpel:literal>
                <ns2:sayHi xmlns:ns2="http://samples.orchestrator.intrinsec.com/">
                    <text>NoBody</text>
                </ns2:sayHi>
            </bpel:literal>
        </bpel:from>
        <bpel:to variable="myInput" part="parameters"/>
    </bpel:copy>
</bpel:assign>
<bpel:assign name="sayHiResponseInitialization">
    <bpel:copy>
        <bpel:from>
            <bpel:literal>
                <ns2:sayHiResponse xmlns:ns2="http://samples.orchestrator.intrinsec.com/">
                    <myHelloText>
                        <text>Bye</text>
                    </myHelloText>
                </ns2:sayHiResponse>
            </bpel:literal>
        </bpel:from>
        <bpel:to variable="sayHiResponse" part="parameters"/>
    </bpel:copy>
</bpel:assign>

<bpel:assign validate="no" name="myAssignIn"> <!-- validate="yes" is not supported by ODE.  -->
    <bpel:copy>
        <bpel:from variable="sayHiRequest" part="parameters">
            <bpel:query>text</bpel:query>
        </bpel:from>
        <bpel:to variable="myInput" part="parameters">
            <bpel:query>text</bpel:query>
        </bpel:to>
    </bpel:copy>
</bpel:assign>
<bpel:invoke
    name="myInvoke"
    partnerLink="helloWorldPartnerLinkService"
    operation="sayHi"
    portType="samples:IHelloWorld"
    inputVariable="myInput"
    outputVariable="myOutput">
</bpel:invoke>
<bpel:assign validate="no" name="myAssignOut">
    <bpel:copy>
        <bpel:from variable="myOutput" part="parameters">
            <bpel:query>myHelloText/text</bpel:query>
        </bpel:from>
        <bpel:to variable="sayHiResponse" part="parameters">
            <bpel:query>myHelloText/text</bpel:query>
        </bpel:to>
    </bpel:copy>
</bpel:assign>
<bpel:reply
    name="myReply"
    partnerLink="helloWorldPartnerLinkClient"
    operation="sayHi"
    portType="bonjourlemonde:IHelloWorld"
    variable="sayHiResponse">
</bpel:reply>

Я сократил определение wsdl-import, partnerLinks и переменных, потому что это уже очень долго.

Веб-сервис, обеспечивающий реализацию, определяется:

@WebService(serviceName = "HelloWorldService", portName="HelloWorldPort")
public interface IHelloWorld
{
    @GET @Path("sayHi")
        public @WebResult(name = "myHelloText") HelloText sayHi(final @WebParam(name = "text") String text);
}

а также

public class HelloWorld implements IHelloWorld
{
  @Override
  public HelloText sayHi(final String text)
  {
    return new HelloText((text == null)?"Hello":"Hello " + text);

  }
}

Этот вызываемый webService является кодом, использующим CXF, работает нормально и разворачивается в том же Tomcat (автономный сервер, запускаемый с Jetty Endpoint.publish, дает то же поведение).

Затем, используя стандартный инструмент wsimport, я создаю клиент для веб-сервиса, предоставляемого ODE.

Позвонив в этот веб-сервис, вы получите ожидаемый результат (привет, очень, очень Джордж). Я также вижу пакет развертывания, процесс и экземпляр в интерфейсе ODE. Я могу запросить ODE, используя 3 веб-службы управления, и получить ту же информацию, что и в веб-интерфейсе.

Каждая вещь, пока здесь, не совершенна.

Теперь я использую свой сгенерированный клиент во второй раз; тогда я получаю ошибку 404 http. Все дальнейшие обращения к дизайну веб-службы в моем BPEL-процессе приведут к ошибке http 404, в то время как может быть достигнут wsdl, соответствующий веб-службе (и использующийся для генерации клиента).

Единственный способ возобновить процесс BPEL - это перезапустить Tomcat (или отменить развертывание ODE, повторно развернуть ODE, заново развернуть процесс BPEL).

В catalina.out ошибки не будет, если я не активирую изменение на DEBUG для уровня журнала ODE (журнал слишком многословен для вопроса).

Первый запуск процесса составляет около 800 строк отладочных сообщений без ошибок, и успехи процесса можно отслеживать шаг за шагом. Второй запуск процесса показывает эту ошибку:

15:35:20,866 DEBUG [DataRetrievalUtil] File does not exist in the Service Repository! File=META-INF/ServiceData.xml
15:35:20,866 DEBUG [AxisDataLocatorImpl] Check loading failure for file, META-INF/ServiceData.xml.Message = Failed to load from file, META-INF/ServiceData.xml
15:35:20,866 DEBUG [AxisDataLocatorImpl] Check loading failure for file, META-INF/ServiceData.xml
org.apache.axis2.dataretrieval.DataRetrievalException: Failed to load from file, META-INF/ServiceData.xml
    at org.apache.axis2.dataretrieval.DataRetrievalUtil.buildOM(DataRetrievalUtil.java:64)
    at org.apache.axis2.dataretrieval.AxisDataLocatorImpl.loadServiceData(AxisDataLocatorImpl.java:104)
    at org.apache.axis2.description.AxisService.getDefaultDataLocator(AxisService.java:2949)
...
Caused by: javax.xml.stream.XMLStreamException: File does not exist in the Service Repository! File=META-INF/ServiceData.xml
    at org.apache.axis2.dataretrieval.DataRetrievalUtil.getInputStream(DataRetrievalUtil.java:103)
...

Ошибка "ServiceData.xml" заставляет меня добавить тег "axis2". В документации ODE /examples/UnitTests нет ничего, связанного с service.xml/ServiceData.xml, и поиск ошибок такого рода не дает пути к решению.

1 ответ

Решение

Эта особенность связана с wsdl, предоставляемым ODE для веб-сервисов. Во всех wsdl расположение порта службы может быть неправильным (отсутствует требуемая часть "ode/process" в URL) . Это верно также для всех трех служб управления ODE. Wsdl может измениться после первого вызова процесса, который использует действие 'invoke'.

Если вы используете некоторые инструменты, такие как "wsimport", для генерации клиентского кода, вы должны переопределить URL-адрес конечной точки службы (добавив "ode/process" между двумя "/") .

Другие вопросы по тегам