32
Managing State with JBoss Seam Richmond Java Users Group February 2007 Chris Wash

Managing State With JBoss Seam

Embed Size (px)

DESCRIPTION

Introduction to JBoss Seam and state management problems in Java-based web applications.

Citation preview

Page 1: Managing State With JBoss Seam

Managing State with JBoss SeamRichmond Java Users GroupFebruary 2007Chris Wash

Page 2: Managing State With JBoss Seam

Agenda

� What are the problems in managing state?� How do they manifest themselves?� Why is managing state so difficult?� How would you solve them on your own?� How could a framework help?

� What is Seam? � How does Seam manage state?� How does Seam compare to other stateful frameworks?� What is seam-gen?

Page 3: Managing State With JBoss Seam

What is conversational state?

� State is the data involved at any point during process execution.

� Think of instance variables storing data over different instance method calls.

� Some processes cannot exist in a single request/response lifecycle, but need to be thought of as a conversation.

� A process is either stateful or not!� Some occur over a period of time, or take a while to complete.� Some cannot be completed in just one step.� Some involve complex interactions with other pieces of the

system.

Page 4: Managing State With JBoss Seam

How Healthy Is Your State Management?

� Ever had problems with...?� The back button� New browser windows or tabs

� General data inconsistencies � Stale data in pageflows� Database� Logs

Page 5: Managing State With JBoss Seam

Symptoms

Session bloat

Concurrency Issues

Improperly handling Redundant Posts

Heartburn from Multiple Windows/Tabs

Page 6: Managing State With JBoss Seam

Session Bloat

� HttpSession attributes are an easy way to store state data between requests

� There is no mechanism to clean data from the Session� Early in development, this may not be a problem. � Late in development, this will be a problem!

Page 7: Managing State With JBoss Seam

Concurrency Issues

� Conflicts over editing objects, session attributes, etc.� Think of two clients trying to edit the same object

concurrently, e.g. Version Control� AJAX finer-grained requests can cause more problems

Page 8: Managing State With JBoss Seam

The Redundant Posts Problem

� Consider a client issuing multiple posts� Common DoS vulnerability� Javascript form.submit() from an onclick event handler� Clicking the “Back” and resubmitting a form� What if this submitted a payment? Is it ever acceptable

to submit redundant payments?

Page 9: Managing State With JBoss Seam

The Multiple Browser Windows Problem

� Using session scoped attributes to store state between requests is dangerous

� A new browser window hijack the state of the previous browser window

� Two browser windows doing different things with the same session attribute is bad!

Page 10: Managing State With JBoss Seam

Treating the symptoms vs. Curing the disease

� Some of our treatment options are useful, but can’t we get a little help from a framework?

� Problem space is purely technical in nature� Time spent solving these problems is NOT time well-

spent to a paying business customer� Any proactive approach will pay for itself in savings later� Worst case, you can’t use a framework to help you –

let’s explore treatment options

Page 11: Managing State With JBoss Seam

Treating Session Bloat

� Without proper state management, most applications develop session bloat.

� Hard to replicate/reproduce – even harder to solve� Only option is to reduce the session’s size

� Really points to a lack of conversation

Page 12: Managing State With JBoss Seam

Treating Concurrency Problems

� Clients’ changes conflict – which one wins?� Higher probability of conflict when transactions span

multiple requests� Follow Martin Fowler’s Offline-Locking Patterns

� Pessimistic Offline-Locking – Lock/Wait� Assumes conflicts are common� Not desirable from a performance perspective!

� Optimistic Offline-Locking – Copy, Edit, Merge� Assumes conflicts are rare� More conflicts = more merges� User experience tradeoff

Page 13: Managing State With JBoss Seam

Treating Redundant Posts

� Javascript solutions are not the way to go!� Use the Synchronizer Token pattern� For sensitive data submission, use the Redirect After

Post pattern� Can’t return a 200/OK -- the browser will cache the Post!

Page 14: Managing State With JBoss Seam

Treating Multiple Window Heartburn

� We need the concept of a workspace� Organizes tasks and what data they are operating on� Prefix or suffix on session attributes� State machine to tell which actions are valid

� This is not easy to implement on your own!

Page 15: Managing State With JBoss Seam

Why are these problems so hard to solve?

� The technologies we use were not designed to handle stateful web applications

� HTTP is a connectionless, stateless protocol� Session IDs/Cookies

� Large numbers of clients arriving/leaving unexpectedly� The browser navigation model aggravates concurrency and

synchronization issues� AJAX techniques make state management harder� Most MVC frameworks don’t address these problems

� The diagnosis – current frameworks lack features to manage conversational state

Page 16: Managing State With JBoss Seam

Where do we need a framework’s help?

� The concept of a conversation.� Scopes conversational state rather than storing state in session

attributes� Provides more transaction-oriented features like freeing

resources when complete

� Managing pageflows� Handling starting new conversations when:

� A conversation doesn’t exist� A new browser window opens

Page 17: Managing State With JBoss Seam

Seam Cures State Management Problems!

� What is it?� Java EE 5 “Meta” framework� Gavin King’s new brainchild� Stitches together new Java EE 5 Specs

� JSR 127 - JSF� Sychronizer Token is baked in� You can specify a redirect on a JSF Navigation Rule

� JSR 220 - EJB 3.0� Makes development much easier

� Seam gives you constructs to properly manage state “out of the box”

� Takes heed of lightweight principles

Page 18: Managing State With JBoss Seam

� Seam exposes a richer context model� Two more contexts added to Servlet API contexts

� Seam Components� Annotated POJO that encapsulates state data� Have a specific lifetime by binding to a context

