/** O nome de referência de recurso do proxy datasource */ private static String proxyResRef = "jdbc/proxyDS"; /** Referência de recurso de DataSource 1 */ private static String resRef1 = "jdbc/myDS1"; /** Referência de recurso de DataSource 2 */ private static String resRef2 = "jdbc/myDS2"; /** Nome de JNDI da origem de dados global para a referência de recurso de DataSource 1 */ private String globalDSJNDIName1 = null; /** Nome de JNDI da origem de dados global para a referência de recurso de DataSource 2 */ private String globalDSJNDIName2 = null; /** Nome de JNDI da origem de dados global para a referência de recurso do Proxy Datasource */ private String globalProxyDSJNDIName = null;Uma instância WSProxyDataSourceHelper também é definida, portanto, o bean de sessão pode utilizá-la para resolver o nome de JNDI de origem de dados e definir o nome de JNDI da origem de dados para a transação.
/** * a instância WSProxyDataSourceHelper utilizada para definir o nome de JNDI da origem de dados * para a transação atual e resolver a referência de recurso da origem de dados * para o nome de JNDI global */ WSProxyDataSourceHelper dsHelper = null;O método setSessionContext é o seguinte:
public void setSessionContext(javax.ejb.SessionContext ctx) { mySessionCtx = ctx; // Consulte o WSProxyDataSourceHelper, e os homes locais de EJB try { InitialContext ic = new InitialContext(); dsHelper = (WSProxyDataSourceHelper) ic.lookup(WSProxyDataSourceHelper.JNDI_NAME); accountHome = (AccountLocalHome) ic.lookup(accountHomeJNDIName); accountOwnerHome = (AccountOwnerLocalHome) ic.lookup(accountOwnerHomeJNDIName); } catch (Exception e) { throw new EJBException(e); } // Obter nome do servidor AdminService service = AdminServiceFactory.getAdminService(); SERVER_NAME = service.getCellName() + "/" + service.getNodeName() + "/" + AdminServiceFactory.getAdminService().getProcessName(); // Resolver as referências de recurso para o nome de JNDI de origem de dados global try { globalDSJNDIName1 = dsHelper.resolveDataSourceReference(resRef1); globalDSJNDIName2 = dsHelper.resolveDataSourceReference(resRef2); globalProxyDSJNDIName = dsHelper.resolveDataSourceReference(proxyResRef); } catch (ResRefNotFoundException rrnfe) { throw new EJBException(rrnfe);Consulte WSProxyDataSourceHelper do espaço de nomes de JNDI utilizando a seguinte instrução:
dsHelper = (WSProxyDataSourceHelper ) ic.lookup(WSProxyDataSourceHelper .JNDI_NAME);Em seguida, consulte AccountLocalHome e AccountOwnerLocalHome normalmente. Depois disso, utilize a API AdminService para obter o nome do servidor. Utilize este nome do servidor para verificar se o roteamento da partição está correto. Os usuários não precisam desempenhar isso em seus aplicativos. O tempo de execução do Recurso de Particionamento garante o comportamento correto de rota de partição.
globalDSJNDIName1 = dsHelper.resolveDataSourceReference(resRef1);Durante o tempo de desenvolvimento do aplicativo, o desenvolvedor não sabe para qual nome de JNDI esta referência de recurso será mapeada. O componente Proxy Datasource fornece uma API para que o aplicativo obtenha o nome de JNDI da origem de dados. Esta origem de dados do nome de JNDI será utilizada para informar o tempo de execução no qual a origem de dados deve ser utilizada.
/** * withdraw money from an account * @param accountId * @param amount * @return * @throws InSufficientFundException */ public String withdraw(String accountId, float amount) throws InSufficientFundException { // Definir a origem de dados que esta transação acessará. setDataSource(accountId); try { AccountLocal account = accountHome.findByPrimaryKey(accountId); account.withdraw(amount); } catch (ObjectNotFoundException onfe) { throw new EJBException(onfe); } catch (FinderException fe) { throw new EJBException(fe); } return SERVER_NAME; }A diferença entre este método e um método normal é que a seguinte instrução foi incluída:
// Definir a origem de dados que esta transação acessará. setDataSource(accountId);O método setDataSource é o seguinte:
/** * Definir a origem de dados que será utilizada pelo CMP para a transação atual. * Se accountID for iniciado com W, a origem de dados 1 será utilizada. Se accountID * for iniciado com E, a origem de dados 2 será utilizada. * * @param s */ private void setDataSource(String s) { if (s.startsWith("W")) { dsHelper.setCurrentDataSourceJndiName(globalProxyDSJNDIName, globalDSJNDIName1); } else { dsHelper.setCurrentDataSourceJndiName(globalProxyDSJNDIName, globalDSJNDIName2); } }O método setDataSource utiliza WSProxyDataSourceHelper para definir o nome de JNDI de origem de dados atual para a transação atual. Se accountId for iniciado com W, que significa que o ID da conta deve ser armazenado no banco de dados da costa oeste, o nome de JNDI globalDSJNDIName1 será definido no encadeamento. Se accountId for iniciado com E, que significa que o ID da conta deve ser armazenado no banco de dados da costa leste, o nome globalDSJNDIName2 de JNDI deve ser configurado no encadeamento.
Agora, seu aplicativo foi ativado com o suporte à origem de dados de proxy. A próxima etapa mostra como configurar as origens de dados DB2 e a origem de dados de proxy.