初次接触,我在网上找了些例子:
发布消息:
/**
 * 
 */
package dlc.jboss.mqexample;import java.util.Hashtable;
import java.util.Properties;import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;/**
 * 主题式的进行发送消息例子
 * 
 * @author lenovo
 * 
 */
public class PublishToTopic { /**
 * @param args
 * @return void
 * @auther lenovo 2010-4-19 下午02:09:12
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
TopicConnection tc = null; try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099");
Context ctx = new InitialContext(env); // 建立连接工厂;并从连接工厂中建立消息队列连接;再从消息队列连接中建立一个会话;
// 再从会话中建立发送对象
Object tmp = ctx.lookup("ConnectionFactory"); TopicConnectionFactory tcf = (TopicConnectionFactory) tmp; Topic t = (Topic) ctx.lookup("topic/TopicExample");  // 注意前面的Topic要小写首字母
tc = tcf.createTopicConnection();
TopicSession ts = tc.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
TopicPublisher tp = ts.createPublisher(t);
TextMessage msg = ts.createTextMessage();
for (int i = 0; i < 10; i++) {
msg.setText("Welcome number " + (i + 1));
tp.publish(msg);
System.out.println("Publish Message To "
+ " topic/TopicExample  " + " : " + msg.getText()
+ "\n");
}
tp.close();
ts.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (tc != null) {
try {
tc.close();
} catch (JMSException e) {
}
}
}
}}接收的:
package dlc.jboss.mqexample;import java.util.Properties;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;/**
 * @author lenovo
 *
 *
 */
public class SubscribeFromTopic {
public static void doSubscribe(String tName) {
Message msg;
TextMessage txtMsg;
TopicConnection tc = null;
try {
Properties p = new Properties();
p.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.setProperty(Context.PROVIDER_URL, "localhost:1099"); InitialContext jc = new InitialContext(p);
TopicConnectionFactory tcf = (TopicConnectionFactory) jc
.lookup("ConnectionFactory");
Topic t = (Topic) jc.lookup(tName);
tc = tcf.createTopicConnection();
TopicSession ts = tc.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
TopicSubscriber tSubscriber = ts.createSubscriber(t); msg = tSubscriber.receive(100);
while (msg != null) {
if (msg instanceof TextMessage) {
txtMsg = (TextMessage) msg;
System.out.println("Receive Msg from " + tName + " : "
+ txtMsg.getText());
}
msg = tSubscriber.receive(100);
} tSubscriber.close();
ts.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (tc != null) {
try {
tc.close();
} catch (JMSException e) {
}
}
}
} public static void main(String[] args) {
//doListen(tName); // 通过消息监听器接收消息
 doSubscribe("topic/TopicExample"); //通过receive()来接收消息
}
}
怎么每次去取的时候,都是空的?是不是在哪里要设置下他的时间啊还是什么。请指教啊

解决方案 »

  1.   

    我把代码重排版,似乎写错了吧。如果 100 ms 没等到消息就退出了。
    里面的 if (msg instanceof TextMessage) 干扰了你的思维。
    最好养成好的写代码习惯,减少无意间出错的概率。msg = tSubscriber.receive(100);
    while (msg != null) {
       if (msg instanceof TextMessage) {
          txtMsg = (TextMessage) msg;
          System.out.println("Receive Msg from " + tName + " : "  + txtMsg.getText());
       }
       
       msg = tSubscriber.receive(100);
    }