Seam’s Approach

Paymentfloat amount

Seam Component

Seam Conversation Context

@Name(“payment”)@Scope(CONVERSATION)

context variable “payment”

#{payment.amount}

Page 19: Managing State With JBoss Seam

Seam Components

� Add a few Seam annotations to your POJO� You have a Seam component!

� Access it in JSF� Use it in jBPM� Bind it to a context� PDF/Email generation

� Use EJB3/JPA annotations on your POJO� Or write your own!

� Atomic unit for state management

Page 20: Managing State With JBoss Seam

Let’s take a peek at a Seam component

� ... and jump over to Eclipse

Page 21: Managing State With JBoss Seam

Uniform, POJO Based Component Model

� Container Managed Services� Transaction/security management� Persistence Context management

� Annotated POJOs� Inherently unit testable/injectable� No need for separate domain/presentation components� Annotations!

� Minimize XML configuration� No JSF Managed Beans!� “Configuration by exception”� Clean DI metadata

� Drastically reduces the amount of configuration overhead

Page 22: Managing State With JBoss Seam

Bind Components to Contexts

� @Scope binds your component to a context� Method level annotations control your process

� @Begin starts a process (conversation, process)� @End ends process associated with the current

thread

Page 23: Managing State With JBoss Seam

Seam Contexts

� (Stateless)� Event� Page� Conversation� Session� Business process� Application

Context Search Order

Page 24: Managing State With JBoss Seam

Seam’s Conversation Context

� Melding of three concepts/scenarios:� Implementing the idea of a “workspace” in Struts� “Application Transaction with Optimistic Semantics”� Providing a construct for executing a “workflow task”

� Abstracts the difficulty in managing state� Provides more powerful mechanisms than simple “get/

set”� Integration of JSF and jBPM event handling mechanisms� “Bijection” of components (more in a minute)

Page 25: Managing State With JBoss Seam

Conversations, continued

� Most useful for tasks that span multiple requests� Each request is bound to a temporary conversation

When spanning multiple requests, a conversation is “promoted” to long-running with @BeginEach conversation executes serially as its requests arrive

� Use a SFSB and bind to conversation scope� Conversations may be nested� Discrete life span (will timeout)� Configuration change can store state on the client side

Page 26: Managing State With JBoss Seam

Keeping track of conversations

� You’ll notice a cid request parameter� Seam tacks this on and keeps track of it� Needed to implement workspace functionality � Allows for conversations happening in different tabs/

windows to work in isolation� Helps Seam handle starting, stalling, restarting, nesting

any long-running conversation

Page 27: Managing State With JBoss Seam

Bijection

� Dependency injection works great for stateless components, but Seam focuses on stateful components

� Essentially we need an aliasing mechanism from context variables to instance variables on components

� Wires components together� Dramatically cleans your action code

� No more getAttribute() calls at the beginning� No more setAttribute() calls at the end

Page 28: Managing State With JBoss Seam

Bijection

� Seam’s bijection allows stateful components to be:� Contextual - wider contexts can reach into narrower contexts to

assemble stateful components� Bidirectional

� Context variables can be injected into component instance variables

� You can “outject” your instance variables back into context variables

� Dynamic - occurs on every invocation of a component!

� Just remember two annotations: @In and @Out

Page 29: Managing State With JBoss Seam

Hey! You forgot about Concurrency!

� Conversations run serially per request� Optimistic Locking is pretty trivial to add with Seam

� This isn’t really a Seam feature, it’s a JPA feature

� Add @Version or @Timestamp to a property on your component that needs concurrent access

� If someone changes it “underneath” you (ticks the timestamp or version column in the database) then a OptimisticLockException is thrown.

� Catch and direct to an appropriate “merge” page.� You can add optimistic locking easily to any EJB

managed transaction as well.

Page 30: Managing State With JBoss Seam

Comparisons to other WASM frameworks

� BEA/Beehive Pageflow Controllers� Current state of the pageflow lives in a session attribute� Only one can be active at a time (no multiple browser support!)� Can be nested, but rules are different� Can be “longLived”, but lives the full length of your session

� Spring Pageflow� Only true rival to Seam in terms of conversational state

management� Planned to be a plug-in integration to Struts 2.0/Spring MVC

� Other frameworks assume you know all of this stuff, and how to handle it the right way on your own!

� Seam guides you toward proper usage

Page 31: Managing State With JBoss Seam

Other Features

� We’ve only seen the tip of the iceberg� EL/Annotations are a powerful 1-2 combo!

� JSF Presentation� iText PDF Generation� Email Templates� Log Statements

� jBPM - Business Process� jPDL - Pageflow� AJAX/Remoting Layer� Security� Lots of cool integration work still going on

� Support on major application servers

Page 32: Managing State With JBoss Seam

Extras

� Helpful Links� Seam Wiki Home - http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossSeam� Seam Home - http://www.jboss.com/products/seam� Seam Docs - http://docs.jboss.com/seam/latest/reference/en/html/index.html� Seam Forum - http://jboss.com/index.html?module=bb&op=viewforum&f=231� JPA - http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html

� References and Further Reading� Synchronizer Token -

� http://www.javaworld.com/javaworld/javatips/jw-javatip136.html� Redirect After Post -

� http://www.theserverside.com/tt/articles/article.tss?l=RedirectAfterPost� Optimistic Offline Lock -

� http://www.martinfowler.com/eaaCatalog/optimisticOfflineLock.html� Pessimistic Offline Lock -

� http://www.martinfowler.com/eaaCatalog/pessimisticOfflineLock.html