Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

Overview

...

float:

...

right;

...

margin-left:

...

20px;

...

INLINE

<object width="400"

...

height="250"><param

...

name="movie"

...

value="http://www.youtube.com/v/9JqxbfzsWOQ?fs=1&amp;hl=en_US&amp;rel=0"></param><param

...

name="allowFullScreen"

...

value="true"></param><param

...

name="allowscriptaccess"

...

value="always"></param><embed

...

src="http://www.youtube.com/v/9JqxbfzsWOQ?fs=1&amp;hl=en_US&amp;rel=0"

...

type="application/x-shockwave-flash"

...

allowscriptaccess="always"

...

allowfullscreen="true"

...

width="400"

...

height="250"></embed></object>

...

This example shows how to create a Stateful session EJB using annotations.

A Stateful session bean is a session bean whose instances can maintain the conversational state with the client. The conversational state of the stateful session bean, which describes the conversation between a specific client and a session bean, is contained in the fields of the stateful session bean.

Simply put, when you create a stateful bean an actual instance is created by the container and dedicated to you and only you. Every call you make will go to your instance. Further, your instance will not be shared with anyone unless you give them a reference to your stateful bean. The instance will last until you remove it or until it times-out and is removed by the container.

With EJB 3.0, it's now possible to write stateful session bean without specifying a deployment descriptor; you basically have to write just a remote or local business interface, which is a plain-old-java-interface,

...

annotated

...

with

...

the

...

@Remote

...

or

...

@Local

...

annotation

...

the

...

stateful

...

session

...

bean

...

implementation,

...

a

...

plain-old-java-object

...

which

...

implements

...

the

...

remote

...

or

...

the

...

local

...

business

...

interface

...

and

...

is

...

annotated

...

with

...

the

...

@Stateful

...

annotation

...

This

...

example

...

is

...

the

...

"simple-stateful"

...

example

...

located

...

in

...

the

...

openejb-examples.zip

...

available

...

on

...

the

...

download

...

page.

...

...

The Code

In this example we develop a simple counter stateful session EJB. Every stateful session bean implementation must be annotated using the annotation @Stateful or marked that way in the ejb-jar.xml

...

file.

...

Bean

...

In

...

EJB

...

3.0

...

session

...

beans

...

do

...

not

...

need

...

to

...

implement

...

the

...

javax.ejb.SessionBean

...

interface.

...

You

...

can

...

simply

...

annotate

...

it

...

as

...

@Stateful

...

if

...

you

...

want

...

it

...

to

...

be

...

a

...

stateful

...

session

...

bean.

...

Users

...

of

...

EJB

...

2.x

...

may

...

notice

...

the

...

bean

...

actually

...

implements

...

the

...

business

...

interfaces!

...

In

...

the

...

prior

...

version

...

of

...

EJB

...

implementing

...

the

...

remote

...

interface

...

(which

...

derives

...

from

...

javax.ejb.EJBObject)

...

in

...

your

...

bean

...

was

...

just

...

not

...

allowed.

...

Now

...

there

...

is

...

no

...

javax.ejb.EJBObject

...

requirement,

...

so

...

implementing

...

the

...

business

...

interfaces

...

is

...

standard

...

practice

...

for

...

EJB

...

3.0.

...

Local

...

business

...

interface

...

...

Local

...

interfaces

...

in

...

EJB

...

are

...

pass-by-reference

...

interfaces.

...

Meaning

...

that

...

normal

...

java

...

semantics

...

are

...

used

...

for

...

passing

...

arguments,

...

return

...

values

...

and

...

exceptions.

...

A

...

business

...

local

...

interface

...

can

...

be

...

any

...

plain

...

java

...

interface.

...

There

...

are

...

no

...

restrictions

...

on

...

the

...

method

...

arguments,

...

return

...

types,

...

or

...

throws

...

clauses.

...

Unless

...

specified

...

otherwise,

...

every

...

interface

...

your

...

bean

...

implements

...

(and

...

it's

...

parent

...

class

...

implements

...

and

...

so

...

on)

...

is

...

considered

...

to

...

be

...

a

...

local

...

business

...

interface.

...

You

...

can

...

use

...

the

...

@Local

...

annotation

...

to

...

explicitly

...

state

...

that

...

an

...

interface

...

is

...

a

...

local

...

interface,

...

but

...

this

...

is

...

not

...

required.

...

You'll

...

notice

...

that

...

in

...

EJB

...

3.0

...

the

...

Local

...

Business

...

Interface

...

of

...

a

...

stateless

...

session

...

bean

...

does

...

not

...

need

...

to

...

extend

...

from

...

javax.ejb.EJBLocalObject

...

and

...

does

...

not

...

need

...

a

...

javax.ejb.EJBLocalHome

...

interface

...

as

...

they

...

did

...

in

...

