2012-01-26 29 views
18

Có hai chương trình: người đăng ký và nhà xuất bản ... Người đăng ký có thể đặt tin nhắn lên chủ đề và tin nhắn được gửi thành công. Khi tôi kiểm tra máy chủ activemq trên trình duyệt của mình, nó hiển thị 1 tin nhắn được enqueued. Nhưng khi tôi chạy mã của người tiêu dùng, nó không nhận được tin nhắnACTIVEMQ- người đăng ký nhà xuất bản xin chào ví dụ thế giới

Dưới đây là các mã sản xuất:

import javax.jms.*; 

import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 

public class producer { 

    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL; 

    public static void main(String[] args) throws JMSException { 

     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
     Connection connection = connectionFactory.createConnection(); 
     connection.start(); 

     // JMS messages are sent and received using a Session. We will 
     // create here a non-transactional session object. If you want 
     // to use transactions you should set the first parameter to 'true' 
     Session session = connection.createSession(false, 
       Session.AUTO_ACKNOWLEDGE); 

     Topic topic = session.createTopic("testt"); 

     MessageProducer producer = session.createProducer(topic); 

     // We will send a small text message saying 'Hello' 

     TextMessage message = session.createTextMessage(); 

     message.setText("HELLO JMS WORLD"); 
     // Here we are sending the message! 
     producer.send(message); 
     System.out.println("Sent message '" + message.getText() + "'"); 

     connection.close(); 
    } 
} 

Sau khi tôi chạy mã này đầu ra tại giao diện điều khiển là:

26 Jan, 2012 2:30:04 PM org.apache.activemq.transport.failover.FailoverTransport doReconnect 
INFO: Successfully connected to tcp://localhost:61616 
Sent message 'HELLO JMS WORLD' 

Và đây là mã người tiêu dùng:

import javax.jms.*; 

import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 

public class consumer { 
    // URL of the JMS server 
    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL; 

    // Name of the topic from which we will receive messages from = " testt" 

    public static void main(String[] args) throws JMSException { 
     // Getting JMS connection from the server 

     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
     Connection connection = connectionFactory.createConnection(); 
     connection.start(); 

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

     Topic topic = session.createTopic("testt"); 

     MessageConsumer consumer = session.createConsumer(topic); 

     MessageListener listner = new MessageListener() { 
      public void onMessage(Message message) { 
       try { 
        if (message instanceof TextMessage) { 
         TextMessage textMessage = (TextMessage) message; 
         System.out.println("Received message" 
           + textMessage.getText() + "'"); 
        } 
       } catch (JMSException e) { 
        System.out.println("Caught:" + e); 
        e.printStackTrace(); 
       } 
      } 
     }; 

     consumer.setMessageListener(listner); 
     connection.close(); 

    } 
}  

Sau khi tôi chạy mã này, nó không hiển thị bất cứ điều gì. Ai đó có thể giúp tôi khắc phục vấn đề này không?

+1

đoán bạn sắp đóng kết nối quá sớm. Trước khi người tiêu dùng của bạn bắt đầu tiêu thụ, kết nối được đóng lại và phương pháp chính kết thúc! –

Trả lời

13

Vấn đề của bạn là người tiêu dùng của bạn đang chạy và sau đó tắt ngay lập tức.

Hãy thử thêm này vào tiêu dùng của bạn:

