Este artigo descreve a maneira mais eficiente de remover uma instância CMP (Container-Managed Persistence) do conjunto da opção A. Primeiro, inclua um método em seu bean CMP
(Container-managed Persistence).
public void invalidateFromCache()
{
}
Inclua este método na interface local CMP. Modifique o descritor
para o método para que ele utilize TX_REQUIRED.
Isto pode ser feito utilizando o
editor do descritor EJB clicando na guia Montagem e, em seguida, clicando no botão
Incluir no painel de transações do contêiner. Selecione o CMP e, em seguida, clique no método invalidateFromCache.
Selecione Requerido na caixa de combinação e, em seguida, clique em
OK. Você deve ver
algo como: erro! Origem de referência não localizada. Em
seguida, inclua um método home como o seguinte:
public void ejbHomeInvalidateCompleteOrders(Collection/*<orderlocal>*/ orders)
{
Iterator iter = orders.iterator();
while(iter.hasNext())
{
OrderLocal order = (OrderLocal)iter.next();
// isto apenas inclui o bean da opção A nesta transação para que, quando
houver for efetuado o rollback abaixo,
// ele seja descartado, ou seja, removido do cache.
order.invalidateFromCache();
}
myEntityCtx.setRollbackOnly();
}
Inclua este método no home local do bean clicando com o botão direito no
método, selecione Beans Corporativos e, em seguida, faça a promoção para o home local. Defina este atributo de transação do método como RequiresNew utilizando também a mesma abordagem
de antes. Este método utiliza uma Lista de OrderLocal (nosso CMP é chamado Order) e os
remove do cache da opção A. Observe que foi necessário utilizar uma Lista de chaves mas,
em seguida, foi necessário executar um findByPrimaryKey e, em seguida, chamar o método. Isto é mais dispendioso do que a abordagem feita aqui. Basicamente,
o método faz iteração na lista e chama o método invalidate em cada pedido da
lista. O método invalidate associa o bean da opção A à transação
atual. Quando cada bean estiver associado à transação, ela será marcada
como apenas rollback. Quando o método é retornado, é efetuado rollback da transação
e todos os beans da opção A associados são descartados do cache. A lógica de
negócios aceita uma nova ordem. Como parte da aceitação de um novo pedido, é possível que
vários outros pedidos sejam concluídos. O método acceptOrder retorna
um List<
OrderLocal> ao responsável pela chamada. O responsável pela chamada deve, então, transmitir esta lista para o método home acima para removê-los do cache. Eles não são excluídos do banco de dados, apenas do cache. Segue um exemplo:
BookLocal book = ivBookHome.findByPrimaryKey(ivOrder.getSymbol());
Collection/*<OrderKey>*/ completedOrders =
book.acceptOrder(session, pub, ivOrder, cache);
// invalidar todos os pedidos concluídos do cache da Opção A de CMP.
try
{
if(!completedOrders.isEmpty())
ivOrderHome.invalidateCompleteOrders(completedOrders);
}
catch(Exception e)
{
// ignorar exceção esperada
}
Isso mostra a consulta de um CMP Book, chamando seu método accept order.
Este método retorna os pedidos que precisam ser removidos do cache
como resultado da chamada. O método acceptOrder utiliza uma transação RequiresNew
para que sua transação seja confirmada automaticamente quando este método for retornado. Em seguida, utilize o método home em Order para remover os CMPs retornados
do cache. O método acceptOrder coleta todas as instâncias de Order que
precisam ser removidas:
public Collection/*<OrderLocal>*/ acceptOrder(…)
Collection completeOrders = new LinkedList();
OrderLocal buyer = ...;
OrderLocal seller = ...;
... some business logic....
if(buyer.getIsComplete())
completeOrders.add(buyer);
if(seller.getIsComplete())
completeOrders.add(seller);
…
return completedOrders;
}
Este código demonstra o aplicativo removendo o objeto armazenado em cache
do qual ele concluiu o processamento. Se o aplicativo não fez isso, o cache possui
instâncias úteis e inúteis. As úteis são registros dos quais ele
ainda precisa ou estão pendentes ou não concluídas. Não há um ponto no armazenamento em cache de registros concluídos. Um aplicativo pode utilizar essa abordagem para remover os objetos
concluídos.