我有一个@RequestScoped CDI bean,我想把它变成一个EJB来获取声明式事务.(我在EJB 3.1,Java EE 6上)
目前,我在子例程之间传递状态,假设实例仅用于单个请求.如果我@Stateless现在补充说假设会改变.
例如,我想做类似的事情
@Stateless
@Named
@RequestScoped
public class Foo {
private String var1; // can't use instance vars in @Stateless?
private String var2;
public void transactionForRequest() {
var1 = value;
var2 = value;
....
subroutine();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为以上不起作用 - 这是正确的吗?
我正在考虑两种选择:
EJBContext.getContextDatamap替换实例变量.哪个更好?还有其他一些我没想到的选择吗?(除了等待Java EE 7或切换到Spring.:-))
我正在阅读JBoss中的这个示例,其中使用@RequestScopedbean备份JSF page来传递用户凭据信息,然后将其保存在@sessionScoped bean.以下是JBoss文档的示例.
@Named @RequestScoped
public class Credentials {
private String username;
private String password;
@NotNull @Length(min=3, max=25)
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
@NotNull @Length(min=6, max=20)
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
Run Code Online (Sandbox Code Playgroud)
JSF表格:
<h:form>
<h:panelGrid columns="2" rendered="#{!login.loggedIn}">
<f:validateBean>
<h:outputLabel for="username">Username:</h:outputLabel>
<h:inputText id="username" value="#{credentials.username}"/>
<h:outputLabel for="password">Password:</h:outputLabel>
<h:inputSecret id="password" …Run Code Online (Sandbox Code Playgroud) 如果我有一个@MessageDriven使用JMS 注入EJB 的请求作用域CDI bean ,如下所示,我可以假设任何给定的Foo实例一次只能由一次onMessage调用使用吗?
换句话说,在下面的例子中,我可以安全地在Foo对象中使用成员变量来跨子例程存储状态,类似于JSF @RequestScoped托管bean吗?
请注意,如果同一个Foo对象从一个onMessage调用顺序循环到下一个调用,则可以,只要每个MessageDrivenBean实例都有自己的Foo实例,这样就可以隔离两个并发处理请求.
@MessageDriven
public class MessageDrivenBean implements MessageListener {
@Inject
private Foo foo;
public void onMessage(Message m) {
foo.doSomething();
}
}
@Named
@RequestScoped
public class Foo {
private String property;
public void doSomething() {
property = ...;
}
}
Run Code Online (Sandbox Code Playgroud) Application Servers汇集无状态EJB的原因是什么?
我可以理解,控制应用程序的工作负载对于调用invokations是有用的,但这只能证明将服务器作为FAÇADE与调用者客户端一起汇集.
集成内部EJB(那些未公开且仅在内部调用以执行业务逻辑)的内容是否有任何好处?而不是使用共享的单个实例(像Spring一样).
我至少可以考虑一个缺点:高度使用的内部EJB可能成为瓶颈.