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

无法在WebSphereMQ队列中看到JMS消息

那正初
2023-03-14

我试图将一些消息从JMS代码放到本地队列管理器中定义的本地队列中。我在WebSphere MQ中定义了一个本地队列LQ,并使用JMS代码放置消息。我在这里做得对吗。我没有看到WebSphere队列中的消息。

以下是代码:

try {
    MQQueueConnectionFactory cf = new MQQueueConnectionFactory();
    //set up the Connection Configuration values

    // Set the properties
      cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "HostName");
      cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
      cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "SYSTEM.DEF.SVRCONN");
      cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
      cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "TEST.JMS");

    //JNDI is Not used Here
    MQQueueConnection connection = (MQQueueConnection) cf.createQueueConnection();

    MQQueueSession session = (MQQueueSession) connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
    MQQueue queue = (MQQueue) session.createQueue("queue:///LQ");
    MQQueueSender sender = (MQQueueSender) session.createSender(queue);
    MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue);

    long uniqueNumber = System.currentTimeMillis() % 1000;

    JMSTextMessage message = (JMSTextMessage) session.createTextMessage("MQJMSTest "+ uniqueNumber);  
    //MQMessage message =  (MQMessage) session.createTextMessage("MQJMSTest "+ uniqueNumber);


    // Start the connection
    connection.start();

    sender.send(message);
    System.out.println("Sent message:\\n" + message);

    //JMSMessage receivedMessage = (JMSMessage) receiver.receive(10000);
    // System.out.println("\\nReceived message:\\n" + receivedMessage);

    sender.close();
    receiver.close();
    session.close();
    connection.stop();
    connection.close();

    System.out.println("\\nSUCCESS\\n");

} catch (JMSException e) {
    // TODO Auto-generated catch block
    //e.printStackTrace();
    System.out.println(e);
    System.out.println("\\nFAILURE\\n");
}
  catch (Exception e){
      System.out.println(e);
      System.out.println("\\nFAILURE\\n");
} 

共有1个答案

贺聪
2023-03-14

根据这一点,您已经创建了一个事务会话:

    connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);

根据文件,

当应用程序关闭事务会话时,会发生隐式回滚。当应用程序关闭连接时,该连接的所有事务会话都会发生隐式回滚。

回滚将删除队列中的任何消息,直到它们在放置它们的应用程序之外变得可见。所以我想你可能想完成交易,是吗?

    sender.send(message);

    // ADD THIS HERE ===========================
    session.commit();
    // ADD THIS HERE ===========================

    System.out.println("Sent message:\\n" + message);

    // THE COMMIT MUST HAVE OCCURRED BEFORE YOU CAN GET THE MESSAGE
    // BACK OUT OF THE QUEUE IN THE NEXT LINES

    //JMSMessage receivedMessage = (JMSMessage) receiver.receive(10000);
    // System.out.println("\\nReceived message:\\n" + receivedMessage);

    // ===================================================
    // DON'T FORGET TO COMMIT THE MESSAGE ON THE WAY BACK OUT OR IT WILL
    // JUST GE TPUT BACK ON THE QUEUE AGAIN.
    // session.commit();
    // ===================================================


    sender.close();
    receiver.close();
    session.close();

PS:请参阅JMS异常处理部分。JMS异常是一个多层结构,其中期望将特定于供应商的诊断放置在较低级别的元素中。只有打印那些较低级别的元素,才有可能知道传输层认为什么是错误的。

 类似资料:
  • 这是我的配置: 这是我的消费者: 因此,我将一条消息放入队列,其中有效负载=“launch”。 我想测试事务,如果有效负载等于“launch”,它就会抛出一个异常。 因此,多亏了重新交付政策,消费者尝试使用该消息5次。在ActiveMq队列列表中的第五个之后,我没有看到我发送的消息。 消息放在哪里?在死信队列中?在哪里可以看到带有“launch”消息的死信队列? 谢谢

  • 我正在尝试将JMS队列注入到无状态EJB中。我的代码看起来是这样的: 当我试图将其部署到应用程序服务器(Wildfly 9.0.2)时,引发了以下异常 如果我将mappedName更改为远程JNDI名称,它就会起作用 或者我将无状态EJB切换到一个依赖的CDI Bean Wildfly配置如下所示: 那么,为什么不能将JMS队列注入到无状态EJB中,为什么它可以在CDI bean中工作呢?我做错了

  • 我是JMS新手,经过长时间的搜索,我搜索出了一个连接到JMS的代码,并发布了一条消息。 问题是我需要在远程队列中发布消息,但我不知道如何建立连接到它并发布消息。 服务器类型:TIBCO EMS 服务器主机:******。net 端口:**USername:user passsbrow:user123 队列:**。。。。顺序经营1. 我想建立连接,发布一条简单的消息,然后把它取回。请帮忙!提前谢谢

  • 问题内容: 我试图将字符串消息发送到在weblogic服务器中创建的JMS队列中。我使用Eclipse IDE,当我运行Web应用程序时,出现以下错误,tomcat服务器关闭。错误是 请帮助我。谢谢和最诚挚的问候 问题答案: 基于对该问题的一些快速研究,它似乎是由于在应用服务器和客户端之间使用不同的JDK级别引起的。我看到的大多数示例都表明,在Java 5上运行Weblogic时在客户端上使用Ja

  • 我是Spring JMS的新手。我的应用程序是使用Spring Boot开发的,并部署在JBoss EAP7.2.0中。我有一个远程队列,它是一个活动的MQ Artemis队列,也嵌入在JBoss EAP7.2.0中。有人能建议我如何使用Spring Boot的JmsTemplate向远程JMS队列发送消息吗?基本上,我不知道应该如何定义远程connectionFactory来连接到远程队列。

  • 我试图通过AMQP 1.0协议向Qpid代理发送消息。队列名为,它已经在默认的虚拟主机下创建。但是,永远卡住了。相同的代码适用于连接到Azure服务总线。我使用的是qpid-jms-Client 0.58。生产者代码是: 生产时应用程序的线程转储 我尝试运行这个示例,得到了相同的结果。