Java 从消息侦听器中检索值并在Main中打印

Java 从消息侦听器中检索值并在Main中打印,java,message-driven-bean,stateless-session-bean,message-listener,Java,Message Driven Bean,Stateless Session Bean,Message Listener,我有两个EJB应用程序,A和B。A有一个无状态会话,向应用程序B(消息驱动bean)发送消息。应用程序B将消息发送回应用程序a 现在,我在A中的无状态会话bean中的消息侦听器中有了我想要的值。但是我需要从Main中显示它。我尝试声明一个变量并将值存储在其中。但是当我从Main调用它时,值就丢失了 @Stateful public class AManagerBean implements ejb.AManagerRemote { @Resource(mappedName = "jms/Queu

我有两个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
我需要在主课上表演。但它总是返回null


我该怎么做呢?

我写这篇文章是作为一个答案,因为评论的时间很长,尽管它可能无法提供实际的答案

首先,EJB中的非最终静态变量是不允许的。有一个条目是关于这个的

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

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


因此,我建议您做的第一件事是重新设计,并尝试创建一个更真实的示例并运行。

我写这篇文章是为了回答问题,因为评论的篇幅很长,尽管它可能无法提供实际的答案

首先,EJB中的非最终静态变量是不允许的。有一个条目是关于这个的

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

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


因此,我建议您做的第一件事是重新设计,并尝试创建一个更真实的示例并运行。

如果没有看到一些代码,就很难理解您要做什么。你能给我们看一下你到目前为止的代码吗?@NilsH编辑了我的文章。这个用例有点奇怪,所以我想这只是为了测试?您是否已验证调用了
onMessage
?@NilsH是。我已经可以在服务器端打印出值了。我只需要在主类中展示它。你如何运行你的主类?如果不看到一些代码,很难理解你想做什么。你能给我们看一下你到目前为止的代码吗?@NilsH编辑了我的文章。这个用例有点奇怪,所以我想这只是为了测试?您是否已验证调用了
onMessage
?@NilsH是。我已经可以在服务器端打印出值了。我只需要在主课堂上展示一下。你是如何管理你的主课堂的?