ejb 2.1 jboss_JBoss AS7 JNDI和EJB 3.1命名更改
ejb 2.1 jboss
由于“功能培訓”繼續前進,而我們又沒有保持軟件堆棧的最新狀態,因此我們的團隊發現自己處于不得不遷移的不利位置:
- JBoss 4.2.3到AS 7.1.x(當前為7.1.1)
- EJB 2.1到EJB 3.1
- Hibernate2到Hibernate3或4
以快速的方式。 我的意思是,誰想要發布具有8-10年歷史的軟件的新版本,而不是我! 以下是我在研究從具有EJB 2.1的JBoss 4.2.3升級到具有EJB 3.1的AS 7.1.x時所做的一些研究的結果。 我相信還會有更多
與不久的將來的遷移相關的帖子,但這與JNDI命名區域的更改有關。
過去/當前
在我們當前的代碼中,JNDI的命名非常簡單:
當前代碼
Hashtable properties = new Hashtable(); properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); properties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces"); properties.put("java.naming.provider.url", "jnp://localhost:1099"); Context ctx = new InitialContext(properties); Object ref = ctx.lookup(jndiName);AS7和EJB 3.1
EJB 3.1規范進行了一些更改,以強制要求EJB的可移植JNDI名稱,您可以在AS 7.1.1中繼承它。 我發現的另一件棘手的事情是,我無法再使用來自遠程客戶端和服務器的完全相同的查找代碼。
現在,AS 7具有兩個用于遠程EJB調用的選項 。 您需要的信息可以在JBoss文檔中找到,但并沒有打動我! 經過幾天的努力,我決定創建一個小程序,以幫助(希望)使差異非常清楚。 下面是我創建用來從遠程客戶端調用無狀態會話Bean的程序。 我從7.1快速入門示例中部署了“ ejb-remote”示例。 該代碼嘗試使用兩種遠程方法加載遠程服務。 可以預期的是,對于第一組查找,第一次查找成功,而第二次使用“ ejb:/”命名格式失敗。 然后,將值為“ org.jboss.ejb.client.naming”的Context.URL_PKG_PREFIXES屬性添加到傳遞給InitialContext構造函數的jndi屬性中,并重復查找。 現在,兩個查找都應該成功。 我已將所有JNDI屬性包含在代碼中,而不是依賴從類路徑中獲取的“ jboss-ejb-client.properties ”或“ jndi.properties ”的副本。
import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException;import java.util.Hashtable;public class EJBClient {private static String[] JNDINAME = {"jboss-as-ejb-remote-app/CalculatorBean!org.jboss.as.quickstarts.ejb.remote.stateless.RemoteCalculator", "ejb:/jboss-as-ejb-remote-app/CalculatorBean!org.jboss.as.quickstarts.ejb.remote.stateless.RemoteCalculator" };private Hashtable jndiProps;public EJBClient() {// setup 'base' jndi properties - no jboss-ejb-client.properties being picked up from classpath!jndiProps = new Hashtable();jndiProps.put("java.naming.factory.initial", "org.jboss.naming.remote.client.InitialContextFactory");jndiProps.put(InitialContext.PROVIDER_URL, "remote://localhost:4447");jndiProps.put("jboss.naming.client.ejb.context", true);// needed for remote access - remember to run add-user.batjndiProps.put(Context.SECURITY_PRINCIPAL, "client");jndiProps.put(Context.SECURITY_CREDENTIALS, "password");}public void doLookups() {// the 'exported' namespacefor (int i = 0; i < JNDINAME.length; i++) {lookup(JNDINAME[i]);}// This is an important property to set if you want to do EJB invocations via the remote-naming projectjndiProps.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");// now with the ejbfor (int i = 0; i < JNDINAME.length; i++) {lookup(JNDINAME[i]);}}private void lookup(String name) {System.out.println("Lookup name="+name);Context ctx = null;try {ctx = new InitialContext(jndiProps);Object ref = ctx.lookup(name);System.out.println("...Successful");} catch (NamingException e) {System.out.println("...Failed");//System.out.println(e.getMessage());e.printStackTrace();} finally {if (ctx != null) {try {ctx.close();} catch (NamingException e) {}}}}public static void main(String[] args) throws Exception {EJBClient client = new EJBClient();client.doLookups();System.out.println("Done!");}}服務器端的AS7
現在,在服務器上進行JNDI查找的簡單部分與舊方法非常相似,不同之處在于,您仍然需要根據新規范格式化JNDI名稱,并且命名工廠不再是jnp版本!
Hashtable jndiProps = new Hashtable();jndiProps.put("java.naming.factory.initial", "org.jboss.as.naming.InitialContextFactory");ctx = new InitialContext(jndiProps);Object ref = ctx.lookup(jndiName);結論
就像我之前說的那樣,該信息已經在JBoss文檔中,但是我可能讀了幾次。 我要尋找的是一個示例,該示例顯示了從客戶端和服務器加載EJB。
希望這可以幫助!
翻譯自: https://www.javacodegeeks.com/2013/05/jboss-as7-jndi-ejb-3-1-naming-changes.html
ejb 2.1 jboss
總結
以上是生活随笔為你收集整理的ejb 2.1 jboss_JBoss AS7 JNDI和EJB 3.1命名更改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩诘怎么读 摩诘念什么呢
- 下一篇: 篦子怎么读 篦子的读音和解释