一直试图了解EJB
豆子是什么,这意味着他们的实例是在池中管理的,等等等等.真的无法抓住他们.
你能解释一下他们到底是什么(几乎是为了Java程序员)吗?他们在做什么?他们的目的是什么?为什么要真正使用它们 (为什么不坚持POJO
?)也许是一个示例应用程序?
请参阅更新的信息EJB 3.1
.有关EJB的日期信息可能会产生误导.
对于EJB学习初学者,请注意:
EJB基于分布式对象,这是指在由网络链接的多台机器(虚拟或物理)上运行的软件.
我正在阅读Java EE 6教程,我试图理解无状态和有状态会话bean之间的区别.如果无状态会话bean在方法调用之间不保持其状态,为什么我的程序按照它的方式运行?
package mybeans;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@LocalBean
@Stateless
public class MyBean {
private int number = 0;
public int getNumber() {
return number;
}
public void increment() {
this.number++;
}
}
Run Code Online (Sandbox Code Playgroud)
客户端
import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;
@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
MyBean mybean;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws …
Run Code Online (Sandbox Code Playgroud) EJB在3.x版本中实现了许多改进,Spring也是常用的,而版本3是一个很好的选择.
网上有很多文章,但没有关于ejb3x与spring3x的确切比较.你对它们有什么想法,在现实世界的例子中哪个更好的条件?
例如,我们想要分离数据库和服务器,这意味着我们的应用程序将在服务器上,我们的数据库将在另一个服务器上.. EJB远程控制与Cluster4Spring等?
做每一个@Annotation总是好的?配置永远不需要?
我目前正在学习新的Java EE 6组件模型,并且与最新的依赖注入机制相混淆.所以这是我的问题:
1)@ Inject和@EJB之间有什么区别
2)如果我有一个包含另一个POJO的简单POJO(其中一个是DAO代码),那么更好的选择是什么:@Inject或@EJB?
我可以混用@Inject和@EJB吗?
一个例子是:
ClassA实现了InterfaceA,并具有ClassA_Adaptor的实例
ClassA_Adaptor实现InterfaceAB并具有ClassB的实例
ClassB实现了InterfaceB,并具有ClassB_Adaptor实例和实例DAO_ClassB
ClassB_Adaptor实现了InterfaceB并具有ClassC的实例
ClassC实现了InterfaceBC并具有WebService_ClassC的实例
DAO_ClassB将使用JPA 2.0(@PersistenceContext)
我想要注入所有这些,包括DAO和WebService.
3)仅对某些操作使用事务处理而不是对所有操作都使用事务是否是一种不好的方法?
例如:DAO_ClassB中的某些方法是典型的查询,而其他方法是"写入"方法.不用事务包装"READ"方法是不是很糟糕?
据我所知,DAO_ClassB可以使用@EJB包装事务(注入DAO_ClassB并使所有方法都是事务性的).我该如何控制它?
很抱歉,如果有些问题令人困惑,因为我只知道Java EE 6新组件模型的部分内容.
我想编写一个后台作业(EJB 3.1),它每分钟执行一次.为此,我使用以下注释:
@Schedule(minute = "*/1", hour = "*")
Run Code Online (Sandbox Code Playgroud)
这工作正常.
但是,有时候这项工作可能需要一分多钟.在这种情况下,计时器仍然被触发,导致线程问题.
如果当前执行没有完成,是否可以终止调度程序?
当我@Asynchronous
在EJB中有一个方法,而我没有指定@TransactionAttribute
,那么容器究竟是如何处理事务边界的呢?显然,它不能使用调用线程的事务,那么它有什么作用呢?
同样的问题,但关于TimerService触发的方法.
编辑:我想我措辞不好.我已经知道默认模式是'REQUIRED'.因此,假设在事务中始终调用这些方法应该是安全的.但我的问题是,该交易的生命周期是什么样的?容器是否为每个调用创建一个新事务?或者它是否为异步工作线程上的所有调用重用相同的事务?如果是后者,那么交易什么时候关闭?
我正在按照本教程使用EJB:
package exercise1;
import java.util.Random;
import javax.ejb.Stateless;
import javax.inject.Named;
@Stateless
public class MessageServerBean {
private int counter = 0;
public String getMessage(){
Random random = new Random();
random.nextInt(9999999);
int myRandomNumber = random.nextInt();
return "" + myRandomNumber;
}
public int getCounter(){
return counter++;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个输出示例:
来自Facelets的Hello
消息是:84804258
计数器是:26
消息服务器Bean是:exercise1.MessageServerBean@757b6193
这是我的观察:
@Stateless
我总是得到相同的对象ID,并且计数器总是递增.@Stateful
每次刷新页面时都会获得一个新实例.@Singleton
我得到的结果与我设置时@Stateless
相同:相同的对象ID,计数器递增. 所以,我真正想要理解的是:在这种情况下@Stateless
,@Singleton
EJB 和EJB 之间的区别是什么?
启动一个新项目,并想了解在WAR与EAR中打包EJB的优缺点.
当EJB在WAR中时,JNDI仍然可以工作吗?效率?等等.?
谢谢.
如何配置计划间隔:
@Schedule(persistent=true, minute="*", second="*/5", hour="*")
在应用程序代码之外?
我有一个用@Schedule注释的方法,偶尔会被容器调用.
@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void myTimerMethod() throws Exception {
...
}
Run Code Online (Sandbox Code Playgroud)
问题是在某些条件下,我希望此方法抛出异常以使正在进行的事务回滚.但如果我这样做超过两次,计时器将被清除,不再被调用!
INFO: EJB5119:Expunging timer ['68@@1359143163781@@server@@domain1' 'TimedObject = MyBean' 'Application = My-War' 'BEING_DELIVERED' 'PERIODIC' 'Container ID = 89072805830524936' 'Fri Jan 25 21:49:30 CET 2013' '0' '*/5 # * # * # * # * # * # * # null # null # null # true # myTimerMethod # 0' ] after [2] failed deliveries
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用在domain.xml中配置计时器重新安排
<domains>
...
<configs>
<config> …
Run Code Online (Sandbox Code Playgroud)