Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> javax.ejb.EJBException: Failed to create timer 
V
    Опции темы
YuG
Дата 15.5.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



Добрый день.
Столкнулся с проблемой при работе с таймерами в EJB 3.0
Если вызывать из сервлета метод бина, который только создает таймер, а затем, в другом методе обрабатывает этот таймер по таймауту, то всё работает.
Но если таймер создается внутри большого бизнес-метода бина, то получаю EJBException.
В чем дело и как побороть?

Итак, в бизнес-методе бина делаю так:
Код

        TimerService timerService = context.getTimerService();
        timerService.createTimer(new Date(), groupId);         //--- тут происходит ошибка

где context объявлена как
Код

        private @Resource SessionContext context;


получаю ошибку
Цитата
13:41:39,705 WARN  [loggerI18N] [com.arjuna.ats.internal.jta.transaction.arjunacore.lastResource.disallow] [com.arjuna.ats.internal.jta.transaction.arjunacore.lastResource.disallow] Adding multiple last resources is disallowed. Current resource is org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@1257d77
13:41:39,721 ERROR [STDERR] javax.ejb.EJBException: Failed to create timer
13:41:39,721 ERROR [STDERR]  at org.jboss.ejb.txtimer.TimerServiceImpl.createTimer(TimerServiceImpl.java:263)
13:41:39,721 ERROR [STDERR]  at org.jboss.ejb.txtimer.TimerServiceImpl.createTimer(TimerServiceImpl.java:222)
13:41:39,721 ERROR [STDERR]  at org.jboss.ejb3.timerservice.jboss.TimerServiceFacade.createTimer(TimerServiceFacade.java:74)
13:41:39,721 ERROR [STDERR]  at ru.cti.iss.bwks.ejb3.impl.CoordinatorImpl.createTimerForPbxGroup(CoordinatorImpl.java:218)
13:41:39,721 ERROR [STDERR]  at ru.cti.iss.bwks.ejb3.impl.CoordinatorImpl.createPbxGroup(CoordinatorImpl.java:201)
13:41:39,721 ERROR [STDERR]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
13:41:39,721 ERROR [STDERR]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
13:41:39,721 ERROR [STDERR]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
13:41:39,721 ERROR [STDERR]  at java.lang.reflect.Method.invoke(Method.java:585)
13:41:39,721 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122)
13:41:39,721 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111)
13:41:39,721 ERROR [STDERR]  at org.jboss.ejb3.EJBContainerInvocationWrapper.invokeNext(EJBContainerInvocationWrapper.java:69)
13:41:39,721 ERROR [STDERR]  at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:73)
13:41:39,721 ERROR [STDERR]  at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:59)
13:41:39,721 ERROR [STDERR]  at sun.reflect.GeneratedMethodAccessor275.invoke(Unknown Source)
13:41:39,721 ERROR [STDERR]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
13:41:39,736 ERROR [STDERR]  at java.lang.reflect.Method.invoke(Method.java:585)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.advice.PerJoinpointAdvice.invoke(PerJoinpointAdvice.java:174)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.fillMethod(InvocationContextInterceptor.java:72)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_fillMethod_11438836.invoke(InvocationContextInterceptor_z_fillMethod_11438836.java)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:88)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_11438836.invoke(InvocationContextInterceptor_z_setup_11438836.java)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:62)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:56)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:68)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
13:41:39,736 ERROR [STDERR]  at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
13:41:39,736 ERROR [STDERR]  at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.session.SessionSpecContainer.invoke(SessionSpecContainer.java:219)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.proxy.handler.ProxyInvocationHandlerBase.invoke(ProxyInvocationHandlerBase.java:261)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb3.proxy.handler.session.SessionSpecProxyInvocationHandlerBase.invoke(SessionSpecProxyInvocationHandlerBase.java:101)
13:41:39,736 ERROR [STDERR]  at $Proxy540.createPbxGroup(Unknown Source)
13:41:39,736 ERROR [STDERR]  at ru.cti.iss.bwks.servlet.action.pbx.PBXCreateGroupAction.process(PBXCreateGroupAction.java:60)
13:41:39,736 ERROR [STDERR]  at ru.cti.iss.bwks.servlet.PortalServlet.doProcess(PortalServlet.java:68)
13:41:39,736 ERROR [STDERR]  at ru.cti.iss.bwks.servlet.BaseServlet.doPost(BaseServlet.java:86)
13:41:39,736 ERROR [STDERR]  at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
13:41:39,736 ERROR [STDERR]  at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
13:41:39,736 ERROR [STDERR]  at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
13:41:39,736 ERROR [STDERR]  at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
13:41:39,736 ERROR [STDERR]  at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
13:41:39,736 ERROR [STDERR]  at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
13:41:39,736 ERROR [STDERR]  at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
13:41:39,736 ERROR [STDERR]  at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
13:41:39,736 ERROR [STDERR]  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
13:41:39,736 ERROR [STDERR]  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
13:41:39,736 ERROR [STDERR]  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:601)
13:41:39,736 ERROR [STDERR]  at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
13:41:39,736 ERROR [STDERR]  at java.lang.Thread.run(Thread.java:595)
13:41:39,736 ERROR [STDERR] Caused by: java.lang.IllegalStateException: Unable to persist timer
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb.txtimer.DatabasePersistencePolicy.insertTimer(DatabasePersistencePolicy.java:124)
13:41:39,736 ERROR [STDERR]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
13:41:39,736 ERROR [STDERR]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
13:41:39,736 ERROR [STDERR]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
13:41:39,736 ERROR [STDERR]  at java.lang.reflect.Method.invoke(Method.java:585)
13:41:39,736 ERROR [STDERR]  at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
13:41:39,736 ERROR [STDERR]  at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
13:41:39,736 ERROR [STDERR]  at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
13:41:39,736 ERROR [STDERR]  at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
13:41:39,736 ERROR [STDERR]  at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
13:41:39,736 ERROR [STDERR]  at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
13:41:39,736 ERROR [STDERR]  at $Proxy119.insertTimer(Unknown Source)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb.txtimer.TimerServiceImpl.createTimer(TimerServiceImpl.java:257)
13:41:39,736 ERROR [STDERR]  ... 80 more
13:41:39,736 ERROR [STDERR] Caused by: org.jboss.util.NestedSQLException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 59af4d48:4ee:4a0d2feb:136 status: ActionStatus.ABORT_ONLY >); - nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 59af4d48:4ee:4a0d2feb:136 status: ActionStatus.ABORT_ONLY >))
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:95)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb.txtimer.GeneralPurposeDatabasePersistencePlugin.insertTimer(GeneralPurposeDatabasePersistencePlugin.java:201)
13:41:39,736 ERROR [STDERR]  at org.jboss.ejb.txtimer.DatabasePersistencePolicy.insertTimer(DatabasePersistencePolicy.java:120)
13:41:39,736 ERROR [STDERR]  ... 92 more
13:41:39,736 ERROR [STDERR] Caused by: org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 59af4d48:4ee:4a0d2feb:136 status: ActionStatus.ABORT_ONLY >)
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.connectionmanager.TxConnectionManager.managedConnectionReconnected(TxConnectionManager.java:409)
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.connectionmanager.BaseConnectionManager2.reconnectManagedConnection(BaseConnectionManager2.java:625)
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:499)
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:941)
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:89)
13:41:39,736 ERROR [STDERR]  ... 94 more
13:41:39,736 ERROR [STDERR] Caused by: javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 59af4d48:4ee:4a0d2feb:136 status: ActionStatus.ABORT_ONLY >
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener$TransactionSynchronization.checkEnlisted(TxConnectionManager.java:879)
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener.enlist(TxConnectionManager.java:675)
13:41:39,736 ERROR [STDERR]  at org.jboss.resource.connectionmanager.TxConnectionManager.managedConnectionReconnected(TxConnectionManager.java:403)
13:41:39,736 ERROR [STDERR]  ... 98 more
13:41:39,736 ERROR [STDERR] 15.05.2009 13:41:39 ru.cti.iss.bwks.servlet.action.BaseAction debug
INFO: <br>Failed to create timer<br><br>При обработке произошла внутренняя ошибка.<br>Обратитесь к администратору системы.
13:41:39,736 ERROR [STDERR] 15.05.2009 13:41:39 ru.cti.iss.bwks.servlet.action.BaseAction debug
INFO: /WEB-INF/pages/index.jsp
13:41:39,736 ERROR [STDERR] 15.05.2009 13:41:39 ru.cti.iss.bwks.servlet.action.BaseAction debug
INFO: Forwarding request to path /WEB-INF/pages/message.jsp

