Исключение приведения класса Weblogic,EJB, $Proxy99
Ниже приведены модули в моем проекте,
1. Модуль EJB (версия 3): мы готовим ejb jar этого модуля и размещаем на сервере Weblogic11g. Это касается работы с базой данных. У него есть @local, интерфейс @Remote и классы @stateless, реализующие @local, @Remote-интерфейсы.
2. Веб-приложение: это веб-приложение принимает входные данные (пользователь загружает файл) от пользователей, проверяет файл и вставляет данные в базу данных. Он использует RMI.
Проблема: На производстве (сервер weblogic 11g) иногда мы наблюдаем исключение, говорящее, что $Proxy99 не может быть приведен к "имени удаленного интерфейса" (для разных классов), например com.xyz.fileProcessSetting.FileProcessSttgFacadeRemote. Но через некоторое время, когда мы снова загружаем файл, он загружается успешно без каких-либо ошибок.
Теперь я не понимаю, почему эти удаленные объекты становятся временно недоступными? Никогда не сталкивался с этой проблемой в среде разработки /UAT. Также не знаю, как воспроизвести и исправить это.
Пожалуйста помоги. Заранее спасибо.
@Remote
public interface FileProcessSttgFacadeRemote {
//methods
}
@Local
public interface FileProcessSttgFacadeLocal {
//methods
}
@Stateless
public class FileProcessSttgFacade implements FileProcessSttgFacadeLocal, FileProcessSttgFacadeRemote {
//methods
}
в weblogic-ejb-jar.xml
<weblogic-enterprise-bean>
<ejb-name>FileProcessSttgFacade</ejb-name>
<stateless-session-descriptor>
<business-interface-jndi-name-map>
<business-remote>com.xyz.fileProcessSetting.FileProcessSttgFacadeRemote</business-remote>
<jndi-name>FileProcessSttgFacade</jndi-name>
</business-interface-jndi-name-map>
</stateless-session-descriptor>
</weblogic-enterprise-bean>
В веб-приложении также в модуле ejb всякий раз, когда мы хотим вызвать методы, мы используем следующий метод поиска для получения удаленного объекта:
public class someclass extends EjbLocator {
public void someMethod(){
FileProcessSttgFacadeRemote fpfr = (FileProcessSttgFacadeRemote) getService("FileProcessSttgFacade");
//other code
}
}
Ниже приведен класс, используемый для поиска JNDI:
public class EjbLocator {
public Object getService(final String jndiName) throws Exception {
try {
obj = getDefaultContext().lookup(jndiName);
} catch (final Exception exp) {
exp.printStackTrace();
}
return obj;
}
protected Context getDefaultContext() {
try {
final Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put(Context.SECURITY_PRINCIPAL,"weblogic");
env.put(Context.SECURITY_CREDENTIALS, "password");
env.put(Context.PROVIDER_URL, "t3://<ip>:<port>");
defaultContext = new InitialContext(env);
return defaultContext;
} catch (final NamingException nExp) {
nExp.printStackTrace();
}
return null;
}
}