MQ主题字符串和JMS

时间:2014-05-08 20:24:19

标签: jms

我在Windows 2012 Server(A)上使用WMQ 7.5。创建了一个名为“价格”的主题,订阅了不同的主题字符串(“价格/水果/苹果”,“价格/#/#”和“价格/蔬菜/土豆”),以匹配主题树并为这些订阅创建队列。

在服务器A上使用WMQ Explorer,我可以测试并验证我的主题,订阅和队列是否正常工作。为了进行测试,我运行Test Publication选项并提供主题字符串和消息。

例如,如果我使用主题字符串“价格/水果/苹果”,则已发布的消息将按预期发送到“价格/水果/苹果”和“价格/#/#”订阅的队列。

问题是如何在使用JMS的发布者中以编程方式设置主题字符串。

我的发布者驻留在另一台Windows 2012 Server(B)上。这是一个独立的Java SE应用程序并使用JMS接口。 WMQClient安装在此服务器上。我使用JMSAdmin实用程序创建了管理的TopicConnectionFactory和Topic对象。我将主题管理对象的名称设置为“价格”。

首先,JMS中没有设置Topic String的方法。 IBM doc表明Topic String是一个IBM功能,并未在JMS中介绍。我期望我能够在Message对象上设置JMSProperty,以在消息的标题部分向服务器提供主题字符串。常规WMQ类可以做到这一点,但JMS不能。

其次,有两种解决方法,我都不接受。

解决方法1)创建受管理的JNDI主题对象,其名称与订阅的主题字符串完全相同。如果我有15个订阅,我必须创建15个JNDI主题对象,并为相应的订阅选择正确的JNDI对象。

解决方法2)创建JMS主题对象时不要使用JNDI。相反,通过使用Topic String作为名称实例化MQTopic来使用IBM的MQTopic对象。该解决方案将我的发布者代码直接绑定到IBM类,使我的解决方案不那么便携。

正如我所说,我认为Message对象头应该将Topic String信息带到服务器。那将是一个可以接受的解决方案。

下面是一些代码,可能会澄清我在发布商中所做的事情。


    TopicConnectionFactory tcf = (TopicConnectionFactory)context.lookup("TCF");

    //Below Topic t is coming from JNDI which is a MQTopic with Name "Prices"
    Topic t = (Topic)context.lookup("TPrices");

    //Below Topic tFruitPrices is coming 
    //from JNDI which is a MQTopic with Name "Prices/Fruit/Apples"
    Topic tFruitPrices = (Topic)context.lookup("TFruitPrices");

    //Below Topic tIBM uses IBM classes directly to create a Topic object
    Topic tIBM = new MQTopic("Prices/Vegetable/Potatoes");

    TopicConnection tc = tcf.createTopicConnection();
    TopicSession s = tc.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

    //Below I can choose different topics such as t, tFruitPrices or tIBM to 
    //have the message delivered to different subscriptions
    TopicPublisher tp = s.createPublisher(tIBM);
    Message m = s.createTextMessage("From the MyEclipsePublisher");


    tp.publish(m);
    tp.close();
    s.close();
    tc.close();

是否有人知道此问题是否有可接受的解决方法?

谢谢, -Dogan Atay

1 个答案:

答案 0 :(得分:0)

您是否查看过WMQ附带的JMS Pub / Sub示例?我在这里粘贴一个片段,以编程方式创建主题并使用JMS界面发布消息。具体看一下.createTopic调用。

public static void main(String[] args) {

// Variables
Connection connection = null;
Session session = null;
Destination destination = null;
MessageProducer producer = null;
MessageConsumer consumer = null;

try {
  // Create a connection factory
  JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
  JmsConnectionFactory cf = ff.createConnectionFactory();

  // Set the properties
  cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "localhost");
  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, "QM1");

  // Create JMS objects
  connection = cf.createConnection();
  session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  destination = session.createTopic("topic://foo");
  producer = session.createProducer(destination);
  consumer = session.createConsumer(destination);

  long uniqueNumber = System.currentTimeMillis() % 1000;
  TextMessage message = session.createTextMessage("SimplePubSub: Your lucky number today is "
      + uniqueNumber);

  // Start the connection
  connection.start();

  // And, send the message
  producer.send(message);
  System.out.println("Sent message:\n" + message);