java - 是否有任何 MQ 服务器可以嵌入在 Java 进程中运行?

标签 java jms message-queue amqp mq

我正在为我团队的一个应用研究排队解决方案。理想情况下,我们希望既可以配置为轻量级的进程内代理(用于线程之间的低吞吐量消息传递)也可以配置为外部代理。有没有可以做到这一点的 MQ 服务器?大多数似乎需要设置为外部实体。 ZeroMQ 似乎最接近进程内解决方案,但它似乎更像是“类固醇上的 UDP 套接字”,我们需要可靠的交付。

最佳答案

就像我们说的,ActiveMQZeroMQ 重一点,但它作为一个嵌入式进程运行得非常好。 这里是一个简单的例子,带有 SpringActiveMQ

将用于测试队列的消息监听器:

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 上下文配置:

<?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 测试:

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

要添加到 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>

关于java - 是否有任何 MQ 服务器可以嵌入在 Java 进程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14342430/

相关文章:

运行 JMS 消费者时出现 java.lang.NoClassDefFoundError

java - QueueBrowser 不返回所有消息

java - 我如何生成 aiesec API 的访问 token

java - 安卓 : ImageButton Width & Height

java - 将 Log4J JMSAppender 与 ActiveMQ 结合使用

.NET:消息队列与直接插入 MongoDB

python - Hook 并在 Windows 消息队列中记录 "everything"

java - 许多生产者和一个消费者同时轮询所有消息

java - 无法在 selenium 中使用显式(流畅)等待来定位动态加载的弹出窗口

java - 通过构造函数将变量从子类添加到父类(super class)