我目前正在为持久订阅编写一个messenger服务(它可能最终会变得不耐用,我们仍在讨论这一点),并且正在寻找一些关于如何处理我们的服务器由于某种原因暂时关闭的场景,我们需要自动重新订阅该主题。下面是它如何连接的示例代码:设置JMS连接以便自动重新连接的理想方法
public void DurableChatter(String broker, String username, String password)
{
javax.jms.MessageProducer publisher = null;
javax.jms.MessageConsumer subscriber = null;
javax.jms.Topic topic = null;
//Create a connection:
try{
javax.jms.ConnectionFactory factory;
factory = (new progress.message.jclient.ConnectionFactory (broker));
connection = factory.createConnection (username, password);
//Durable Subscriptions are indexed by username, clientID and subscription name
//It is a good proactice to set the clientID:
connection.setClientID(CLIENT_ID);
pubSession = connection.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
subSession = connection.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
}
catch (javax.jms.JMSException jmse){
System.err.println ("Error: Cannot connect to Broker - " + broker);
jmse.printStackTrace();
System.exit(1);
}
//Create Publisher and Durable Subscriber:
try{
topic = pubSession.createTopic(APP_TOPIC);
subscriber = subSession.createDurableSubscriber(topic, "SampleSubscription");
subscriber.setMessageListener(this);
publisher = pubSession.createProducer(topic);
connection.start();
}
catch (javax.jms.JMSException jmse){
System.out.println("Error: connection not started.");
jmse.printStackTrace();
System.exit(1);
}
//Wait for user input
try
{
System.out.println("Enter text to send as message and press enter.");
java.io.BufferedReader stdin =
new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
while (true)
{
String s = stdin.readLine();
if(s == null){
exit();
}
else if (s.length()>0)
{
try
{
javax.jms.TextMessage msg = pubSession.createTextMessage();
msg.setText(username + ": " + s);
//Publish the message persistantly:
publisher.send(
msg, //message
javax.jms.DeliveryMode.PERSISTENT, //publish persistantly
javax.jms.Message.DEFAULT_PRIORITY,//priority
MESSAGE_LIFESPAN); //Time to Live
}
catch (javax.jms.JMSException jmse){
System.err.println("Error publishing message:" + jmse.getMessage());
}
}
}
}
catch (java.io.IOException ioe)
{
ioe.printStackTrace();
}
}
如果这就是你要求的,它不一定是瞬间的。无论如何,这可以通过try/catch块来完成吗? – Icebreaker 2012-07-20 17:16:14
仅当底层连接断开时引发某种异常。我不能不告诉你。 – radai 2012-07-22 20:03:32