1

Мне нужно сделать простой Message Driven Bean, который будет прослушивать динамически добавленные локали очереди. Я пробовал несколько способов реализовать это, но никто из них не работал. У меня есть приложение, в котором используются очереди сообщений esb и java, и я пытаюсь прочитать местоположение очереди из файла конфигурации во время выполнения и, таким образом, передать свой битовый код сообщения, какова очередь для прослушивания. Я не уверен, что это возможно.Добавить вручную сопоставленное имя в Message Driven Bean во время выполнения

Я также пытался внедрить прослушиватель сообщений, но потому, что мне нужно использовать модуль ejb, а модуль ejb не поддерживает основной метод, для этого требуется свой собственный контейнер (например, ведомый ведомый bean-компонент), я не знаю, что использовать вместо основного метода для достижения одной и той же цели. Я не могу использовать сессионные компоненты, потому что мне нужно добиться асинхронной связи между клиентом и сервисом.

Я также пытался использовать клиентское приложение (хотя это не один из вариантов), но проект maven не поддерживает функции отладки и запуска для этого типа приложений в netbeans.

Кто-нибудь знает какое-либо решение этой проблемы или, по крайней мере, имеет какую-то идею?

ответ

1

Это может быть не лучшим решением, но можно получать и обрабатывать сообщения JMS асинхронно с Stateful Session Bean делает что-то вроде этого:

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 
    } 

} 

Используйте Singleton для теста:

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(); 
    } 
} 
+0

печально не работает в jboss: вызвано: javax.jms.IllegalStateException: этот метод не применим внутри сервера приложений. См. Спецификацию J2EE, например. J2EE1.4 Раздел 6.6 \t на org.hornetq.ra.HornetQRASession.checkStrict (HornetQRASession.java:1457) \t в org.hornetq.ra.HornetQRAMessageConsumer.setMessageListener (HornetQRAMessageConsumer.java:125) –