1

我有 2 个 EJB 应用程序,A 和 B。A 有一个无状态会话,向应用程序 B(消息驱动 bean)发送消息。应用 B 将消息发送回应用 A。

现在,我在 A 中的无状态会话 bean 的消息侦听器中拥有了我想要的值。但我需要从 Main 中显示它。我尝试声明一个变量并将值存储在其中。但是当我从 Main 调用它时,值就丢失了。

@Stateful
public class AManagerBean implements ejb.AManagerRemote {
@Resource(mappedName = "jms/QueueConnectionFactory")
private ConnectionFactory queueConnectionFactory;
@Resource(mappedName = "jms/Queue")
private Queue queue;

private static int fineAmt;

......

static class AListener implements MessageListener{
    public void onMessage(Message message){
         .....
         fineAmt = msg.getInt("fineAmt"); 
        // I NEED FINEAMT TO SHOW IN MAIN CLASS

         .....
    }
}

public int returnFine(){
     return fineAmt;
 }

在主课...

public class Main {

    @EJB
    public static AManagerRemote amr;

    public static void main(String[] args) {
         ......
         System.out.println(amr.returnFine());
         // ALWAYS RETURN 0

我需要 Fineamt 在主课上展示。但它总是返回null。

我该怎么做?

4

1 回答 1

1

我写这个作为答案,因为评论很长,尽管它可能无法提供实际答案。

首先,不允许在 EJB 中使用非最终静态变量。EJB Restrictionc FAQ中有一个关于此的条目

在 EJB 中不允许使用非最终静态类字段,因为此类字段会使企业 bean 难以或无法分发。静态类字段在特定类的所有实例之间共享,但仅在单个 Java 虚拟机 (JVM) 中共享。更新静态类字段意味着在类的所有实例之间共享该字段的值。但是,如果一个类同时在多个 JVM 中运行,则只有与更新实例在同一 JVM 中运行的那些实例才能访问新值。换句话说,如果在单个 JVM 中运行,非最终静态类字段的行为将不同于在多个 JVM 中运行。EJB 容器保留了跨多个 JVM 分发企业 bean 的选项(运行在同一台服务器上,或任何服务器集群上)。

其次,您已经定义了一个Stateful会话 bean。有状态会话 bean 应该具有会话状态,并且客户端(通常)在其生命周期内拥有同一个有状态 bean 的句柄。在您的示例中我看不到任何对话内容(我假设,因为您已经删除了一些代码),所以它真的需要是一个有状态的 bean 吗?

所以我建议你做的第一件事是重新设计并尝试让一个更真实的例子启动并运行。

于 2013-04-01T06:39:12.123 回答