Hii

Can anyone help to run my first' code in struts2
My code is perfect but it's not working properly i don't know why


HITESH jaiswar

On 13-Oct-2022 12:56 pm, Lukasz Lenart <lukaszlen...@apache.org> wrote:
You must only re-implement OpenSessionBackgroundProcess as follow:

public class OpenSessionBackgroundProcess extends StrutsBackgroundProcess {

    private final EntityManagerFactory entityManagerFactory;

    // used for synchronization
    private final Object lock = new Object();

    public OpenSessionBackgroundProcess(String name, ActionInvocation
invocation, int threadPriority, EntityManagerFactory
entityManagerFactory) {
        super(invocation, name, threadPriority);
        this.entityManagerFactory = entityManagerFactory;
    }

    protected void beforeInvocation() throws Exception {
        synchronized (lock) {
            EntityManager em = entityManagerFactory.createEntityManager();
            TransactionSynchronizationManager.bindResource(entityManagerFactory,
new EntityManagerHolder(em));
            super.beforeInvocation();
        }
    }

    protected void afterInvocation() throws Exception {
        synchronized (lock) {
            super.afterInvocation();
            EntityManagerHolder emHolder = (EntityManagerHolder)
TransactionSynchronizationManager.unbindResource(entityManagerFactory);
            
EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager());
        }
    }

}

I would assume even the lock is not needed but I have no way to test
it. And if you could test 6.1.0-SNAPSHOT with this I would be very
thankful :)
I want to release 6.1.0 ASAP but I would like also resolve the problem
you have reported with includeParams="all'


Cheers
Łukasz


śr., 5 paź 2022 o 15:48 Burton Rhodes <burtonrho...@gmail.com> napisał(a):
>
> Wow - very cool. When do you think this patch will be released? And
> would you be able to provide a brief code snippet of how to use/extend
> this new class? My current setup is below which uses an
> ExecuteAndWaitInterceptor to create a class that extends the
> BackgroundProcess class.
>
> Again thanks for all your work on this.
>
>
> @Component
> public class OpenSessionExecuteAndWaitInterceptor extends
> ExecuteAndWaitInterceptor {
>
>      @Autowired
>      private transient EntityManagerFactory entityManagerFactory;
>
>      @Override
>      protected BackgroundProcess getNewBackgroundProcess(String arg0,
> ActionInvocation arg1, int arg2) {
>          return new OpenSessionBackgroundProcess(arg0, arg1, arg2,
> entityManagerFactory);
>      }
> }
>
>
> public class OpenSessionBackgroundProcess extends BackgroundProcess
> implements Serializable {
>
>      private static final long serialVersionUID = 1L;
>
>      private final transient EntityManagerFactory entityManagerFactory;
>
>      // used for synchronization
>      protected boolean initializationComplete;
>      private transient Object lock = new Object();
>
>      public OpenSessionBackgroundProcess(String name, ActionInvocation
> invocation, int threadPriority, EntityManagerFactory
> entityManagerFactory) {
>          super(name, invocation, threadPriority);
>          this.entityManagerFactory = entityManagerFactory;
>          initializationComplete = true;
>          synchronized (lock) {
>              lock.notify();
>          }
>      }
>
>      protected void beforeInvocation() throws Exception {
>          while (!initializationComplete) {
>              try {
>                  synchronized (lock) {
>                      lock.wait(100);
>                  }
>              } catch (InterruptedException e) {
>                  // behavior ignores cause of re-awakening.
>              }
>          }
>          EntityManager em = entityManagerFactory.createEntityManager();
>
> TransactionSynchronizationManager.bindResource(entityManagerFactory, new
> EntityManagerHolder(em));
>          super.beforeInvocation();
>      }
>
>      protected void afterInvocation() throws Exception {
>          super.afterInvocation();
>          EntityManagerHolder emHolder = (EntityManagerHolder)
>
> TransactionSynchronizationManager.unbindResource(entityManagerFactory);
>
> EntityManagerFactoryUtils.closeEntityManager(emHolder.getEntityManager());
>      }
>
>      /**
>       * Override default readObject() method when deserializing
>       *
>       * @param serialized the serialized object
>       */
>      private void readObject(ObjectInputStream serialized) throws
> IOException, ClassNotFoundException {
>          serialized.defaultReadObject();
>          lock = new Object();
>      }
> }
>
> ------ Original Message ------
> From "Lukasz Lenart" <lukaszlen...@apache.org>
> To "Struts Users Mailing List" <user@struts.apache.org>
> Date 10/5/2022 2:12:20 AM
> Subject Re: Race condition in recommended "OpenSessionBackProccess"
> class
>
> >I refactored the BackgroundProcess and it should solve your problem,
> >yet it will require some coding.
> >https://github.com/apache/struts/pull/609
> >
> >niedz., 2 paź 2022 o 13:09 Lukasz Lenart <lukaszlen...@apache.org> 
> >napisał(a):
> >>
> >>śr., 28 wrz 2022 o 16:15 Burton Rhodes <burtonrho...@gmail.com> napisał(a):
> >> >
> >> > Lukasz -
> >> > I have queried you on this before, but I am trying to get to the bottom 
> >> > of
> >> > why the class Dale Newfield recommended (many years ago) to solve the 
> >> > Open
> >> > Session during ExecuteAndWait problem gives me issues from time to time
> >> > [1]. Recently (as our user base grows) I am getting NPEs more and more on
> >> > the synchronized "lock" variable. I posed the question to StackExchange
> >> > [2], and one contributor suggested there is a race condition by extending
> >> > the BackgroundProcess class.
> >> >
> >> > Full disclosure, this kind of problem starts to get over my head, so I am
> >> > wondering if you might have some guidance on how I can once and for all 
> >> > fix
> >> > this issue.
> >> >
> >> > As always, thanks in advance.
> >> >
> >> > [1]
> >> > https://cwiki.apache.org/confluence/display/WW/HibernateAndSpringEnabledExecuteAndWaitInterceptor
> >> >
> >> > [2]
> >> > https://stackoverflow.com/questions/73858251/how-to-properly-use-a-lock-variable-for-synchronization-in-a-serializable-clas?noredirect=1#comment130421653_73858251
> >>
> >>As far as I understand the answer on SO, we must change how the
> >>BackgroundProcess is initialised - instead of using a constructor
> >>based logic, move it into a method or so.
> >>Would you mind registering a ticket in JIRA with the above description?
> >>
> >>
> >>Regards
> >>--
> >>Łukasz
> >>+ 48 606 323 122 http://www.lenart.org.pl/
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> >For additional commands, e-mail: user-h...@struts.apache.org
> >

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org


Reply via email to