2014-07-24 72 views
4

我是JMS的新手,经过长时间的重新搜索后,我去了一个代码连接到JMS并发布消息。使用JAVA在JMS队列中发布消息

问题是我需要在远程队列中发布消息,但我不知道如何建立连接并发布消息。

服务器类型:TIBCO EMS
服务器主机** ***** .NET
PORT* **的用户名:用户
密码时应 :user123
队列*。 *。订单管理。 .1

我想建立连接,发布一个简单的消息并将其恢复。 请帮忙!在此先感谢

代码,我从互联网

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Hashtable; 
import javax.jms.*; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
public class emm { 


     // Defines the JNDI context factory. 
     public final static String JNDI_FACTORY="com.tibco.tibjms.naming.TibjmsInitialContextFactory"; 

     // Defines the JMS context factory. 
     public final static String JMS_FACTORY="jms/TestConnectionFactory"; 

     // Defines the queue. 
     public final static String QUEUE="CPW.GBR.POR.Public.Request.Order.Management.UpdateProvisioningStatus.1"; 

     private QueueConnectionFactory qconFactory; 
     private ConnectionFactory conFactory; 
     private QueueConnection qcon; 
     private QueueSession qsession; 
     private QueueSender qsender; 
     private Queue queue; 
     private TextMessage msg; 

     /** 
      * Creates all the necessary objects for sending 
      * messages to a JMS queue. 
      * 
      * @param ctx JNDI initial context 
      * @param queueName name of queue 
      * @exception NamingException if operation cannot be performed 
      * @exception JMSException if JMS fails to initialize due to internal error 
      */ 
     public void init(Context ctx, String queueName) 
      throws NamingException, JMSException 
     { 

      qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); 
      qcon = qconFactory.createQueueConnection(); 
      qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      queue = (Queue) ctx.lookup(queueName); 
      qsender = qsession.createSender(queue); 
      msg = qsession.createTextMessage(); 
      qcon.start(); 
     } 

     /** 
      * Sends a message to a JMS queue. 
      * 
      * @param message message to be sent 
      * @exception JMSException if JMS fails to send message due to internal error 
      */ 
     public void send(String message) throws JMSException { 
      msg.setText(message); 
      qsender.send(msg); 
     } 

     /** 
      * Closes JMS objects. 
      * @exception JMSException if JMS fails to close objects due to internal error 
      */ 
     public void close() throws JMSException { 
      qsender.close(); 
      qsession.close(); 
      qcon.close(); 
     } 
     /** main() method. 
     * 
     * @param args WebLogic Server URL 
     * @exception Exception if operation fails 
     */ 
     public static void main(String[] args) throws Exception { 
      if (args.length != 1) { 
      System.out.println("Usage: java examples.jms.queue.QueueSend WebLogicURL"); 
      return; 
      } 
      InitialContext ic = getInitialContext(args[0]); 
      emm qs = new emm(); 
      qs.init(ic, QUEUE); 
      readAndSend(qs); 
      qs.close(); 
     } 

     private static void readAndSend(emm qs) 
      throws IOException, JMSException 
     { 
      BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in)); 
      String line=null; 
      boolean quitNow = false; 
      do { 
      System.out.print("Enter message (\"quit\" to quit): \n"); 
      line = msgStream.readLine(); 
      if (line != null && line.trim().length() != 0) { 
       qs.send(line); 
       System.out.println("JMS Message Sent: "+line+"\n"); 
       quitNow = line.equalsIgnoreCase("quit"); 
      } 
      } while (! quitNow); 

     } 

     private static InitialContext getInitialContext(String url) 
      throws NamingException 
     { 
      Hashtable env = new Hashtable(); 
      env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); 
      env.put(Context.PROVIDER_URL, url); 
      return new InitialContext(env); 
     } 
     } 
+0

你能描述一下这个问题吗,你会得到什么错误?你传递命名服务的位置的应用程序(名为“WebLogicURL”某种原因)? –

+0

我要连接我的意思是建立连接的权利..我不知道该怎么做..造成队列是远程队列。它有我在上面提到 –

+0

的主要方法希望的URL的初始上下文几个证书你的命名服务。这就是“远程”方面的地方(类似于'tcp:// hostname:7222',但这取决于你的配置)。当您在'qconFactory.createQueueConnection(usr,pwd)' –

回答

4

最后从不同的来源,我发现最好的可能的方式为这一点。 这段代码肯定会起作用。我试过了,目前正在我的机器上运行

import java.util.Properties; 

import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.JMSException; 
import javax.jms.MessageProducer; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.QueueConnectionFactory; 
import javax.jms.QueueReceiver; 
import javax.jms.QueueSession; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import javax.naming.*; 

public class JMSExample { 

    static String serverUrl = "tcp://10.101.111.101:10001"; // values changed 
    static String userName = "user"; 
    static String password = "pwd"; 

    static QueueConnection connection; 
    static QueueReceiver queueReceiver; 
    static Queue queue; 

    static TextMessage message; 

    public static void sendTopicMessage(String topicName, String messageStr) { 

     Connection connection = null; 
     Session session = null; 
     MessageProducer msgProducer = null; 
     Destination destination = null; 


     try { 
      TextMessage msg; 

      System.out.println("Publishing to destination '" + topicName 
        + "'\n"); 

      ConnectionFactory factory = new com.tibco.tibjms.TibjmsConnectionFactory(
        serverUrl); 

      connection = factory.createConnection(userName, password); 


      session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE); 



      destination = session.createQueue(topicName); 


      msgProducer = session.createProducer(null); 



      msg = session.createTextMessage(); 

      msg.setStringProperty("SourceId", userName); 
      msg.setStringProperty("BusinessEvent", password); 


      msg.setText(messageStr); 


      msgProducer.send(destination, msg); 



      System.out.println("Published message: " + messageStr); 


      connection.close(); 

     } catch (JMSException e) { 
      e.printStackTrace(); 
     } 
    } 



    public static void main(String[] args) throws JMSException { 
     // TODO Auto-generated method stub 

     JMSExample.sendTopicMessage("***.***.***.**.**.Order.Management.***.1", 
       "Hi"); 
     //System.out.println(getMessage()); 

    } 
2

正如我所提到的灵感一些代码(略有改善你的代码。不是我想看到生产中!

// Use the domain-agnostic API 
private Connection connection;ery 
private Session session; 
private MessageProducer producer; 
private Queue queue; 

public void init(Context ctx, String queueName) { 

    try { 
     ConnectionFactory cnf = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); 
     queue = (Queue) ctx.lookup(queueName); 


     connection = cnf.createConnection("user", "user123"); 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     producer = session.createProducer(queue); 

     connection.start(); 
    } catch (NamingException e) { 
     throw new RuntimeException(e); 
    } catch (JMSException e) { 
     throw new RuntimeException(e); 
    } 
} 

并让你发送像这样(不要重复使用相同的Message对象,但为你发送的每条消息创建一个新对象)

public void send(String message) throws JMSException { 
    TextMessage msg = session.createTextMessage(); 
    msg.setText(message); 
    producer.send(msg); 
} 

在main方法将一个try..finally围绕代码:

try { 
     readAndSend(qs); 
    } finally { 
     qs.close(); 
    } 

您所使用的代码不是很好(轻描淡写)。它对于生产系统来说编程太脆弱了。你不应该像这个程序那样使用状态。

此外,没有必要使用特定于域的JMS API。您可以使用域(队列/主题)不可知的一个。

当您运行在JNDI URL方案通过为您的TIBCO服务器。