Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时在消息驱动Bean中手动添加mappedName_Java_Message Queue_Ejb 3.1_Message Driven Bean_Glassfish Esb - Fatal编程技术网

Java 在运行时在消息驱动Bean中手动添加mappedName

Java 在运行时在消息驱动Bean中手动添加mappedName,java,message-queue,ejb-3.1,message-driven-bean,glassfish-esb,Java,Message Queue,Ejb 3.1,Message Driven Bean,Glassfish Esb,我需要制作一个简单的消息驱动Bean,它将侦听动态添加的队列位置。我尝试了几种方法来实现这一点,但没有一种有效。我有一个使用esb和java消息队列的应用程序,我试图在运行时从配置文件中读取队列位置,从而告诉我的消息驱动bean要侦听的队列是什么。我也不确定这是否可能 我也尝试过实现消息侦听器,但是因为我必须使用ejb模块,而ejb模块不支持main方法,它需要自己的容器(比如消息驱动bean),我不知道用什么代替main方法来实现同样的目标。我不能使用会话bean,因为我需要在客户端和服务之间

我需要制作一个简单的消息驱动Bean,它将侦听动态添加的队列位置。我尝试了几种方法来实现这一点,但没有一种有效。我有一个使用esb和java消息队列的应用程序,我试图在运行时从配置文件中读取队列位置,从而告诉我的消息驱动bean要侦听的队列是什么。我也不确定这是否可能

我也尝试过实现消息侦听器,但是因为我必须使用ejb模块,而ejb模块不支持main方法,它需要自己的容器(比如消息驱动bean),我不知道用什么代替main方法来实现同样的目标。我不能使用会话bean,因为我需要在客户端和服务之间实现异步通信

我还尝试使用客户机应用程序(尽管它不是选项之一),但maven project不支持netbeans中此类应用程序的调试和运行功能


有人知道这个问题的解决方案吗,或者至少有一些想法吗?

这可能不是最好的解决方案,但是可以通过有状态会话Bean异步接收和处理JMS消息,如下所示:

package com.example.statefuljms;

import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Stateful;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

@Stateful
@Local(MessageReceiverLocal.class)
public class MessageReceiver implements MessageReceiverLocal, MessageListener {
    @Resource(mappedName = "ConnectionFactory")
    private ConnectionFactory connectionFactory;

    private QueueConnection connection;

    @Override
    public void start(String queueName) throws JMSException, NamingException {
        Context initialContext = new InitialContext();

        connection = (QueueConnection) connectionFactory.createConnection();
        QueueSession session = (QueueSession) connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);
        Queue queue = (Queue) initialContext.lookup(queueName);
        QueueReceiver receiver = session.createReceiver(queue);
        receiver.setMessageListener(this);
        connection.start();
    }

    @Remove
    @Override
    public void stop() throws JMSException {
        connection.stop();
        connection.close();
    }

    @Override
    public void onMessage(Message message) {
        // handle message here
    }

}
使用单例测试:

package com.example.statefuljms;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.jms.JMSException;
import javax.naming.NamingException;

@Startup
@Singleton
public class Test {
    @EJB
    private MessageReceiverLocal messageReceiver;

    @PostConstruct
    public void run() {
        messageReceiver.start("/queue/myQueue");
    }

    @PreDestroy
    public void cleanup() {
        messageReceiver.stop();
    }
}

这可能不是最好的解决方案,但可以通过有状态会话Bean异步接收和处理JMS消息,如下所示:

package com.example.statefuljms;

import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Stateful;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

@Stateful
@Local(MessageReceiverLocal.class)
public class MessageReceiver implements MessageReceiverLocal, MessageListener {
    @Resource(mappedName = "ConnectionFactory")
    private ConnectionFactory connectionFactory;

    private QueueConnection connection;

    @Override
    public void start(String queueName) throws JMSException, NamingException {
        Context initialContext = new InitialContext();

        connection = (QueueConnection) connectionFactory.createConnection();
        QueueSession session = (QueueSession) connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);
        Queue queue = (Queue) initialContext.lookup(queueName);
        QueueReceiver receiver = session.createReceiver(queue);
        receiver.setMessageListener(this);
        connection.start();
    }

    @Remove
    @Override
    public void stop() throws JMSException {
        connection.stop();
        connection.close();
    }

    @Override
    public void onMessage(Message message) {
        // handle message here
    }

}
使用单例测试:

package com.example.statefuljms;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.jms.JMSException;
import javax.naming.NamingException;

@Startup
@Singleton
public class Test {
    @EJB
    private MessageReceiverLocal messageReceiver;

    @PostConstruct
    public void run() {
        messageReceiver.start("/queue/myQueue");
    }

    @PreDestroy
    public void cleanup() {
        messageReceiver.stop();
    }
}

遗憾的是,jboss无法工作:原因是:javax.jms.IllegalStateException:此方法不适用于应用程序服务器内部。请参阅J2EE规范,例如位于org.hornetq.ra.HornetQRASession.checkStrict(HornetQRASession.java:1457)org.hornetq.ra.HornetQRAMessageConsumer.setMessageListener(HornetQRAMessageConsumer.java:125)的J2EE1.4第6.6节遗憾的是,jboss无法工作:原因是:javax.jms.IllegalStateException:此方法不适用于应用程序服务器内部。请参阅J2EE规范,例如位于org.hornetq.ra.HornetQRASession.checkStrict(HornetQRASession.java:1457)org.hornetq.ra.HornetQRAMessageConsumer.setMessageListener(HornetQRAMessageConsumer.java:125)的J2EE1.4第6.6节