we are running a JavaEE 6 Environment with EclipseLink and JBoss Weld. For the EntityManager, we currently are using the @ConversationScoped scope and it works very well for the JSF interactions.
We now want to include a @Schedule method for some automated checking of data (check for deadlines etc.). However, i don't know whether this is even possible, as the automated call doesn't seem to create a conversation. This is currently our approach:
@Stateless
public class Scheduler
@Inject
private CampaignService campaignService;
// CampaignService is @ApplicationScoped and uses an EntityManager
@Schedule(second="*/3", ...)
public void checkDeadlines(){
campaignService.getAll() // fetches all campaigns from EntityManager
...
}
}
However, the injection does not work as long as the EntityManager is @ConversationScoped. (ContextNotActiveException)
Is there a possibility to "create" a conversation other than by calling some JSF? Or is the only possibility creating a custom scope, as in How to use CDI-@SessionScoped without a http-session?
If you're going to be using schedulers your best solution is to use @PersistenceContext to get an EntityManager. The other option is to not use a conversation scoped entitymanager (which should be considered bad practice anyway), and use a default scoped or request scoped entitymanager.
I say a conversation scoped entitymanager is bad practice because it can easily lead to lazy initialization issues, detached entities and memory leaks.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With