我正在尝试使用 Java EE 中的消息驱动 Bean 来实现管道和过滤器模式,但我希望以一种队列可配置且 bean 是在运行时创建的方式来实现。这样可以很容易地更改过滤器执行的顺序。
我对 Java EE 真的很陌生,当我过去使用 MDB 时,我总是这样做:
@MessageDriven(mappedName = "jms/myQueue", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class ReceiveMessageBean implements MessageListener {
这对我想要的不起作用。
我正在考虑做一个每个过滤器都可以继承的 bean,这样我就可以将读取和写入队列方法只放在一个地方,就像这样:
public class StepBean {
public void createBean(String queueRead, String queueWrite) {
//make the bean listen from queueRead
//make the bean write to queueWrite
}
public void onMessage(Message message){
//get the message from queueRead and transform it to my own class
processMessage(myMessage);
}
public void processMessage(MyMessage message){
//each filter should implement this method
sendMessage(myMessage);
}
public void sendMessage(MyMessage message){
//send message to queueWrite
}
}
然后在我的 ejb 中有某种工厂,它为队列创建具有所需值的步骤 bean。
但我几乎不知道如何做到这一点。我一直在看这个,但是因为我的 bean 都从队列中读取和写入,所以它们并不是严格的 MDB。
我使用的是 GlassFish 4.1.2 和 Netbeans 8.2。
欢迎任何有关如何做到这一点或是否可行的指导。
您不能以编程方式创建 MDB,因为它们必须由服务器管理。如果要创建动态侦听器,请使用MessageConsumer
和setMessageListener
。根据您的设置,您需要Connection
从某个连接工厂获得访问权限,然后创建会话、消费者和最后的消息侦听器。可以使用消息选择器 = 您的过滤器创建消费者。一个简短的例子:
ConnectionFactory conFactory = (ConnectionFactory) ic.lookup("java:/ConnectionFactory");//customize the jndi to match your server
Connection connection = conFactory.createConnection();
Queue myqueue = ic.lookup("java:/jms/queue/MyQueue");
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
String messageSelector = "MY_MSG_PROPERTY = 'MY_FILTER_VALUE'";
Consumer consumer = session.createConsumer(myqueue, messageSelector);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//handle you message here
}
});
使用这种方法,您可以创建多个具有不同过滤器和不同消息侦听器的使用者。但请记住,这些侦听器不是容器管理的,如果您不再需要这些侦听器(关闭会话等),则需要处理资源清理/关闭。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句