我在想如何節省查找通過jndi遠程ejb參考的時間。我有一個需要工作得非常快的應用程序,但它也必須調用遠程ejb,這會降低速度。緩存遠程EJB 3.0參考
所以我的解決方案是這樣的: 我帶了apache commons-pool庫,並使用它的StackObjectPool實現了我的遠程ejb引用緩存。
private static final ObjectPool pool = new StackObjectPool(new RemoteEjbFactory());
廠看起來是這樣的:
public static class RemoteEjbFactory extends BasePoolableObjectFactory {
@Override
public Object makeObject() {
try {
return ServiceLocator.lookup(jndi);
} catch (NamingException e) {
throw new ConfigurationException("Could not find remote ejb by given name", e);
}
}
}
然後我把對象從池借用它(如果在池中沒有免費的對象,它使用工廠創建一個):
SomeEjbRemote someEjb = null;
try {
someEjb = (SomeEjbRemoteImpl) pool.borrowObject();
someEjb.invokeRemoteMethod();
} catch (Throwable t) {
if (someEjb != null) {
pool.invalidateObject(someEjb);
}
pool.clear(); // Maybe its not neccessary
someEjb = (SomeEjbRemoteImpl) pool.borrowObject();
someEjb.invokeRemoteMethod(); // this time it should work
}
當然返回ejb後成功invokacion
finally {
try {
pool.returnObject(someEjb);
} catch (Exception e) {
logger.error("Could not return object to pool.", e);
}
}
據我所知,不能保證遠程引用將保持連接,所以如果我們使用緩存遠程ejb捕獲異常,我們只是使該對象無效並重試。
您對這種方法有什麼看法?這是對的嗎?也許還有其他解決方案,建議?
謝謝你的回答! – nesvarbu 2010-06-23 12:28:34
是否可以對單個EJB或所有遠程EJB執行有限數量的併發遠程調用? JBoss是否通過配置參數來控制它? – 2016-06-15 18:42:02