logo

13 апр. 2011 г.

BIEE 11g: Actions, таймаут вызова HTTP-ресурсов

Использую в работе Oracle BIEE 11g.
Столкнулся с ограничением на время существования сокета при вызове HTTP-ресурсов - в 40 секунд.

Дело в том, что для реализации функциональности текущего проекта потребовалось много логики писать в виде Java Servlets/JSP, и из интерфейса BI вызывать эти сервлеты.
Есть сервлеты, которые выполняются дольше 40 секунд.

Для вызова сервлетов используется Action Framework – новая возможность OIBEE 11g. На некоторых столбцах ансверов были настроены интерактивные действия, осуществляющие HTTP-вызов к кастомизационным сервлетам.
При запуске такого действия возникало модальное окошко с часиками, блокирующее работу до завершения действия. Все хорошо.

Но если действие работало дольше 40 секунд (минуту-полторы, это оправдано функциональностью проекта), то вылетало сообщение об ошибке.


Хотя действие в фоне и отрабатывало, но все-таки сообщение об ошибке мешало жить пользователям.

Не хотелось отказываться от удобного инструмента вызова сервлетов – с интегрированной передачей параметров, простотой создания и поддержки – не писать же свой Javascript-обработчик на каждое действие. Да и окошко прогресса больно симпатичное…

Перебрал все параметры (до которых удалось дотянуться) PresentationServer'а, Weblogic'а, которые как-то могли влиять на таймауты хоть чего-нибудь.
Ничего не помогло. 40 секунд и ни секундой больше.

В итоге был придуман такой workaround:

Вместо вызова действия с типом "Инициализация запроса HTTP", я создаю действие типа "Вызов сценария в браузере".


Выбираю из списка javascript-функций – USERSCRIPT.ExecuteHTTPAction
Текст функции приведу далее.


Задаю основные параметры функции. Основная часть ссылки у меня неизменна – ссылается на кастомизационное веб-приложение в рамках WLS, ее я храню в переменной репозитория.
Остальное – путь до сервлета/JSP и параметры – задаю явно для каждого действия.








Текст функции USERSCRIPT.ExecuteHTTPAction определяется в файле
…../Middleware/user_projects/domains/bifoundation_domain/servers/bi_server1/tmp/_WL_user/analytics_11.1.1/7dezjl/war/res/b_mozilla/actions/UserScripts.js


USERSCRIPT.ExecuteHTTPAction = function (b) {
var a = new xxobiaf.ExecuteAction(b);
a.execute();
};

USERSCRIPT.ExecuteHTTPAction.publish = {new USERSCRIPT.parameter("urlBase", "Enter urlBase", ""), new USERSCRIPT.parameter("urlPath", "Enter urlPath", "")]
};
xxobiaf = function()
{};

xxobiaf.ExecuteAction = function (b) {
this.args = b;
this.url = this.args.urlBase + this.args.urlPath;
this.errorCallback = new obips.Callback(this, this.sawExecuteActionErrorHandler);
this.resourceManager = obips.ResourceManager.getSingleton();
};
xxobiaf.ExecuteAction.prototype.execute = function () {
NQWWaitCursor();

var rm = obips.ResourceManager.getSingleton();
var c = this.resourceManager.getResource(obiaf.ActionsBase.resourceFile, "kmsgActionsExecuteActionProcessing").getString();
var b = this.resourceManager.getResource(obiaf.ActionsBase.resourceFile, "kmsgActionsExecuteInlineActionProcessingMsg").getString();

var a = new obips.BusyDialog.Model(c, b, null, false);
this.actionExecutionBusyViewer = new obips.BusyDialog.Viewer(a, obips.FloatingWindow.Manager.getSingleton());
this.actionExecutionBusyViewer.cancelButton.style.visibility = "hidden";
this.actionExecutionBusyViewer.dialogDiv.style.width = "20%";

var r = new obids.AjaxRequest(this.url, new obips.Callback(this, this.sawExecuteActionResponseHandler), this.errorCallback);
r.setResponseType(saw.ajax.ResponseBlock.TYPE_TEXT);

for (arg in this.args) {
if (arg == "urlBase" || arg == "urlPath") {
continue;
}
r.getRequest().addArg(arg, this.args[arg]);
}

r.post()
};
xxobiaf.ExecuteAction.prototype.sawExecuteActionErrorHandler = function () {
this.enableUIAfterExecuteActionReturn()
};
xxobiaf.ExecuteAction.prototype.sawExecuteActionResponseHandler = function (c) {
this.enableUIAfterExecuteActionReturn();

var j = this.resourceManager.getResource(obiaf.ActionsBase.resourceFile, "kmsgActionsExecuteActionConfirmationTitle").getString();
var h = c;

var d = obips.MessageDialog.TITLE_IMAGE_INFO;
var c = new obips.MessageDialog.Model(j, h, null, d);
var e = new obips.MessageDialog.Viewer(c, obips.FloatingWindow.Manager.getSingleton());
e.footerDiv.style.textAlign = "center";
};
xxobiaf.ExecuteAction.prototype.enableUIAfterExecuteActionReturn = function () {
if (this.actionExecutionBusyViewer) {
this.actionExecutionBusyViewer.controller.closeDialog();
}
NQWDefaultCursor();
};


Комментариев нет:

Отправить комментарий