Я использую Weblogic 10.3.6, Mojarra 2.0.9 и EJB3. У нас есть @ViewScoped и @SessionScoped JSF Managed bean-компоненты, и мы требуем, чтобы в случае сбоя сервера использование могло продолжаться. Я почти взломал его, пока не столкнулся с проблемой использования EJB-инъекции в JSF Beans. Вот упрощенные бобы
Интерфейс EJB
@JNDIName("our.ejb.jndiname")
@Remote
public interface OurEJBInterface {
some methods...
}
Бин EJB
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ourBean implements OurEJBInterface {
the methods...
}
Поддерживающий компонент JSF
@ManagedBean
@ViewScoped
public class OurBackingBean {
@EJB
private OurBeanBeanInterface ourBeanBeanInterface ;
public void submit()
{
ourBeanBeanInterface.doSomethingFromBean();
}
}
Когда мы моделируем отработку отказа, сеанс правильно извлекается с нового сервера, однако ссылка на EJB по-прежнему указывает на старый сервер, и мы получаем эту ошибку:
javax.ejb.EJBException: Could not establish a connection with -1977369784351278190S:MCPVMWLS01:[7030,7030,-1,-1,-1,-1,-1]:Destin8ShowCase:JVM01, java.rmi.ConnectException: Destination unreachable; nested exception is:
java.io.IOException: Empty server reply; No available router to destination; nested exception is:
java.rmi.ConnectException: Destination unreachable; nested exception is:
java.io.IOException: Empty server reply; No available router to destination; nested exception is: java.rmi.ConnectException: Destination unreachable; nested exception is:
java.io.IOException: Empty server reply; No available router to destination
java.rmi.ConnectException: Destination unreachable; nested exception is:
java.io.IOException: Empty server reply; No available router to destination
at weblogic.rjvm.ConnectionManager.bootstrap(ConnectionManager.java:470)
at weblogic.rjvm.ConnectionManager.bootstrap(ConnectionManager.java:402)
at weblogic.rjvm.RJVMImpl.ensureConnectionEstablished(RJVMImpl.java:306)
at weblogic.rjvm.RJVMImpl.getOutputStream(RJVMImpl.java:350)
at weblogic.rjvm.RJVMImpl.getRequestStreamInternal(RJVMImpl.java:612)
at weblogic.rjvm.RJVMImpl.getRequestStream(RJVMImpl.java:563)
at weblogic.rjvm.RJVMImpl.getOutboundRequest(RJVMImpl.java:789)
at weblogic.rmi.internal.BasicRemoteRef.getOutboundRequest(BasicRemoteRef.java:159)
at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:211)
at com.mcpplc.destin8.ejbs.manifestenquiry.ManifestEnquiryFacadeBean_qzni2o_ManifestEnquiryFacadeBeanInterfaceImpl_1036_WLStub.doMEQ02(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.invoke(RemoteBusinessIntfProxy.java:85)
at $Proxy286.doMEQ02(Unknown Source)
at com.mcpplc.destin8.web.jsf.backingbeans.imports.Meq02BackingBean.customProcessing(Meq02BackingBean.java:49)
at com.mcpplc.destin8.web.jsf.backingbeans.BackingBean.submit(BackingBean.java:179)
Есть ли способ заставить управляемый компонент повторно инициализировать новую ссылку EJB, указывающую на новый сервер?
Я знаю, что могу использовать локатор службы с инициализацией, помещенной в метод отправки, но хотел бы использовать @EJB, если это возможно.
Заранее спасибо.
@produce
и@inject
, но кажется, что если мне придется каждый раз вызывать метод, чтобы получить мой EJB, я могу также придерживаться локатора службы. 09.04.2013