2013-01-15 29 views
18

Tôi đang nghiên cứu các giải pháp xếp hàng cho một trong các ứng dụng của nhóm của tôi. Lý tưởng nhất là chúng tôi muốn một cái gì đó có thể được cấu hình cả hai như là một nhà môi giới nhẹ, trong quá trình (cho nhắn tin thông lượng thấp giữa các chủ đề) và như một nhà môi giới bên ngoài. Có một máy chủ MQ ngoài kia có thể làm điều này không? Hầu hết dường như yêu cầu thiết lập như một thực thể bên ngoài. ZeroMQ dường như đến gần nhất với một giải pháp trong quá trình, nhưng nó có vẻ là nhiều hơn một "UDP socket on steroid", và chúng tôi cần giao hàng đáng tin cậy.Có bất kỳ máy chủ MQ nào có thể chạy được nhúng trong một quy trình Java không?

+1

Tôi nghĩ rằng câu trả lời cho http://stackoverflow.com/questions/2507536/lightweight-jms-broker chứa thông tin thú vị (ví dụ: [ffmq] (http://ffmq.sourceforge.net/index .html) gợi ý). ActiveMQ là một ứng viên khác nặng hơn, nhưng nó cũng có thể nhúng được. – fvu

+1

Giống như @fvu cho biết, ActiveMQ hơi nặng hơn ZeroMQ nhưng nó hoạt động thực sự tốt như một quá trình nhúng. Và nếu bạn đang sử dụng Spring, thật dễ dàng để thiết lập. –

+0

ZeroMQ chạy trong số những thứ khác trên đầu trang của TCP (không UDP) cung cấp một giao thông đáng tin cậy. Tuy nhiên, bạn đang đề cập đến một hàng đợi liên tục? I E. được sao lưu vào đĩa? –

Trả lời

10

Giống như chúng tôi đã nói ActiveMQ hơi nặng hơn ZeroMQ nhưng nó hoạt động thực sự tốt như một quy trình được nhúng. Đây là một ví dụ đơn giản với SpringActiveMQ.

Các người nghe thông điệp rằng sẽ được sử dụng để kiểm tra hàng đợi: Cấu hình

public class TestMessageListener implements MessageListener { 

    private static final Logger logger = LoggerFactory.getLogger(TestMessageListener.class); 

    @Override 
    public void onMessage(Message message) { 

     /* Receive the text message */ 
     if (message instanceof TextMessage) { 

      try { 
       String text = ((TextMessage) message).getText(); 
       System.out.println("Message reception from the JMS queue : " + text); 

      } catch (JMSException e) { 
       logger.error("Error : " + e.getMessage()); 
      } 

     } else { 
      /* Handle non text message */ 
     } 
    } 
} 

ActiveMQ bối cảnh:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="jmsQueueConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory"> 
     <property name="brokerURL"> 
      <value>tcp://localhost:61617</value> 
     </property> 
    </bean> 

    <bean id="pooledJmsQueueConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> 
     <constructor-arg ref="jmsQueueConnectionFactory" /> 
    </bean> 

    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue"> 
     <constructor-arg value="messageQueue" /> 
    </bean> 

    <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate"> 
     <constructor-arg ref="pooledJmsQueueConnectionFactory" /> 
     <property name="pubSubDomain" value="false"/> 
    </bean> 

    <bean id="testMessageListener" class="com.example.jms.TestMessageListener" /> 

    <bean id="messageQueuelistenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="pooledJmsQueueConnectionFactory" /> 
     <property name="destination" ref="QueueDestination" /> 
     <property name="messageListener" ref="testMessageListener" /> 
     <property name="concurrentConsumers" value="5" /> 
     <property name="acceptMessagesWhileStopping" value="false" /> 
     <property name="recoveryInterval" value="10000" /> 
     <property name="cacheLevelName" value="CACHE_CONSUMER" /> 
    </bean> 

</beans> 

Các thử nghiệm JUnit:

@ContextConfiguration(locations = {"classpath:/activeMQ-context.xml"}) 
public class SpringActiveMQTest extends AbstractJUnit4SpringContextTests { 

    @Autowired 
    private JmsTemplate template; 

    @Autowired 
    private ActiveMQDestination destination; 

    @Test 
    public void testJMSFactory() { 
     /* sending a message */ 
     template.convertAndSend(destination, "Hi"); 

     /* receiving a message */ 
     Object msg = template.receive(destination); 
     if (msg instanceof TextMessage) { 
      try { 
       System.out.println(((TextMessage) msg).getText()); 
      } catch (JMSException e) { 
       System.out.println("Error : " + e.getMessage()); 
      } 
     } 
    } 
} 

Các Dependencies để thêm vào số pom.xml:

<!-- Spring --> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-jms</artifactId> 
    <version>${org.springframework-version}</version> 
</dependency> 

<!-- ActiveMQ --> 
<dependency> 
    <groupId>org.apache.activemq</groupId> 
    <artifactId>activemq-all</artifactId> 
    <version>5.6.0</version> 
    <scope>compile</scope> 
</dependency> 

<dependency> 
    <groupId>org.apache.activemq</groupId> 
    <artifactId>activemq-pool</artifactId> 
    <version>5.6.0</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.activemq</groupId> 
    <artifactId>activemq-core</artifactId> 
    <version>5.6.0</version> 
</dependency> 
+0

Điều này làm việc rất tốt, cảm ơn bạn. –

+0

Các vấn đề chúng ta đã thấy với ActiveMQ (và tại sao tôi hiện đang tìm kiếm nhanh các lựa chọn thay thế): (a) khi bạn tắt nó, nó không dừng tất cả các chủ đề của nó. (b) nhiều API tự động bắt đầu dịch vụ của mình khi xây dựng trong khi cũng có các phương thức start() - làm cho API không rõ ràng và có thể đóng góp cho (a). (C) vô số các vấn đề với đa luồng, mà cho đến nay đã được "cố định" bởi họ thêm khối đồng bộ hơn. (d) bảo mật đáng ngờ, đặc biệt khi được sử dụng trong chế độ khám phá. (Pro-tip: thiết lập một máy chủ xếp hàng tin nhắn rogue cho thời gian vui vẻ xung quanh văn phòng!) – Trejkaz

2

Máy khách WebSphere MQ có khả năng thực hiện multicast pub/sub. Điều này cung cấp khả năng từ máy khách đến máy khách bỏ qua trình quản lý hàng đợi, mặc dù người quản lý hàng đợi được yêu cầu thiết lập kết nối.

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