, , ,

Как получить доступ к Oracle SOA Suite Worklist’у с помощью удаленного Java-клиента (Часть 1)

пятница, 9 октября 2009 г. Оставить комментарий

Сначала показалось, что это простая задача: есть примеры в интернете, в руководстве Oracle, на блогах технических специалистов. Но, оказалось, что количество препонов настолько велико, что наскока решить эту задачу не удалось.

Итак существует несколько способов соединения:

  • JAVA_CLIENT – доступ к Workflow сервису напрямую с помощью Java (устаревший способ для версии 11.1.1);
  • LOCAL_CLEINT – доступ к Workflow сервису напрямую с помощью EJB;
  • REMOTE_CLIENT – доступ к Workflow сервису удаленно с помощью EJB;
  • SOAP_CLIENT – доступ к Workflow сервису удаленно с помощью SOAP;
  • WSIF_CLIENT – доступ к Workflow сервису удаленно с помощью WSIF (устаревший способ для версии 11.1.1);

Рассмотрим подробно способ соединения SOAP_CLIENT.

Для проекта мне понадобились библиотеки (вроде бы порядок важен):

  • bpm-infra.jar
  • orabpel-common.jar
  • orabpel-thirdparty.jar
  • orabpel.jar
  • oc4jclient.jar
  • jazncore.jar
  • xml.jar
  • xmlparserv2.jar
  • orasaaj.jar
  • soap.jar
  • orabpel-boot.jar
  • bpm-services.jar
  • wsclient_extended.jar (это файл надо взять с OTN)

Кроме библиотек понадобиться файл wf_client_config.xml. Данный файл необходимо включить в class-path вашего приложения. Файл можно скопировать с сервера, где установлен BPEL по следующему пути:

SOA_Oracle_Home\bpel\system\services\config\wf_client_config.xml

Следует убедиться, что содержимое элемента taskService корректное, указанный url доступен, и открывается форма для вызова веб-сервиса:

SOA_Oracle_Home\bpel\utilities\ant-orabpel.properties

Подробнее об этом можно почитать здесь. Секция taskService в файле должна иметь такой вид:



http://soahost:7777/integration/services/TaskService/TaskServicePort

Одного файла wf_client_config.xml достаточно для запуска приложения, но при этом будут выдаваться предупреждения:

<::> ORABPEL-30028
<::>
<::> Invalid configuration file wf_config.xml
<::> The configuration file wf_config.xml not be read.
<::> Make sure that the configuration file wf_config.xml is available and is a valid XML document. Contact oracle support if error is not fixable.

Чтобы избежать не нужных предупреждений необходимо в приложение добавить следующие файлы, и включить их в class-path:

  • SOA_Oracle_Home\bpel\system\services\config\wf_config.xml
  • SOA_Oracle_Home\bpel\system\services\schema\wf_config.xsd

При соединение к сервису workflow необходимо правильно указать параметры аутентификации. В моем случае это:

  • Логин: bpeladmin
  • Пароль: welcome1
  • Рилм(Realm): myrealm

Правильно значение realm можно подсмотреть в атрибуте realmName элемента configuration секции ISConfigaration\configurations файле:

SOA_Oracle_Home\bpel\system\services\config\is_config.xml

При запуске программы можно получить ошибку:

java.lang.SecurityException: class "com.collaxa.cube.LoggerException"'s signer information does not match signer information of other classes in the same package

или

java.lang.SecurityException: class "com.collaxa.cube.ExceptionIndex"'s signer information does not match signer information of other classes in the same package

или похожую.

Все дело в версии Java. Ошибка возникает только в версии 1.5 и связано с багом, возникающим, когда классы в одном пакете подписаны по разному или не подписаны вообще. Для запуска необходимо использовать версию 1.4 или 1.6.

Ну вот наконец-то добрались до самого кода:

package wl_test;

import java.util.ArrayList;
import java.util.List;

import oracle.bpel.services.workflow.client.IWorkflowServiceClient;
import oracle.bpel.services.workflow.client.WorkflowServiceClientFactory;
import oracle.bpel.services.workflow.query.ITaskQueryService;
import oracle.bpel.services.workflow.task.model.Task;

import java.util.Iterator;

import oracle.bpel.services.workflow.repos.Ordering;
import oracle.bpel.services.workflow.repos.Column;
import oracle.bpel.services.workflow.repos.Predicate;
import oracle.bpel.services.workflow.repos.TableConstants;
import oracle.bpel.services.workflow.repos.table.WFTaskConstants;
import oracle.bpel.services.workflow.task.ITaskService;

import oracle.bpel.services.workflow.task.model.IdentityType;
import oracle.bpel.services.workflow.verification.IWorkflowContext;

