Java агент ошибка при вызове веб сервиса

  • Автор темы twister
  • Дата начала
T

twister

#1
Добрый день!
Агент вызывающий Web-сервис с помощью Axis, вызывает ошибки если файлы jar (axis.jar, commons-discovery-0.2.jar и commons-logging-1.0.4.jar) непосредственно добавлены в агент. Если файлы скопированы в \jvm\lib\ext Notes-клиента, то агент выполняется нормально. В чем проблема, поможет кто-нибудь? Спасибо.
Ошибка:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">java.lang.ExceptionInInitializerError и AccessControlException</div></div><div class="sp-body"><div class="sp-content">at org.apache.axis.handlers.BasicHandler.<clinit>(BasicHandler.java:43)
at org.apache.axis.client.Service.getAxisClient(Service.java:104)
at org.apache.axis.client.Service.<init>(Service.java:113)
at JavaAgent.NotesMain(JavaAgent.java:19)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
Caused by: org.apache.commons.discovery.DiscoveryException: Unable to instantiate implementation class for org.apache.commons.logging.LogFactory
*****
java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:292
)
at java.security.AccessController.checkPermission(AccessController.java:476)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:538)
at COM.ibm.JEmpower.applet.AppletSecurity.superDotCheckPermission(AppletSecurity.ja
va:1422)
at COM.ibm.JEmpower.applet.AppletSecurity.checkRuntimePermission(AppletSecurity.jav
a:1284)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1498)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1437)
at java.lang.ClassLoader.getParent(ClassLoader.java:1038)
at org.apache.commons.discovery.resource.ClassLoaders.isAncestor(ClassLoaders.java:
141)
at org.apache.commons.discovery.resource.ClassLoaders.put(ClassLoaders.java:114)
at org.apache.commons.discovery.resource.ClassLoaders.getLibLoaders(ClassLoaders.ja
va:176)
at org.apache.commons.discovery.tools.DiscoverClass.find(DiscoverClass.java:355)
at org.apache.commons.discovery.tools.DiscoverClass.newInstance(DiscoverClass.java:
579)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java
:418)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java
:378)
at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
at java.security.AccessController.doPrivileged1(Native Method)
at java.security.AccessController.doPrivileged(AccessController.java:287)
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)
at org.apache.axis.handlers.BasicHandler.<clinit>(BasicHandler.java:43)
at org.apache.axis.client.Service.getAxisClient(Service.java:104)
at org.apache.axis.client.Service.<init>(Service.java:113)
at JavaAgent.NotesMain(JavaAgent.java:19)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)

at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java
:426)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java
:378)
at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
at java.security.AccessController.doPrivileged1(Native Method)
at java.security.AccessController.doPrivileged(AccessController.java:287)
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)
... 6 more
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 568
263
#2
ужо скокам говорено - не кладите сторонние либы в базу...
Агент вызывающий Web-сервис с помощью Axis, вызывает ошибки если файлы jar (axis.jar, commons-discovery-0.2.jar и commons-logging-1.0.4.jar) непосредственно добавлены в агент. Если файлы скопированы в \jvm\lib\ext Notes-клиента, то агент выполняется нормально. В чем проблема, поможет кто-нибудь? Спасибо.
jvm/lib/ext/
туды их надо всегда
а причина - класслоадер так работает у Нотусей, сложные классы имеют статические методы, и классы типа синглтон (а как вы реализуете в рамках агента - ежели он убивается), и свою стр-ру нитей, всё это jvm должна грузить один раз и выгружать по закрытии, а не при каждом старте агента
 
T

twister

#3
Я знаю что так будет работать. Вебсервис будет вызываться с машин пользователей, придется копировать каждому пользователю эти файлы в jvm/lib/ext/. Других решений нет?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 568
263
#4
нет других решений и быть не должно (в тек. реализации jvm от ИБМ) - читайте выше (я развернул тезис)
автоматизируйте (проверяйте при старте агента, на присут. библы, и копируйте - ежели чё, просите передернуть Нотуса)
 
13.03.2009
625
1
#6
Я знаю что так будет работать. Вебсервис будет вызываться с машин пользователей, придется копировать каждому пользователю эти файлы в jvm/lib/ext/. Других решений нет?
помница - чуть не убились конкретно на этой задаче. но решили :)

на самом деле в семерке axis есть. тока об этом почему-то молчат.
замена
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
на
import lotus.domino.axis.client.Call;
import lotus.domino.axis.client.Service;
ну и т.д. и вперед.

тока помница, пришлось создать свой HTTPSender - неверно формировался заголовок пакета:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.util.Hashtable;

import lotus.domino.axis.AxisFault;
import lotus.domino.axis.MessageContext;
import lotus.domino.axis.client.Call;
import lotus.domino.axis.transport.http.HTTPConstants;
import lotus.domino.axis.transport.http.HTTPSender;

public class HTTPModifiedHeaderHandler extends HTTPSender {
public static final String CVS_VERSION = "$Revision$";

public void invoke(MessageContext msgCtx) throws AxisFault {
System.out.println( msgCtx );
modifyHTTPHeader(msgCtx);
super.invoke(msgCtx);
}

public void modifyHTTPHeader(MessageContext msgCtx) {
Hashtable headers = (Hashtable) msgCtx
.getProperty(HTTPConstants.REQUEST_HEADERS);
if (headers == null) {
headers = new Hashtable();
msgCtx.setProperty(HTTPConstants.REQUEST_HEADERS, headers);
}
Call call = (Call) msgCtx.getProperty("call_object");
String s = call.getSOAPActionURI();
if ( s == null ) { s = ""; };
headers.put("SOAPAction", s);
}
}[/CODE]
плюс добавить в проект корректный
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">client-config.wsdd</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='xml'><?xml version="1.0" encoding="UTF-8"?>
<deployment name="defaultClientConfig"
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
.....
<transport name="http"
pivot="java:HTTPModifiedHeaderHandler" /> ' сюда имя класса вместе с пакетом
....
</deployment>[/CODE]
идея взята с http://www.unimatrix-0.de/index.php?option...s&Itemid=55
 

divankin

Senjor developer
13.08.2009
182
0
#7
В восьмерке появились Web Service Consumer. Вы не пробовали их?
Они, конечно, ограниченнее, чем Axis, зато родные.
Не обязательно даже юзерам ставить восьмерку - можно поставить восьмые сервера и веб-сервисы вызывать серверным агентом.