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ı?
cevap
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>
Bu harika çalıştı, teşekkürler. –
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
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.
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
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. –
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? –