Jboss Messaging JMS

我成功地将消息发送到我的localhost Jboss服务器上的队列名称ReceiverQueue ,如何检索我发送给它的消息,或者如何检查队列中是否有任何消息(如果有的话)。 或者我可以得到某种解释是什么是最好的方法。 谢谢

一个工作的发送/接收教程也将被接受。 任何能让我发送到队列并从该队列接收消息的东西都会得到接受的答案。

我正在使用Spring。

我想要一个使用bean注入的应用程序上下文来实现它的解决方案。

标准JMS API步骤:
1.使用服务器的访问详细信息创建javax.naming.Context

 context = new InitialContext(environment) 

2.在上下文中查找javax.jms.QueueConnectionFactory。 工厂名称特定于JMS服务器

 factory = (QueueConnectionFactory)context.lookup(factoryName) 

3.创建javax.jms.QueueConnection

 connection = factory.createQueueConnection(...) 

4.创建一个javax.jms.QueueSession

 session = connection.createQueueSession(...) 

5.在上下文中查找javax.jms.Queue

 queue = (Queue) context.lookup(qJndiName) 

直到现在它与发送….
6.使用会话创建javax.jms.QueueReceiver

 receiver = session.createReceiver(queue) 

7. JMS API提供了两种检索消息的方法:
7.a等待带有receiver.receive()方法之一的消息
7.b在类中实现javax.jms.MessageListener并将其注册为侦听器

 receiver.setMessageListener(this) 

每当有新消息到达时,JMS API都会调用onMessage()方法
8.不要忘记启动听众:

 connection.start() 

9.关闭上下文(非常重要,当您从同一程序访问多个JMS服务器时):

 context.close() 

以上是独立应用程序的典型解决方案。 在EJB环境中,您应该使用消息驱动的bean。 您可以在http://java.sun.com/javaee/6/docs/tutorial/doc/gipko.html上找到ino,并在http://schuchert.wikispaces.com/EJB3+Tutorial+5+上找到教程。 – + +消息驱动+豆

以下是您要求的工作示例:

 import java.util.Hashtable; import javax.naming.*; import javax.jms.*; public class JMSJNDISample implements MessageListener { public static final String JNDI_URL = "jnp://localhost:1099"; public static final String JNDI_CONTEXT_FACTORY = "org.jnp.interfaces.NamingContextFactory"; public static final String JMS_USER = null; public static final String JMS_PASSWORD = null; public static final String JMS_CONNECTION_FACTORY = "MyConnectionFactory"; public static final String QUEUE_JNDI_NAME = "ReceiverQueue"; QueueConnection qConn = null; QueueSession qSession = null; QueueSender qSender = null; QueueReceiver qReceiver = null; public JMSJNDISample () { } public void init() throws JMSException, NamingException { // Set up JNDI Context Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_CONTEXT_FACTORY); env.put(Context.PROVIDER_URL, JNDI_URL); if (JMS_USER != null) env.put(Context.SECURITY_PRINCIPAL, JMS_USER); if (JMS_PASSWORD != null) env.put(Context.SECURITY_CREDENTIALS, JMS_PASSWORD); Context jndiContext = new InitialContext(env); // Lookup queue connection factory QueueConnectionFactory cFactory = (QueueConnectionFactory)jndiContext.lookup(JMS_CONNECTION_FACTORY); // Create Connection if (JMS_USER == null || JMS_PASSWORD == null) qConn = cFactory.createQueueConnection(); else { qConn = cFactory.createQueueConnection(JMS_USER, JMS_PASSWORD); } // Create Session qSession = qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); // Lookup Queue Queue queue = (Queue) jndiContext.lookup(QUEUE_JNDI_NAME); // Create Queue Sender qSender = qSession.createSender(queue); // Create Queue Receiver qReceiver = qSession.createReceiver(queue); qReceiver.setMessageListener(this); // Start receiving messages qConn.start(); // Close JNDI context jndiContext.close(); } public void sendMessage (String str) throws JMSException { TextMessage msg = qSession.createTextMessage(str); qSender.send(msg); } public void onMessage (Message message) { try { if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage)message; System.out.println("Text Message Received: "+textMessage.getText()); } else { System.out.println(message.getJMSType()+" Message Received"); } } catch (JMSException je) { je.printStackTrace(); } } public void destroy() throws JMSException { if (qSender != null) qSender.close(); if (qReceiver != null) qReceiver.close(); if (qSession != null) qSession.close(); if (qConn != null) qConn.close(); } public static void main(String args[]) { try { JMSJNDISample sample = new JMSJNDISample(); // Initialize connetion sample.init(); // Send Message sample.sendMessage("Hello World"); // Wait 2 sec for answer Thread.sleep(2000); // Disconnect sample.destroy(); } catch (Exception e) { e.printStackTrace(); } } } 

让MessageDrivenBean监听该队列?

编辑:您正在使用spring来创建有效负载,对吧? JMS是JavaEE规范。 您不需要使用Spring来实际发送/接收消息。 您也不必手动检查队列中是否有消息等。 您需要做的就是设置一个像这样的MDB(MessageDrivenBean),

 @MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty( propertyName = "destination", propertyValue = "queue/myqueue") }) public class MyMessageDrivenBean implements MessageListener { public void onMessage(Message message) { ObjectMessage objMsg = (ObjectMessage) message; Payload payload = (Payload)objMsg.getObject(); //do stuff } 

}

然后发送一些JMS消息。

 @Stateless public class QueuerBean implements QueuerLocal { @Resource(mappedName = "java:/JmsXA") private ConnectionFactory jmsConnectionFactory; @Resource(mappedName = "queue/myqueue") private Queue queue; private void queue(MyPayload payload) { try { Connection connect = jmsConnectionFactory.createConnection(); Session session = connect.createSession(false, Session.DUPS_OK_ACKNOWLEDGE); MessageProducer producer = session.createProducer(queue); // create a JMS message and send it ObjectMessage objMsg = session.createObjectMessage(payload); producer.send(objMsg); producer.close(); session.close(); connect.close(); } catch (JMSException e) { log.error("Bad thing happened", e); } } } 

队列由注释配置。 发送消息时,JBoss将自动触发MDB。

这是一个示例,展示如何在Spring中设置消息驱动的POJO。 如果你已经使用Spring,我建议你遵循这个习惯用法。

至于关于查看队列中有多少消息的部分,我会说你应该使用JBOSS的管理控制台,而不是你的代码。

我还建议使用像HermesJMS( http://www.hermesjms.com/confluence/display/HJMS/Home )这样的工具来检查队列管理器和队列。 这是一个很棒的调试工具。