[英]Cannot send message to local JMS Queue over default Artemis/ActiveMQ in Wildfly 10
使用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定义为事务性的,但这对于我们的方案而言是过大的,所以我将其关闭:
<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() {
...
现在工作!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.