Java JMS与akka和多线程

Java JMS与akka和多线程,java,multithreading,jms,akka,qpid,Java,Multithreading,Jms,Akka,Qpid,使用ExecutorService执行ProcessRequst方法时,此代码工作正常。然而,面临以下问题与akka演员系统的实施 public class QueueListener implements MessageListener { public static final ExecutorService executor = Executors.newWorkStealingPool(); public static boolean isActorinit=fals

使用ExecutorService执行ProcessRequst方法时,此代码工作正常。然而,面临以下问题与akka演员系统的实施

public class QueueListener implements MessageListener {

    public static final ExecutorService executor = Executors.newWorkStealingPool();

    public static boolean isActorinit=false;
    public static ActorSystem system=null;
    private ActorRef myActor=null;
    private String _queueName=null; 

    public QueueListener(String qName){
        this._queueName = qName;
        if(!isActorinit){
            system=ActorSystem.create("Controller");

            try {
            myActor=system.actorOf(Props.create(MessageExecutor.class.getConstructor(String.class).newInstance(_queueName).getClass()),"mysysActor");
            } catch (Exception e) {
                // TODO Auto-generated catch block
            }
            isActorinit=true;
        }
    }

    /* 
     * (non-Javadoc)
     * @see javax.jms.MessageListener#onMessage(javax.jms.Message)
     */
    @Override
    public void onMessage(Message msg) {

//      processRequest(msg);
        executeRequest(msg);
    }

    /** This method will process the message fetch by the listener.
     *   
     * @param msg - javax.jms.Messages parameter get queue message
     */
    private void processRequest(Message msg){

        String requestData=null;
        try {

            if(msg instanceof TextMessage){
                TextMessage textMessage= (TextMessage) msg;
                requestData = textMessage.getText().toString();
            }else if(msg instanceof ObjectMessage){
                ObjectMessage objMsg = (ObjectMessage) msg; 
                requestData = objMsg.getObject().toString();
            }


            MessageProcessor msgProcessor = new MessageProcessor(_queueName, requestData);
            executor.submit(msgProcessor);
        } catch (JMSException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }

    private void executeRequest(Message msg){

        String requestData=null;
        try {

            if(msg instanceof TextMessage){
                TextMessage textMessage= (TextMessage) msg;
                requestData = textMessage.getText().toString();
            }else if(msg instanceof ObjectMessage){
                ObjectMessage objMsg = (ObjectMessage) msg; 
                requestData = objMsg.getObject().toString();
            }
//           MessageExecutor objMessageExecutor=new MessageExecutor(_queueName);
            myActor.tell(requestData, ActorRef.noSender()); 

        } catch (JMSException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

    }

}
请注意,我正在使用ApacheQPIDAPI用于activeMQ的AMQP协议


我无法理解这个问题。

创建actor需要很短的时间,在创建actor的过程中,如果您得到要处理的消息,您将得到空指针异常


在向“myActor”发送消息之前,您可能需要检查其是否为null。或者可以考虑使用演员生命周期事件来开始处理消息。

创建演员需要很少的时间,在创建演员的过程中,如果你得到消息处理,你将得到空指针异常。
在向“myActor”发送消息之前,您可能需要检查其是否为null。或者您可以考虑使用演员生命周期事件来开始处理消息。

< P>我已经找到了它的解决方案,这是由于NANE REF的NPE在为每个进程队列处理具有多个ActoReF的多个输入时,而不是初始化对象。这是我找到的解决办法

Exception in thread "Thread-4" java.lang.NullPointerException
    at com.syn.jms.listener.QueueListener.executeRequest(QueueListener.java:102)
    at com.syn.jms.listener.QueueListener.onMessage(QueueListener.java:59)
    at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl$Dispatcher.run(SessionImpl.java:942)
    at java.lang.Thread.run(Thread.java:745)

不过,我感谢您的意见,希望我能找到解决方案。Thnaks

我发现了解决方案,这是由于在处理多个输入时,为每个进程队列使用唯一的actorRef,而不是初始化对象时,Actor ref的NPE造成的。这是我找到的解决办法

Exception in thread "Thread-4" java.lang.NullPointerException
    at com.syn.jms.listener.QueueListener.executeRequest(QueueListener.java:102)
    at com.syn.jms.listener.QueueListener.onMessage(QueueListener.java:59)
    at org.apache.qpid.amqp_1_0.jms.impl.SessionImpl$Dispatcher.run(SessionImpl.java:942)
    at java.lang.Thread.run(Thread.java:745)

不过,我感谢您的意见,希望我能找到解决方案。Thnaks

myActor为空,因为您已从构造函数中注释掉它。这是错误的。然而,问题仍然是一样的。@jtahlborn是创建Actor ref实例的正确方法。myActor=system.actorOf(Props.create(MessageExecutor.class.getConstructor(String.class).newInstance(_queueName.getClass()),“mysysActor”);NPE问题得到解决。我是因为ActorRef实例没有创建。但是,无法从queuemyActor异步读取消息的jms侦听器为null,因为您已从构造函数中注释掉它。这是错误的。然而,问题仍然是一样的。@jtahlborn是创建Actor ref实例的正确方法。myActor=system.actorOf(Props.create(MessageExecutor.class.getConstructor(String.class).newInstance(_queueName.getClass()),“mysysActor”);NPE问题得到解决。我是因为ActorRef实例没有创建。但是,jms侦听器无法从队列异步读取消息。这不是真的。OP的问题是,
myActor
从未被创建。无论底层参与者是否准备好接收消息,您始终可以将消息发送到
参与者ref
。这不是事实。OP的问题是,
myActor
从未被创建。无论底层参与者是否准备好接收消息,您始终可以将消息发送给
参与者ref