PM WWW ICQ Skype   Вверх
MisterCleric
Дата 15.5.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Вот то, что у меня работает на JBOSS и WebSphere
Код

@Stateless
@Local(TimerManager.class)
public class TimerManagerBean implements TimerManager {

    @Resource
    private TimerService timerService;

    public void createTimer(Date startTime, long intervalDuration, TimerInfo timerInfo) {
        timerService.createTimer(startTime, intervalDuration, timerInfo);
    }

    public void stopTimer(TimerInfo timerInfo) {
        Collection timers = timerService.getTimers();
        for (Object timer : timers) {
            Timer t = (Timer) timer;
            if (t.getInfo().equals(timerInfo)) {
                t.cancel();
                break;
            }
        }
    }

    @Timeout
    public void timeout(Timer timer) {

    }
}


Инждектися прямо TimerService, из вне вызывается бизнес-метод createTimer с датой начала, периодом повторения в миллисекуднах и просты Серриализуемым объектом TimerInfo (самописный).
Возможно у тебя проблема, что уже такой таймер создан? Тогда стоит сначала вызвать такой как у меня метод stopTimer

Добавлено через 6 минут и 2 секунды
Да, есть еще такой пример. Все это будут методы одного EJB
Код

 public void createTimer() {
        Collection timers = timerService.getTimers();
        for (Object timer : timers) {
            Timer t = (Timer) timer;
            if (t.getInfo().equals(TIMER_INFO)) {
                return;
            }
        }
        timerService.createTimer(new Date(), TIMER_INTERVAL, TIMER_INFO);
    }

 @Timeout
    public void timeout(Timer timer) {
        String timerInfo = (String) timer.getInfo();
        logger.debug("TIMER:");
        logger.debug(timerInfo);

        List objs = objDAO.findAll();

        if (!objs.isEmpty()) {
            Message notifyMessage = new Message();
            notifyMessage.getBody().add(objs);
            stateNotifier.notify(notifyMessage);
        } else {
            try {
                timer.cancel();
            } catch (Exception e) {
                logger.fatal(e, e);
            }
            objDAO.archive();
        }
    }
 public void operation(Message message){
        // many business operations
        createTimer();
    }


