当前位置: 首页 > 知识库问答 >
问题:

在Glassfish中不调用消息驱动Bean onMessage()

黄高爽
2023-03-14

我对JMS编码是新手。我试图从独立的java客户端创建消息,该客户端创建并将消息发送到队列,消息驱动bean用于进一步处理消息。

我使用的是Glassfish应用服务器(3.1)。并设置从独立java客户机创建jms消息的所有内容。

下面是我的代码:客户端

import java.util.Properties;

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

public class TruckMonitor {

public static void main(String args[]) {

    try {

    // Provide the details of remote JMS Client
      Properties props = new Properties();
      props.put(Context.PROVIDER_URL, "mq://localhost:7676");

    // Create the initial context for remote JMS server
      InitialContext cntxt = new InitialContext(props);
      System.out.println("Context Created");

      // JNDI Lookup for QueueConnectionFactory in remote JMS Provider
      QueueConnectionFactory qFactory = (QueueConnectionFactory)cntxt.lookup("OmazanQueueConnectionFactory");

      // Create a Connection from QueueConnectionFactory
      Connection connection = qFactory.createConnection();
      System.out.println("Connection established with JMS Provide ");
      connection.start();
      // Initialise the communication session 
      Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
      // Create the message
      TextMessage message = session.createTextMessage();
      message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);


      message.setText(getMessage());

      // JNDI Lookup for the Queue in remote JMS Provider
      Queue queue = (Queue)cntxt.lookup("OmazanQueue");

      // Create the MessageProducer for this communication 
      // Session on the Queue we have
      MessageProducer mp = session.createProducer(queue);

      // Send the message to Queue
      mp.send(message);
      System.out.println("Message Sent: " + getMessage());

      // Make sure all the resources are released 
      mp.close();
      session.close();
      cntxt.close();
  } catch (Exception ex) {
      ex.printStackTrace();
  }

}

private static String getMessage() {
    String msg = null;

    StringBuffer sbExceptionEvent = new StringBuffer("<exceptionEvent>");
    sbExceptionEvent.append("</exceptionEvent>");

    msg = sbExceptionEvent.toString();
    return msg;
}
}

消息驱动bean:

import java.util.Properties;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;


/** * Message-Driven Bean implementation class for: OmazanMDBean*/ 
@MessageDriven(
    activationConfig = { 
            @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
            @ActivationConfigProperty(propertyName = "destination", propertyValue = "OmazanQueue"),
            @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")
    }, 
    mappedName = "OmazanQueue")
public class OmazanMDBean implements MessageListener {

/**
 * Default constructor. 
 * @throws NamingException 
 * @throws JMSException 
 */
public OmazanMDBean() {
    super();
}

/**
 * @see MessageListener#onMessage(Message)
 */
public void onMessage(Message message) {
    System.out.println("Inside omMessage");
    try {
       message.acknowledge();
      } catch (Exception e) {
       e.printStackTrace();
    }

    TextMessage txtMessage = (TextMessage) message;

    try {
        System.out.println(txtMessage.getText());
    } catch (Exception e) {
       e.printStackTrace();
    }
}

}

问题是:onmessage()没有被调用。我错过什么了吗?请帮帮我.

共有1个答案

江棋
2023-03-14

我想如果您从MessageDrivenBean中删除@activationconfigproperty(propertyName=“destination”,propertyValue=“omazanqueue”),它就可以工作了,因为您已经使用了mappedName=“omazanqueue”

 类似资料:
  • 在一个无状态bean中,我正在查找队列,这是正确的,并且发送没有抛出异常: 但不调用消息驱动bean的onMessage方法。 我错过了什么? 我的消息驱动bean有以下代码:

  • pdo在mysql上运行良好,但在pgsql上,它的给出错误是“PDOException”,消息是“找不到驱动程序”我已经安装了包,其中还包括 http://packages.debian.org/sid/php5-pgsql 这个包提供了一个直接从PHP脚本连接PostgreSQL数据库的模块。它还包括与PHP数据对象扩展一起使用的pdo_pgsql模块。 我的dsn是我正在使用Ubuntu 1

  • 是否可以在MDB(消息驱动Bean)中为“目的地”动态分配运行时值? 我还尝试了ejb-jar.xml方法,但是“activation-config-property-name”=“destination”的值被理解为队列的文字物理名称。因此我无法对资源进行JNDI查找。 从属性读取和分配目标或使用-d参数传递值的正确方法是什么?

  • 在企业应用程序中,我试图使用netBeans 8.1将MessageDriven beans注入Web应用程序(到REST服务)。我在IDE中没有得到任何警告,但是,在部署时,我得到以下错误: 严重:加载应用程序时出现异常:CDI部署失败:Weld-001408:未满足类型StatisticsBean的依赖关系,其限定符@Default在注入点[BackedAnnotatedField]@Inje

  • 我的问题是,如果编写一个简单的REST API,就像文章描述的那样,执行由MongoDB支持的CRUD操作,并使用spring-boot-starter-data-mongodb-reactive,我可以调用消息驱动的API服务吗?我还可以添加一个Webclient来与一些下游服务进行对话。 在REST API上下文中驱动消息有意义吗?

  • 早上好在我的时区。 事先表示感谢并致以最良好的问候