2013-01-15 26 views
18

Ekibimin uygulamalarından biri için kuyruğa alma çözümleri araştırıyorum. İdeal olarak, hem hafif, hem de süreç içi aracı olarak (iş parçacıkları arasında düşük verimli mesajlaşma için) ve harici bir aracı olarak yapılandırılabilen bir şey isteriz. Orada yapabileceğiniz bir MQ sunucusu var mı? Çoğu, harici bir varlık olarak kurulum gerektiriyor gibi görünüyor. ZeroMQ bir süreç içi çözüm için en yakın gelmek gibi görünüyor, ama daha fazla "steroidler UDP soket" gibi görünüyor ve güvenilir teslimat gerekir.Java işlemine gömülü çalışabilen herhangi bir MQ sunucusu var mı?

+1

ben http://ffmq.sourceforge.net/index (örneğin [ffmq] (http://stackoverflow.com/questions/2507536/lightweight-jms-broker cevapları ilginç bilgi içerdiğini düşünüyorum .html) öneri). ActiveMQ başka bir ağır aday olsa da, aynı zamanda gömülebilir. – fvu

+1

Like @fvu, ActiveMQ'nun ZeroMQ'dan biraz daha ağır olduğunu ancak gömülü bir işlem olarak çok iyi çalıştığını söyledi. Ve eğer Bahar kullanıyorsanız, kurmak gerçekten çok kolay. –

+0

ZeroMQ, güvenilir bir aktarım sağlayan TCP (UDP değil) üzerindeki diğer şeylerin arasında çalışır. Bununla birlikte, kalıcı bir kuyruğa başvuruyor musunuz? Yani diske destekli? –

cevap

10

ActiveMQ'un ZeroMQ'dan biraz daha ağır olduğunu söylediğimiz gibi, gömülü bir işlem olarak çok işe yarar. Burada, Spring ve ActiveMQ ile basit bir örnek.

sıra test etmek için kullanılacak mesaj dinleyici:

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 bağlam konfigürasyonu:

<?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> 

JUnit testi:

@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()); 
      } 
     } 
    } 
} 

bağımlılıklar eklemek 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

Bu harika çalıştı, teşekkürler. –

+0

ActiveMQ ile karşılaştığımız sorunlar (ve şu anda alternatifler için hızlı arama yapıyorum): (a) kapattığınızda, tüm dişleri durmuyor. (b) API'larının birçoğu, inşaat sırasında otomatik start hizmetlerini başlatırken, aynı zamanda start() gibi yöntemlere sahip olmak, API'yi açıklığa kavuşturmak ve muhtemelen (a) 'ya katkıda bulunmak. (c) daha çok senkronize blok ekleyerek, çok iş parçacıklı, çok sayıda iş parçacığı tarafından "düzeltildi". (d) özellikle keşif modunda kullanıldığında şüpheli güvenlik. (Pro-ipucu: ofisin etrafında eğlenceli zamanlar için haydut bir mesaj kuyruk sunucusu kurun!) – Trejkaz

2

WebSphere MQ istemcisi, multicast pub/sub gerçekleştirme kapasitesine sahiptir. Bu, bağlantıyı kurmak için bir kuyruk yöneticisi gerekli olsa da, kuyruk yöneticisini atlayan bir istemci-istemci yeteneği sağlar.