使用 Wildfly 10.1.0.Final 和自定义 JMS 消息队列,我可以使用 JNDI 名称
InVmConnectionFactory
在虚拟机内 java:/ConnectionFactory
成功发送和接收消息。
但是,我无法让带有 JNDI 名称
pooled-connection-factory
的新 java:/JmsXA
工作,消息只是丢失并且不会显示在任何地方(还检查了 Wildfly 控制台的运行时 JMS 服务器视图 (Runtime->Subsystems->Messaging - ActiveMQ
)。
因为
active-mq
池连接工厂被标记为DefaultJMSConnectionFactory
,使用JMS 2.0 API并简单地通过注入JMSContext
@Inject
JmsContext jmsContext;
开箱即用,无法发送消息。
这很奇怪,我在最近使用包含的 Artemis (ActiveMQ) 代理的 Wildfly 10 配置中没有发现类似的问题。连接工厂默认定义为
transactional,但这对于我们的场景来说太过分了,所以我将其关闭:
<pooled-connection-factory name="activemq-ra" entries="java:/JmsXA" connectors="in-vm" transaction="none"/>
我检查了
Wildfly消息配置指南以及各种涵盖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"));
}
}
仍然需要被声明为非事务性,即使连接工厂已经这样配置:
@PostConstruct
@TransactionAttribute(TransactionAttributeType.NEVER)
private void init() {
...
现在可以使用了!