我在2个JBoss EAP 7.1服务器(嵌入了ActiveMQ Artemis)之间使用远程JMS通信时遇到一些问题。
部署在第二台服务器上的EJB MDB尝试访问部署在第一台服务器上的Artemis队列(同一台机器,但不同的端口)。
MDB客户端(XA用例):
1)使用第一个服务器导出的请求队列中的消息
2)处理消息内容,包括数据库更新
3)将响应发送到同一远程服务器公开的答复队列
因此,第一台服务器导出3个(Artemis)队列: -TestQueueReq,用于第二个应用服务器消耗的请求 -TestQueueRep,用于第二个应用服务器发送的答复 -DLQTestQueue,用于死信队列
从第一个服务器配置中提取:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
<server name="default">
<security enabled="false"/>
<address-setting name="jms.queue.TestQueue#" dead-letter-address="jms.queue.DLQTestQueue" expiry-address="jms.queue.ExpiryQueue" redelivery-delay="500" redelivery-multiplier="2.0" max-delivery-attempts="3" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/>
( …/…)
<jms-queue name="DLQTestQueue" entries="java:/jms/queue/DLQTestQueue"/>
<jms-queue name="TestQueueReq" entries="java:/jms/queue/TestQueueReq java:jboss/exported/jms/queue/TestQueueReq" durable="true"/>
<jms-queue name="TestQueueRep" entries="java:/jms/queue/TestQueueRep java:jboss/exported/jms/queue/TestQueueRep" durable="true"/>
<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
</server>
</subsystem>
中所述配置第二台服务器
<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
<server name="default">
<security enabled="false"/>
:…/…)
<http-connector name="remote-http-connector" socket-binding="remote-server" endpoint="http-acceptor"/>
<http-acceptor name="http-acceptor" http-listener="default"/>
<pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/>
<pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector"/>
</server>
</subsystem>
外部上下文绑定也根据此官方文档在第二台服务器上配置:https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.0/html/configuration_guide/configuring_the_naming_subsystem
发送到TestQueueReq的消息已被MDB正确使用。
@ResourceAdapter("remote-artemis")
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "TestQueueReq")
}, messageListenerInterface = MessageListener.class)
@ApplicationScoped
public class ExampleSFBean implements ExampleSF, MessageListener {
@Override
public void onMessage(final Message message) {
…
当我们尝试在MDB中将消息发送到答复队列时,就会发生问题。 我在MDB中尝试了许多不同的资源注入策略:
@Inject
@JMSConnectionFactory("java:/jms/remoteCF")
private JMSContext jmsContext;
@Resource (lookup = "java:global/remoteContext")
private Context remoteContext;
@Resource (lookup="java:global/TestQueueRep")
private Queue queueRep;
但是由于注入/查找问题,我们在尝试发送响应时仍然会遇到异常情况。
Caused by: java.lang.RuntimeException: javax.naming.InvalidNameException: WFNAM00007: Invalid URL scheme name
“空” 在org.jboss.as.naming.subsystem.NamingBindingAdd $ LookupManagedReferenceFactory.getReference(NamingBindingAdd.java:451) 在org.jboss.as.naming.subsystem.NamingBindingAdd $ MutableManagedReferenceFactory.getReference(NamingBindingAdd.java:354)处 在org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:143) ...另外99个 原因:javax.naming.InvalidNameException:WFNAM00007:无效的URL方案名称“空” 在org.wildfly.naming.client.WildFlyRootContext.getProviderContext(WildFlyRootContext.java:808) 在org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:155) 在javax.naming.InitialContext.lookup(InitialContext.java:421)
谢谢
答案 0 :(得分:0)
您是否在消息服务器上创建了具有来宾角色的应用程序用户(如果没有,请参阅此https://www.youtube.com/watch?v=Ef0HFbyaHFs 在我的情况下,我已经使用密码“ Welcome1!”创建了一个名为MSGTEST的用户。因此您在其他服务器上的输入应如下所示。
创建该用户后,需要添加池化连接工厂 带有属性 user =“ MSGTEST” password =“ Welcome1!”
<pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector" transaction="xa" user="MSGTEST" password="Welcome1!" />
<pooled-connection-factory name="remote-artemis" entries="java:/jms/remoteCF" connectors="remote-http-connector" transaction="xa" user="MSGTEST" password="Welcome1!" />
来自正确的软件包 import org.jboss.ejb3.annotation.ResourceAdapter;
因为这不起作用==>导入org.jboss.annotation.ejb.ResourceAdapter;
希望这会有所帮助。我在machine1上创建消息服务器,并在Machine2上部署了MDB。奏效了。
在两种情况下都忘记提及我使用了standalone-full.xml,因为它具有用于活动MQ消息传递的所有子系统。仅使用standalone.xml将不起作用。小心!