EJB

...

2.x

...

and

...

prior.

...

Per

...

the

...

vocabulary

...

of

...

the

...

EJB

...

spec,

...

interfaces

...

that

...

implement

...

javax.ejb.EJBLocalObject

...

or

...

javax.ejb.EJBLocalHome

...

are

...

considered

...

Component

...

Interfaces

...

and

...

the

...

plain

...

java

...

interface

...

above

...

is

...

considered

...

a

...

Business

...

Interface.

...

Remote

...

business

...

interface

...

...

Remote

...

interfaces

...

are

...

pass-by-value

...

interfaces.

...

Meaning

...

that

...

all

...

method

...

parameters,

...

return

...

values,

...

and

...

exceptions

...

are

...

serialized

...

on

...

every

...

call.

...

The

...

result

...

is

...

that

...

you

...

get

...

a

...

copy

...

of

...

the

...

original

...

object

...

and

...

not

...

the

...

original

...

object.

...

The

...

advantage

...

is

...

of

...

course

...

that

...

Remote

...

interfaces

...

can

...

be

...

used

...

to

...

invoke

...

an

...

EJB

...

across

...

a

...

network

...

in

...

a

...

client-server

...

fashion.

...

There

...

are

...

no

...

restrictions

...

on

...

the

...

Remote

...

interface

...

itself,

...

but

...

there

...

are

...

on

...

the

...

data

...

passed

...

in

...

and

...

out

...

of

...

the

...

remote

...

interface.

...

The

...

values

...

passed

...

into

...

a

...

method

...

or

...

returned

...

from

...

a

...

method

...

of

...

a

...

Remote

...

interface

...

must

...

be

...

serializable

...

.

...

It

...

is

...

fine

...

for

...

the

...

method

...

signature

...

to

...

be,

...

for

...

example,

...

"public

...

Object

...

myMethod(Object

...

myParam)"

...

as

...

long

...

as

...

the

...

value

...

passed

...

in

...

and

...

returned

...

implements

...

java.io.Serializable

...

.

...

As

...

stated

...

above,

...

the

...

Remote

...

Business

...

Interface

...

of

...

a

...

bean

...

can

...

be

...

any

...

plain

...

old

...

interface.

...

It

...

does

...

not

...

need

...

to

...

extend

...

javax.ejb.EJBObject,

...

it

...

does

...

not

...

need

...

a

...

javax.ejb.EJBHome,

...

the

...

methods

...

do

...

not

...

need

...

to

...

throw

...

javax.rmi.RemoteException,

...

and

...

the

...

bean

...

class

...

can

...

implement

...

it!

...

At

...

minimum

...

the

...

interface

...

must

...

be

...

annotated

...

with

...

@Remote

...

either

...

in

...

the

...

interface

...

itself

...

or

...

in

...

the

...

bean

...

class,

...

or

...

the

...

interface

...

must

...

be

...

declared

...

via

...

<business-remote>

...

in

...

the

...

ejb-jar.xml.

...

Writing

...

a

...

unit

...

test

...

for

...

the

...

example

...

Writing

...

an

...

unit

...

test

...

for

...

the

...

stateful

...

session

...

EJB

...

is

...

quite

...

simple.

...

We

...

need

...

just

...

to

...

write

...

a

...

setup

...

method

...

to

...

create

...

and

...

initialize

...

the

...

InitialContext,

...

and

...

then

...

write

...

our

...

test

...

methods

...

setUp

...

Test

...

the

...

local

...

business

...

interface

...

...

Test

...

the

...

remote

...

business

...

interface

...

...

Note

...

that

...

JNDI

...

names

...

for

...

Java

...

SE

...

clients

...

are

...

not

...

standardized

...

by

...

the

...

EJB

...

spec.

...

This

...

is

...

unfortunate

...

and

...

something

...

being

...

addressed

...

in

...

EJB

...

3.1.

...

The

...

default

...

schema

...

that

...

OpenEJB

...

uses

...

is

...

ejbName

...

+

...

interfaceType

...

(i.e.

...

Local,

...

Remote,

...

LocalHome,

...

RemoteHome),

...

so

...

in

...

our

...

example

...

"CounterImpl"

...

+

...

"Local"

...

and

...

"CounterImpl"

...

+

...

"Remote".

...

You

...

can

...

in

...

fact

...

change

...

this

...

default

...

to

...

be

...

absolutely

...

anything

...

you

...

want

...

including

...

interface

...

class

...

name,

...

ejb

...

class

...

name,

...

and

...

more.

...

Running

Running the example is fairly simple. In the "simple-stateful"

...

directory

...

of

...

the

...

examples

...

zip

...

,

...

just

...

run:

...

$

...

mvn

...

clean

...

install

...

Which

...

should

...

create

...

output

...

like

...

the

...

following.

...

...