consumer.setMessageListener(listner); 

    try { 
     System.in.read(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    connection.close(); 

này sẽ đợi cho đến khi bạn nhấn một phím trước khi dừng lại.

Những điều khác để xem xét:

  • Sử dụng một khối finally cho gần
  • quy ước đặt tên
  • Java khuyến khích sử dụng chữ hoa cho chữ cái đầu tiên của một lớp
+0

không có sir mã ở trên mà bạn đã đề cập cũng không hoạt động: ( xin vui lòng HELP ... bị kẹt trong dự án! –

11

Vấn đề chính (ngoài ứng dụng đóng cửa nhanh chóng) là bạn đang gửi đến một Chủ đề. Chủ đề không giữ lại tin nhắn vì vậy nếu bạn chạy ứng dụng của mình sản xuất và sau đó chạy người tiêu dùng, người tiêu dùng sẽ không nhận được bất kỳ thứ gì vì nó chưa được đăng ký chủ đề tại thời điểm thư được gửi. Nếu bạn khắc phục sự cố tắt máy và sau đó chạy người tiêu dùng trong một thiết bị đầu cuối và sau đó chạy nhà sản xuất, bạn sẽ thấy thông báo mà người tiêu dùng của bạn nhận được. Nếu bạn muốn lưu giữ tin nhắn thì bạn cần phải sử dụng một Hàng đợi sẽ giữ tin nhắn cho đến khi ai đó tiêu thụ nó.

+3

xin lỗi bạn bè lỗi đã được sửa .. tôi đã thực hiện mô-đun nhà xuất bản trước rồi ...tuy nhiên, đó phải là mô-đun đăng ký trước rồi nhà xuất bản ... cảm ơn các đề xuất :) –

2

chỉ số:

  • làm việc với một không đợi một chủ đề. thư trong chủ đề sẽ bị hủy khi không có người tiêu dùng nào, chúng KHÔNG được tiếp tục.
  • thêm connection.start() sau khi đặt trình nghe tin nhắn. bạn nên bắt đầu một kết nối khi tất cả người tiêu dùng/nhà sản xuất được thiết lập đúng cách.
  • đợi một thời gian trước khi đóng lại kết nối.

chủ đề có thể sẽ là nguồn thất bại quan trọng nhất của bạn.

2

Nhà sản xuất nhà sản xuất của bạn là chính xác. Nó chạy trơn tru.

Nhưng, người tiêu dùng của bạn không chính xác & bạn phải sửa đổi.

  • Đầu tiên, thêm setClientID ("any_string_value") sau khi tạo kết nối đối tượng;

    ví dụ: Connection connection = connectionFactory.createConnection(); // need to setClientID value, any string value you wish connection.setClientID("12345");

  • thứ hai, sử dụng phương pháp createDurableSubscriber() thay vì createConsumer() để truyền tin nhắn qua chủ đề.

    MessageConsumer consumer = session.createDurableSubscriber(topic,"SUB1234");

Đây là sửa đổi comsumer lớp:

package mq.test; 

import javax.jms.*; 

import org.apache.activemq.ActiveMQConnection; 
import org.apache.activemq.ActiveMQConnectionFactory; 

public class consumer { 
    // URL of the JMS server 
    private static String url = ActiveMQConnection.DEFAULT_BROKER_URL; 

    // Name of the topic from which we will receive messages from = " testt" 

    public static void main(String[] args) throws JMSException { 
     // Getting JMS connection from the server 

     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); 
     Connection connection = connectionFactory.createConnection(); 

     // need to setClientID value, any string value you wish 
     connection.setClientID("12345"); 

     try{ 
     connection.start(); 
     }catch(Exception e){ 
      System.err.println("NOT CONNECTED!!!"); 
     } 
     Session session = connection.createSession(false, 
       Session.AUTO_ACKNOWLEDGE); 

     Topic topic = session.createTopic("test_data"); 

     //need to use createDurableSubscriber() method instead of createConsumer() for topic 
     // MessageConsumer consumer = session.createConsumer(topic); 
     MessageConsumer consumer = session.createDurableSubscriber(topic, 
       "SUB1234"); 

     MessageListener listner = new MessageListener() { 
      public void onMessage(Message message) { 
       try { 
        if (message instanceof TextMessage) { 
         TextMessage textMessage = (TextMessage) message; 
         System.out.println("Received message" 
           + textMessage.getText() + "'"); 
        } 
       } catch (JMSException e) { 
        System.out.println("Caught:" + e); 
        e.printStackTrace(); 
       } 
      } 
     }; 

     consumer.setMessageListener(listner); 
     //connection.close(); 

    } 
} 

Bây giờ, mã của bạn sẽ chạy thành công.

Các vấn đề liên quan