我在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
答案 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);