【问题标题】:Cannot send message to local JMS Queue over default Artemis/ActiveMQ in Wildfly 10无法通过 Wildfly 10 中的默认 Artemis/ActiveMQ 向本地 JMS 队列发送消息
【发布时间】:2017-09-07 22:15:01
【问题描述】:

使用 Wildfly 10.1.0.Final 和自定义 JMS 消息队列,我可以通过 JNDI 名称 java:/ConnectionFactory 的 in-vm InVmConnectionFactory 成功发送和接收消息。

但是,我无法让带有 JNDI 名称 java:/JmsXA 的新 pooled-connection-factory 工作,消息只会丢失并且不会显示在任何地方(还检查了 wildfly 控制台的运行时 JMS 服务器视图 (Runtime->Subsystems->Messaging - ActiveMQ)。

因为active-mq 池化连接工厂被标记为DefaultJMSConnectionFactory,所以使用JMS 2.0 API 并简单地通过注入JMSContext

@Inject
JmsContext jmsContext;

消息发送将不起作用开箱即用。

这很奇怪,我发现最近使用包含的 Artemis (ActiveMQ) 代理的 wildfly 10 配置没有类似问题。

connection-factory 默认定义为 transactional,但这对我们的场景来说太过分了,所以我把它关掉了:

<pooled-connection-factory name="activemq-ra" entries="java:/JmsXA" connectors="in-vm" transaction="none"/>

我查看了Wildfly messaging configuration guide 和各种涵盖 JMS 1.1/2.0 的在线示例,但目前没有发现任何线索。

示例代码:

@Startup  // just for a simple test sending a message right on startup
public class MessageService {

    @Inject
    @JMSConnectionFactory("java:/JmsXA")  // activemq-ra pooled-connection-factory
    private JMSContext jmsContext;

    @Resource(lookup = JAVA_JMS_PROGRESS_QUEUE)
    private Queue progressQueue;

    public MessageService() {
    }

    @PostConstruct
    private void init() {
        final JMSProducer jmsProducer = jmsContext.createProducer();
        jmsProducer.send(progressQueue, "Hello queue"));
    }
}

【问题讨论】:

    标签: configuration jms activemq wildfly


    【解决方案1】:

    结果表明发送消息的方法仍然需要声明为非事务性的,即使连接工厂已经这样配置:

    @PostConstruct
    @TransactionAttribute(TransactionAttributeType.NEVER)
    private void init() {
    ...
    

    现在可以使用了!

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 2020-04-05
      • 2015-08-25
      • 2017-01-10
      • 2016-06-23
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多