Так что где-то что-то у тебя с количеством экземпляров самого TimedObject


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
YuG
Дата 18.5.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



MisterCleric, проблема в том, что просто создание таймера работает
Код

    public void createTimer(Date startTime, long intervalDuration, TimerInfo timerInfo) {
        timerService.createTimer(startTime, intervalDuration, timerInfo);
    }

однако, если добавить вызов другого jpa бина
Код

    public void createTimer(Date startTime, long intervalDuration, TimerInfo timerInfo) {
        userManager.findUserByEmail("[email protected]");
        timerService.createTimer(startTime, intervalDuration, timerInfo);
    }

то получается исключение java.lang.IllegalStateException: Unable to persist timer
а в логах есть такая информация:
Цитата
[com.arjuna.ats.internal.jta.transaction.arjunacore.lastResource.disallow] Adding multiple last resources is disallowed. Current resource is org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource@1257d77
где этот параметр можно изменить?
PM WWW ICQ Skype   Вверх
MisterCleric
Дата 18.5.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Собственно я так понимаю, что проблема тут кроется как раз в том, что объекты таймеров сохраняются в базу; и я уверен, что ты используешь Hypersonic, датасоурс которого local-tx-datasource, и никак не XA, как надо для распределенной транзакции в твоем случае. 
Тут происходит такое: 
1. ты стартуешь транзакцию вызывая метод createTimer
2. Она накладывается на userManager.findUserByEmail, если не указаны никакие транзакционные атрибуты на этом методе.
3. Эта же транзакция распостраняется на timerService.createTimer
4. В результате выходит, что одна и та же транзакция ложиться на две базы.
5. Поскольку local-tx-datasource не поддерживает двухфайзные транзакции, то и валится эксепшн.

Решения могут быть такими

