我使用的是Weblogic 10.3.6,Mojarra 2.0.9和EJB3。我們擁有@ViewScoped和@SessionScoped JSF託管bean,並且我們要求在發生服務器故障的情況下仍然可以繼續使用。我剛剛解決了這個問題,直到我在JSF Beans上使用EJB注入時遇到了問題。下面是simplifed豆@EJB在故障轉移後在JSF Bean上注入
EJB接口
@JNDIName("our.ejb.jndiname")
@Remote
public interface OurEJBInterface {
some methods...
}
EJB豆
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ourBean implements OurEJBInterface {
the methods...
}
JSF輔助Bean
@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)
有什麼辦法讓Managed Bean重新初始化指向新服務器的新EJB引用?
我知道我可以使用服務定位器,將init放在提交方法中,但如果可能的話,想使用@EJB。
在此先感謝。
如果我理解正確的,你的問題是有關測試補丁。在測試過程中,您無法正確實例化您的EJB。在這種情況下,你應該使用MocKClasses和一個MockServer。你可以用http://arquillian.org/來完成,或者http://code.google.com/p/mockito/就足夠了。我希望這可以幫助你。 – 2013-04-09 15:11:40
感謝您的回覆,但這不是測試相關的。這是故障切換方案中的實時代碼。 – andyfinch 2013-04-10 07:28:21