public class app {

private static final String WF_MANAGER = "bpeladmin";
private static final String WF_PASSWORD = "welcome1";
private static final String WF_REALM = "myrealm";

public static void main(String[] args) {

try {
System.out.println("Пытаемся создать WorkflowServiceClient");
IWorkflowServiceClient wfSvcClient = WorkflowServiceClientFactory.getWorkflowServiceClient(WorkflowServiceClientFactory.SOAP_CLIENT);
System.out.println("Создали WorkflowServiceClient");

System.out.println("Получаем TaskQueryService");
ITaskQueryService querySvc = wfSvcClient.getTaskQueryService();
System.out.println("Получили TaskQueryService");

System.out.println("Пытаеся пройти аутенсификацию");
IWorkflowContext ctx = querySvc.authenticate
(WF_MANAGER, // администратор
WF_PASSWORD,// пароль
WF_REALM, // realm, ldap каталог
null); // Работать из под другого пользователя

//Задаем колонки для выборки
List displayColumnsList = new ArrayList();
displayColumnsList.add("TASKNUMBER");
displayColumnsList.add("TITLE");
displayColumnsList.add("PRIORITY");
displayColumnsList.add("STATE");
displayColumnsList.add("OUTCOME");
displayColumnsList.add("EXPIRATIONDATE");
displayColumnsList.add("UPDATEDDATE");
displayColumnsList.add("UPDATEDBY");
displayColumnsList.add("CREATEDDATE");
displayColumnsList.add("CREATOR");
displayColumnsList.add("ASSIGNEEUSERS");
displayColumnsList.add("ASSIGNEEGROUPS");
displayColumnsList.add("ACQUIREDBY");
displayColumnsList.add("IDENTIFICATIONKEY");
displayColumnsList.add("PROCESSNAME");


//Сериализуем предикаты
Predicate.enableXMLSerialization(true);
// Добавляем условия
// 1. Ищем по названию процесса
Predicate filterPredicate = new Predicate(
TableConstants.WFTASK_PROCESSNAME_COLUMN,
Predicate.OP_EQ,
"test_wf");
// 2. Ищем по номеру задачи
filterPredicate.addClause(
Predicate.AND,
TableConstants.WFTASK_TASKNUMBER_COLUMN,
Predicate.OP_EQ,
"10431");

// Добавляем условия для сортировки
Column sortFieldColumn = Column.getColumn(WFTaskConstants.TEXTATTRIBUTE2_COLUMN);
boolean isAscending = false;
// Nulls в конец...
boolean isNullFirst = false;
Ordering taskOrdering = new Ordering(sortFieldColumn,isAscending,isNullFirst);

// Запрашиваем задачи
List tasks = querySvc.queryTasks
(ctx, // workflow context
displayColumnsList, // колонки для выборки
null, // Не запрашивать доп. информацию
ITaskQueryService.ASSIGNMENT_FILTER_ADMIN,
null, // Нет ключевого слова
filterPredicate, // Условия для выборки
taskOrdering, // Условие сортировки
0, // Не задаем сколько записей хотим получить
0 // Не задаем сколько записей хотим получить
);

// Получить доступ к сервису задач
ITaskService taskSvc = wfSvcClient.getTaskService();

// Посмотрим сколько у нас записей
System.out.println("tasks.size()=" + tasks.size() + "=");
for (int i=0;i<tasks.size();i++)
{
Task thisTask = (Task) tasks.get(i);
List assigneeUsers = thisTask.getSystemAttributes().getAssigneeUsers();
Iterator valueUsers = (assigneeUsers).iterator();

// Перезапросим задачу, чтобы получить полную информацию о задаче
thisTask = querySvc.getTaskDetailsById(ctx, thisTask.getSystemAttributes().getTaskId());

// Посмотрим результат
System.out.println("getSystemAttributes().getOutcome()="+
thisTask.getSystemAttributes().getOutcome() + "=" );
// Посмотрим состояние
System.out.println("getSystemAttributes().getState()="+
thisTask.getSystemAttributes().getState() + "=" );
// Посмотрим ID задачи
System.out.println("getSystemAttributes().getTaskId()="+
thisTask.getSystemAttributes().getTaskId() + "=" );
// Посмотрим номер задачи
System.out.println("getSystemAttributes().getTaskNumber()="+
thisTask.getSystemAttributes().getTaskNumber() + "=" );
// Посмотри название процесса
System.out.println("getProcessName()="+
thisTask.getProcessInfo().getProcessName()+ "=" );

// Посмотрим пользователей, которые участвуют в этой задаче
while (valueUsers.hasNext())
{
String listItem = ((IdentityType) valueUsers.next()).getId();
System.out.println("User=" + listItem);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

За дополнительной информацией можно обратиться сюда:


0 коммент. »

Оставьте Ваш комментарий