1. Помечаешь свой метод userManager.findUserByEmail как не транзакционный @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
2. Выносишь timerService.createTimer в отдельный метод
3. Сделать DefaultDS xa-datasource и создать все таблицы менеджмента JBOSS в твоей базе

Вот мой пример, который работает на local-tx-datasource:
Код

  public void uploadPackage(Message message) throws Exception {
        UploadPackage uploadPackage = (UploadPackage) message.getBody().get();
        message.getBody().add(uploadPackage.getDeals());
        message = pvbkiConnector.uploadReports(message);
        if (message == null) {
            throw new PersistenceException("Package was not uploaded, exception while package uploading.");
        }
        RequestStatus requestStatus = new RequestStatus();
        requestStatus.setId((long) UploadDataStateEnum.AWAITING_STATE.ordinal() + 500);
        uploadPackage.setStatus(requestStatus);

        uploadPackage.setBatchId(message.getBody().get().toString());
        saveUploadPackage(uploadPackage);
        createTimer();
    }


Все в отдельных методах и все с транзакцией по умолчанию


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
YuG
Дата 18.5.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



Да, Hypersonic, по умолчанию.

Есть ли другие способы решения?
Дело в том, что на одном сервере могут быть несколько приложений, каждое из которых работает со своей собственной базой, и каждое из которых работает с таймерами? Поэтому создать все таблицы менеджмента JBOSS в собственной базе в таком случае невозможно.


PM WWW ICQ Skype   Вверх
MisterCleric
Дата 18.5.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Тогда крути другие способы. Хотя я не представляю, как у заказчика будет стоять такой JBOSS, на котором работает несколько разных по бизнесу приложений. Такие приложения должны стоять на разных JBOSS. У меня практика поставлять один AS под одно приложение. Один JBOSS - это одна java-машина. Не сильно ли напряжно для нее выполнять в одно и тоже время разные EE-приложения? А если они еще у тебя и вэбовские? Надо ж не забывать, то у tomcat тоже ж ресурсы ограничены... 
JBOSS - он же бесплатный, зачем экономить на инстансах для каждого приложения?


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
MisterCleric
Дата 18.5.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Слушай, еще могу предложить такое:
в *-service.xml, который отвечает за TimerService, ну в общем найдешь по моему примеру, который будет следовать дальше

Код

<!-- A persistence policy that does not persist the timer -->
<mbean code="org.jboss.ejb.txtimer.NoopPersistencePolicy" name="jboss.ejb:service=EJBTimerService,persistencePolicy=noop"/>
<!-- An EJB Timer Service that is Tx aware -->
  <mbean code="org.jboss.ejb.txtimer.EJBTimerServiceImpl"
    name="jboss.ejb:service=EJBTimerService">
    <attribute name="TimerIdGeneratorClassName">org.jboss.ejb.txtimer.BigIntegerTimerIdGenerator</attribute>
    <attribute name="TimedObjectInvokerClassName">org.jboss.ejb.txtimer.TimedObjectInvokerImpl</attribute>
    <depends optional-attribute-name="RetryPolicy">jboss.ejb:service=EJBTimerService,retryPolicy=fixedDelay</depends>
    <!--<depends optional-attribute-name="PersistencePolicy">jboss.ejb:service=EJBTimerService,persistencePolicy=database</depends>-->
    <depends optional-attribute-name="PersistencePolicy">jboss.ejb:service=EJBTimerService,persistencePolicy=noop</depends>
    <depends optional-attribute-name="TransactionManagerFactory" proxy-type="org.jboss.tm.TransactionManagerFactory">
      jboss:service=TransactionManager
    </depends>    
  </mbean>


мне такое понадобилось, когда разворачивал свое приложение в кластере. И если я сохранял таймеры в базу, то при старте второго нода срабатыва метод timeout, что естественно по логике приложения не должно было быть. и того меня политика "несохранения таймеров" спасла.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
YuG
Дата 18.5.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



Не удалось мне добиться этого на MySQL, а вот на Postgres заработало сразу и без проблем

Это сообщение отредактировал(а) YuG - 18.5.2009, 17:42
PM WWW ICQ Skype   Вверх
MisterCleric
Дата 18.5.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Нашел вот такое решение по MySQL:
BUG


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1310 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.