Details

    • Type: Bug
    • Status: Open (View Workflow)
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: 3.0.0.Alpha2
    • Component/s: None
    • Labels:
      None
    • Steps to Reproduce:
      Hide

      Redeploy a webapp which uses Seam Cron to JBoss AS 6 using Eclipse's fast redeployment.

      Show
      Redeploy a webapp which uses Seam Cron to JBoss AS 6 using Eclipse's fast redeployment.

      Description

      Diablo-D3 gets it on every redeployment (from Eclipse to JBoss AS 6) and I have seen it once (using NetBeans redeploying after sitting overnight). The sumptom is the 'Singleton is not set' error.

      In a conversation about this Stuart Douglas explained how I can solve this:

      (04:42:51 PM) stuartdouglas: something that did just occur to me is that weld will probably not work very well in this new thread anyway, unless you set the TCCL to the correct one
      (04:43:07 PM) PeteRoyle: TCCL?
      (04:43:16 PM) stuartdouglas: Thread Context Class Loader
      (04:43:28 PM) stuartdouglas: weld uses it a lot, even for stuff that should not need it to be set
      (04:43:51 PM) stuartdouglas: so if it is not set you end up with highly informative 'Singleton is not set' errors
      (04:44:30 PM) PeteRoyle: Ahah! I've been getting those sporadically on redeployment
      (04:44:45 PM) PeteRoyle: But to do with scheduling, not asynch
      (04:44:49 PM) PeteRoyle: (so far)
      (04:45:20 PM) stuartdouglas: those are pretty much always due to the wrong class loader being set as the TCCL
      (04:45:54 PM) stuartdouglas: also the only beans that will be accessible is @ApplicationScoped and @Dependant
      (04:46:10 PM) stuartdouglas: unless you put in some non-portable code to set up the contexts
      (04:46:11 PM) PeteRoyle: Is there a typical cure for that which doesn
      (04:46:29 PM) PeteRoyle: ''t require knowledge of how classloading works?
      (04:47:34 PM) stuartdouglas: not really, it depends where you get the errors, it should only be a problem when you start trying to use threads that you have spawned yourself to interact with weld
      (04:48:31 PM) stuartdouglas: for @Async the solution is to set the TCCL to the same as the original threads TCCL, and set it back in a finally block
      (04:49:11 PM) stuartdouglas: and it should really be run as a PriviliedAction, because a security manager might not let you set it
      (04:50:22 PM) marekn [~mnovotny@nat/redhat/x-wgsrrhabedyogdbb] entered the room.
      (04:50:39 PM) PeteRoyle: I get what you're saying, but I'm not sure how to do that stuff
      (04:50:54 PM) PeteRoyle: (setting the TCCL and running as PrivAction)
      (04:51:57 PM) stuartdouglas: https://github.com/stuartwdouglas/jboss-as/blob/master/weld/src/main/java/org/jboss/as/weld/WeldContainer.java#L77
      (04:52:11 PM) stuartdouglas: https://github.com/stuartwdouglas/jboss-as/blob/master/weld/src/main/java/org/jboss/as/weld/SecurityActions.java
      (04:52:43 PM) stuartdouglas: note that SecurityActions is package private, otherwise any class can use it to set the TCCL
      (04:53:42 PM) stuartdouglas: basically it just wraps Thread.currentThread().set/getContextClassLoader
      (04:54:38 PM) PeteRoyle: Should I copy this code into Cron, (or Solder) to make it portable?
      (04:55:09 PM) stuartdouglas: it needs to be copied each time
      (04:55:38 PM) stuartdouglas: otherwise any code can get/set the TCCL
      (04:56:02 PM) kevinpollet [~kevinpoll@217.112.54.72] entered the room.
      (04:56:56 PM) PeteRoyle: OK so do I set the TCCL as the first thing in the new thread?
      (04:56:59 PM) amitev [~amitev@212.25.36.84] entered the room.
      (04:57:06 PM) stuartdouglas: yes
      (04:57:11 PM) PeteRoyle: (frm within the thread, say inside the run() method)?
      (04:57:17 PM) stuartdouglas: yes
      (04:57:34 PM) PeteRoyle: and unset it from a finally block from the original thread which screate the new thread
      (04:57:52 PM) PeteRoyle: screate=created
      (04:58:21 PM) stuartdouglas: yes, although you can just set it to null rather than saving and restoring the existing TCCL
      (04:59:01 PM) stuartdouglas: otherwise if you are using a thread pool the TCCL can hang around after redeployment, which results in a memory leak
      (04:59:47 PM) PeteRoyle: actually it looks like all the examples in WeldContainer do both those things in the same thread. Can I unset the TCCL at the end of the run() method (in a finally)?
      (04:59:58 PM) maschmid [~maschmid@nat/redhat/x-fjnivohxvbmhnpfw] entered the room.
      (05:00:00 PM) stuartdouglas: yes
      (05:00:06 PM) PeteRoyle: ok
      (05:00:33 PM) stuartdouglas: oops, sorry, I mis-read your earlier question
      (05:00:50 PM) stuartdouglas: you should only manipulate it inside the run method
      (05:00:57 PM) PeteRoyle: ok gotchya

        Gliffy Diagrams

          Activity

          Hide
          peteroyle Peter Royle added a comment -

          Update: The issue was more likely being caused by the fact that the schedulers weren't being shut down in Weld and were trying to fire in the background with absolutely no context available to them. Having solved that (SEAMCRON-23) this issue seems to not show up anymore. I will still apply the concepts Stuart described, but will put them off until Alpha2 while we see how Alpha1 behaves without it.

          Show
          peteroyle Peter Royle added a comment - Update: The issue was more likely being caused by the fact that the schedulers weren't being shut down in Weld and were trying to fire in the background with absolutely no context available to them. Having solved that ( SEAMCRON-23 ) this issue seems to not show up anymore. I will still apply the concepts Stuart described, but will put them off until Alpha2 while we see how Alpha1 behaves without it.
          Hide
          peteroyle Peter Royle added a comment -

          Postponed until Alpha2 since SEAMCRON-23 appears to have addressed the symptoms at the very least.

          Show
          peteroyle Peter Royle added a comment - Postponed until Alpha2 since SEAMCRON-23 appears to have addressed the symptoms at the very least.
          Hide
          cosmostunes Tom Tester added a comment - - edited

          I use currently the latest Seam Cron SNAPSHOT and getting on jboss as 7 while shutdown:

          14:39:12,107 ERROR [org.jboss.weld.Bootstrap] (MSC service thread 1-7) Exception(s) thrown during observer of BeforeShutdown
          14:39:12,107 ERROR [org.jboss.weld.Bootstrap] (MSC service thread 1-7) : java.lang.IllegalStateException: Singleton not set for ModuleClassLoader for Module "deployment.test.war:main" from Service Module Loader
          at org.jboss.as.weld.services.ModuleGroupSingletonProvider$TCCLSingleton.get(ModuleGroupSingletonProvider.java:71) [jboss-as-weld-7.0.1.Final.jar:7.0.1.Final]
          at org.jboss.weld.context.AbstractSharedContext.getBeanStore(AbstractSharedContext.java:54) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:94) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:693) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:264) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:234) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:88) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.weld.bootstrap.events.BeforeShutdownImpl.fire(BeforeShutdownImpl.java:62) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.weld.bootstrap.events.BeforeShutdownImpl.fire(BeforeShutdownImpl.java:50) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.weld.bootstrap.WeldBootstrap.shutdown(WeldBootstrap.java:499) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
          at org.jboss.as.weld.WeldContainer.stop(WeldContainer.java:102) [jboss-as-weld-7.0.1.Final.jar:7.0.1.Final]
          at org.jboss.as.weld.services.WeldService.stop(WeldService.java:103) [jboss-as-weld-7.0.1.Final.jar:7.0.1.Final]
          at org.jboss.msc.service.ServiceControllerImpl$StopTask.run(ServiceControllerImpl.java:1869)
          at org.jboss.msc.service.ServiceControllerImpl$ClearTCCLTask.run(ServiceControllerImpl.java:2291)
          at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [:1.6.0_21]
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [:1.6.0_21]
          at java.lang.Thread.run(Thread.java:619) [:1.6.0_21]

          Show
          cosmostunes Tom Tester added a comment - - edited I use currently the latest Seam Cron SNAPSHOT and getting on jboss as 7 while shutdown: 14:39:12,107 ERROR [org.jboss.weld.Bootstrap] (MSC service thread 1-7) Exception(s) thrown during observer of BeforeShutdown 14:39:12,107 ERROR [org.jboss.weld.Bootstrap] (MSC service thread 1-7) : java.lang.IllegalStateException: Singleton not set for ModuleClassLoader for Module "deployment.test.war:main" from Service Module Loader at org.jboss.as.weld.services.ModuleGroupSingletonProvider$TCCLSingleton.get(ModuleGroupSingletonProvider.java:71) [jboss-as-weld-7.0.1.Final.jar:7.0.1.Final] at org.jboss.weld.context.AbstractSharedContext.getBeanStore(AbstractSharedContext.java:54) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:94) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:693) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:264) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:234) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:88) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.bootstrap.events.BeforeShutdownImpl.fire(BeforeShutdownImpl.java:62) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.bootstrap.events.BeforeShutdownImpl.fire(BeforeShutdownImpl.java:50) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.weld.bootstrap.WeldBootstrap.shutdown(WeldBootstrap.java:499) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] at org.jboss.as.weld.WeldContainer.stop(WeldContainer.java:102) [jboss-as-weld-7.0.1.Final.jar:7.0.1.Final] at org.jboss.as.weld.services.WeldService.stop(WeldService.java:103) [jboss-as-weld-7.0.1.Final.jar:7.0.1.Final] at org.jboss.msc.service.ServiceControllerImpl$StopTask.run(ServiceControllerImpl.java:1869) at org.jboss.msc.service.ServiceControllerImpl$ClearTCCLTask.run(ServiceControllerImpl.java:2291) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [:1.6.0_21] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [:1.6.0_21] at java.lang.Thread.run(Thread.java:619) [:1.6.0_21]

            People

            • Assignee:
              peteroyle Peter Royle
              Reporter:
              peteroyle Peter Royle
            • Votes:
              1 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated:

                Development