gpt4 book ai didi

java - 无状态 EJB 本地(实例)变量

转载 作者:行者123 更新时间:2023-12-01 08:57:32 29 4
gpt4 key购买 nike

我想要实现的是利用 EJB 功能并使用某种自动池。

我认为 SLSB 可能适合保留本地无状态变量(不知道这是否是一个合适的定义)——至少从客户端/调用者的角度来看。

@Stateless
public class CommunicationService implements Serializable
{
private Process process;

@PostConstruct
//@PostActivate maybe?
public void startProcess()
{
try
{
process = new ProcessBuilder("running a temporary daemon").start();
}
catch(IOException e)
{
throw new RuntimeException(e.getMessage(), e);
}
}


@PreDestroy
//@PrePassivate maybe?
public void endProcess()
{
if(process.isAlive())
{
process.destroy();

boolean terminated = false;
try
{
terminated = process.waitFor(5, TimeUnit.SECONDS);
}
catch(InterruptedException e)
{
// ignore
}

if(!terminated)
{
process.destroyForcibly();
}
}
}

public int send(String message)
{
// do something with the process - may take a long time
// this is just an example

PrintStream printStream = new PrintStream(process.getOutputStream());
printStream.println(message);

try
{
return process.getInputStream().read();
}
catch(IOException e)
{
return -1;
}
}
}

请注意,我想要一个进程池,因此 @Singleton 不适合。

  1. 这是 @Stateless EJB 实例变量的正确用法吗?
  2. @MessageDriven 更合适吗?
  3. 是否有更EE的方式来实现它?

谢谢

最佳答案

与普遍看法相反,在 SLSB 中保持状态是完全可以的。它只是不能是客户端状态。 EJB 3.2 规范的 §4.7 规定:

The term “stateless” signifies that an instance has no state for a specific client. However, the instance variables of the instance can contain the state across client-invoked method calls. Examples of such state include an open database connection and an object reference to an enterprise bean object.

因此,这可能是一个可行的策略,但有一些注意事项:

  • 规范规定“无状态 session Bean 实例通常是池化的”。您需要检查您选择的 JavaEE 服务器实现是否确实对它们进行了池化,因为(至少在一段时间内)它们中的一些每次都会创建一个新实例;

  • 控制池中 Bean 的数量可能很棘手。即使池已满,实现也可能会继续创建 bean 实例,只是永远不会将它们返回到池中;

  • 如果业务方法抛出任何类型的 RuntimeException,则 Bean 实例将被丢弃,而不调用 @PreDestroy 回调(请参阅 EJB 3.2 规范的第 9.3.1 节)。这将导致系统中的进程泄漏;

因此,您需要熟悉服务器管理 SLSB 池的方式。

关于java - 无状态 EJB 本地(实例)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41953450/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com