Проблема обновления базы данных GlassFish
У меня есть приложение, развернутое на Glassfish v3.0.1, которое считывает события из таблицы в моей базе данных. После его готовности они маркируют их как обработанные. Я получаю странную ошибку, которую не могу объяснить при попытке вызвать метод, который выполняет обновление.
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void markEventAsProcessed(Long eventId) {
try {
AtlasEventQueueUpdateAsProcessedQuery setEventAsProcessed = new AtlasEventQueueUpdateAsProcessedQuery(entityManager, eventId);
int updateCount = setEventAsProcessed.execute();
logger.debug("Mark Event [" + eventId + "] processed");
return updateCount;
} catch (QueryException ex) {
logger.error("Event [" + eventId + "has not been marked as processed", ex);
}
}
Когда это вызвано в моем приложении, я получаю следующее исключение (Полная трассировка в нижней части сообщения):
Caused by: javax.ejb.AccessLocalException: Client not authorized for this invocation.
Кто-нибудь знает, что может вызвать эту ошибку, которую я совершил в Интернете, но не нашел ничего полезного.
2010-08-27 09:44:37,380 ERROR [Ejb-Timer-Thread-1 :EventProvider ] Unhandled exception in event processing - javax.ejb.EJBAccessException
javax.ejb.EJBAccessException
at com.sun.ejb.containers.BaseContainer.mapLocal3xException(BaseContainer.java:2262)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2053)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
at $Proxy190.markEventAsProcessed(Unknown Source)
at com.company.atlas.eventprocessor.provider.EventProvider.processNewEvents(EventProvider.java:170)
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 org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1056)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1128)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5292)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundTimeout(SystemInterceptorProxy.java:144)
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 com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5264)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5252)
at com.sun.ejb.containers.BaseContainer.callEJBTimeout(BaseContainer.java:3965)
at com.sun.ejb.containers.EJBTimerService.deliverTimeout(EJBTimerService.java:1667)
at com.sun.ejb.containers.EJBTimerService.access$100(EJBTimerService.java:98)
at com.sun.ejb.containers.EJBTimerService$TaskExpiredWork.run(EJBTimerService.java:2485)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: javax.ejb.AccessLocalException: Client not authorized for this invocation.
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1850)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:188)
... 34 more
Ответы
Ответ 1
Я удалил каталог domains/domainx/generated/policy/<appname>/
и полностью перераспределили (а не просто перезапустили) приложение.. его работа теперь как ожидалось.
В документации GlassFish есть запись для этой ошибки:
Описание
Доступна информация о ролевом сопоставлении в специфичном для Sun XML (например, sun-ejb-jar.xml
) и аутентификации в порядке, но следующая ошибка появится сообщение:
[...INFO|sun-appserver-pe8.0|javax.enterprise.system.container.ejb|...|
javax.ejb.AccessLocalException: Client not authorized for this invocation.
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:...
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(...)
Решение
Убедитесь, что модуль EJB (.jar
) или веб-модуль (.war
) упаковывается в приложение (.ear
) и не иметь информацию о ролевом отображении в уровень приложения, специфичный для Sun, sun-application.xml
. Для любого приложение (.ear
), безопасность информация о ролевых картах должна быть указанном в sun-application.xml
. Это приемлемо иметь как уровень XML на уровне модуля и уровень приложения XML.
Я не знаю, имеет ли это смысл в вашем контексте.
Если это не так, возможно, посмотрите на следующий поток Persisting Entity: javax.ejb.AccessLocalException: клиент не авторизовался для этого вызова. Один из плакатов предложил установить уровень регистрации журнала SECURITY Logger на FINE [так что] подсистема Policy Glassfish будет записывать подробное сообщение, описывающее характер неудачной проверки разрешения. Это может помочь. И я не могу сказать вам, сталкиваетесь ли вы с одной и той же проблемой, но OP решила проблему, очистив созданные файлы политик:
Ответ 2
Это исключение также может возникнуть, если вы попытаетесь скопировать и вставить сеанс EJB beans с новыми методами, в качестве файлов исправлений для исправления ошибок или включения новых функций. Перезапуск сервера или отключение и включение корпоративного приложения не помогут, так как сеанс EJB beans или сущности должны быть переупакованы и перераспределены, так что сервер приложений регистрирует новые методы и проверяет и предоставляет/исключает права доступа к новые/измененные методы в сеансе EJB beans.
Ответ 3
У меня была такая же проблема, когда вы вводили SessionState SessionBean (TransactionAttribute.REQUIRES_NEW) в другой SessionBean без состояния. Для меня перезапуск сервера решил это для меня...
Просто хочу сообщить вам, -)
Ответ 4
У меня была такая же проблема. Я не использую какой-либо контроль доступа на службе, но на одном экземпляре Glassfish все работает нормально, а с другой, я получил эту ошибку, но только по некоторым методам. Я добавил @PermitAll и перераспределил сервис, и все началось.
Ответ 5
В Glassfish 3.1.2 по крайней мере иногда предыдущая итерация bean, которая изменилась, закроет Glassfish при развертывании. Приложение будет работать до тех пор, пока не получит какой-то бит кода, который должен быть вызван, но не может быть, потому что ранее развернутый класс все еще существует. Я думаю, что Glassfish может отслеживать каждый и не позволять новому коду вызывать старый код, но я не очень хотел его беспокоиться, поскольку решение достаточно просто:
Остановите сервер, перейдите в каталог домена и удалите все файлы и подкаталоги в каталоге приложения. Затем выполните то же самое в сгенерированных и osgi-кеш-каталогах. Перезагрузите сервер и перестройте/переустановите.
Ответ 6
У меня была такая же ошибка, но моя причина была вызвана:
<c:set var="speciesList" value="#{timberSaleController.distinctSaleSpecies}" />
функция:
public List<Species> getDistinctSaleSpecies()
{
return ejbFacade.getDistinctSpeciesForAllSales();
}
когда я сменил тег установки на это, он сработал:
<c:set var="speciesList" value="#{timberSaleController.getDistinctSaleSpecies()}" />