JMS&MQ系列之普通Java程序中加载配置

2019-03-14 13:20|来源: geloin

在普通Java程序(我指的是非Spring等)中加载ActiveMQ配置有两种方式:使用配置文件和不使用配置文件。

        1. 使用配置文件

        首先编写配置文件,我通常会把src目录删除,然后另建两个source foulder,一个为src/java,用于放置源代码;一个为src/config,用于放置配置文件,如下图所示:


        所以我把ActiveMQ的配置文件activemq.xml放置在src/config下面,而在src/java中添加包和类,activemq.xml文件的内容如下所示:

<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:amq="http://activemq.apache.org/schema/core"
  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-2.0.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
	<broker xmlns="http://activemq.apache.org/schema/core" brokerName="myBroker" dataDirectory="${activemq.base}/data">
		<transportConnectors>
			<transportConnector name="openwire" uri="tcp://localhost:61616" />
		</transportConnectors>
		<plugins>
			<simpleAuthenticationPlugin>
				<users>
					<authenticationUser username="admin" password="password" groups="admins,publishers,consumers" />
					<authenticationUser username="publisher" password="password" groups="publishers,consumers" />
					<authenticationUser username="consumer" password="password" groups="consumers" />
					<authenticationUser username="guest" password="password" groups="guests" />
				</users>
			</simpleAuthenticationPlugin>
		</plugins>
	</broker>	  
</beans>
和它对应的类如下所示:

/**
 * 
 * @author geloin
 * @date 2012-9-12 下午2:19:29
 */
package com.geloin.activemq.test2;

import java.net.URI;

import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;

/**
 * 
 * @author geloin
 * @date 2012-9-12 下午2:19:29
 */
public class MyConfiguration2 {

	/**
	 * 
	 * @author geloin
	 * @date 2012-9-12 下午2:19:29
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		System.setProperty("activemq.base",System.getProperty("user.dir"));
		String configUri = "xbean:/activemq.xml";
		URI brokerUri = new URI(configUri);
		BrokerService broker = BrokerFactory.createBroker(brokerUri);
		broker.start();
		
		System.out.println("\nPress any key to stop the broker\n");
		System.in.read();
	}

}
 你会看到在activemq.xml文件中使用了一个变量${activemq.base},所以在MyConfiguration2中我们首先就给activemq.base赋值,如下所示:

System.setProperty("activemq.base",System.getProperty("user.dir")); 
这样以后使用URI方式获取配置文件时,就可以顺便为其变量赋值。

2. 不使用配置文件,也就是硬代码方式,代码如下所示:

/**
 * 
 * @author geloin
 * @date 2012-9-12 下午1:38:54
 */
package com.geloin.activemq.test2;

import java.util.ArrayList;
import java.util.List;

import org.apache.activemq.broker.BrokerPlugin;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.security.AuthenticationUser;
import org.apache.activemq.security.SimpleAuthenticationPlugin;

/**
 * 
 * @author geloin
 * @date 2012-9-12 下午1:38:54
 */
public class MyConfiguration {

	/**
	 * 
	 * @author geloin
	 * @date 2012-9-12 下午1:38:57
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		BrokerService broker = new BrokerService();
		broker.setBrokerName("myBroker");
		broker.setDataDirectory("data/");
		
		SimpleAuthenticationPlugin authentication = new SimpleAuthenticationPlugin();
		List<AuthenticationUser> users = new ArrayList<AuthenticationUser>();
		users.add(new AuthenticationUser("admin","password","admins,publishers,consumers"));
		users.add(new AuthenticationUser("publisher","password","publishers,consumers"));
		users.add(new AuthenticationUser("consumer","password","consumers"));
		users.add(new AuthenticationUser("guest","password","guests"));
		authentication.setUsers(users);
		
		broker.setPlugins(new BrokerPlugin[]{authentication});
		broker.addConnector("tcp://localhost:61616");
		broker.start();
		
		System.out.println("\nPress any key to stop the broker\n");
		System.in.read();
	}

}
       对照配置文件和此处的硬代码,你会发现它们是一一对应的。

        使用硬代码方式时,需要注意两点:

        (1) plugins必须在connector前设置,即先broker.setPlugins,再broker.addConnector,位置不得错乱,否则初始化失败;

        (2) 在start之前,得先把plugins和connector设置好,否则也会导致初始化失败。

相关问答

更多
  • 这几乎总是由不完整的客户端安装和/或CLASSPATH问题引起的。 许多人抓取jar文件而不是执行完整安装,并不一定全部都完成。 除了确保所有必需的二进制文件存在以外,使用安装介质还提供了几项附加功能,例如诊断和跟踪。 它还确保可以应用维护。 WMQ客户端安装媒体可作为SupportPac MQC7免费下载。 CLASSPATH设置应如“ WebSphere MQ使用Java”手册中所述。 如果客户端安装是从IBM媒体执行的,并且根据文档设置了环境,则可以修复几乎所有情况,例如您在此处报告的情况。 有几个安 ...
  • 是的,他们仍然适用。 使用直接DLL代替服务器的服务器,你会发现你有更好的性能,因为DLL直接为服务器实现底层消息传递协议。 Yes, they still apply. You'll find that you have much better performance using a direct DLL for the server instead of a bridge, since the DLL directly implements the underlying messaging protoc ...
  • 没有更多上下文就无法确定,但它看起来像这个方法调用: initialContext.lookup(queueConnectionJndi); 返回com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle类型的对象,该对象无法强制转换为com.ibm.mq.jms.MQQueueConnectionFactory。 你能提供更多背景吗? the MQ jars which WAS is using and my application using are differe ...
  • CCDT不打算在文本编辑器中读取,它是二进制格式的文件。 CCDT中每个CLNTCONN通道的参数之一是QMNAME 。 了解QMNAME的设置以及您在CCDT中定义了多少个CLNTCONN通道以及您想要完成的内容将有助于确定使用setQueueManager指定的setQueueManager 。 如果只有一个CLNTCONN通道,那么您可以指定以下内容,无论QMNAME属性设置为什么,它都将使用单个通道进行连接: setQueueManager("*"); 如果文件中有多个CLNTCONN通道,每个通 ...
  • 您不会因为访问远程队列而被迫使用XA事务。 如果您的MDB在多个事务资源上执行另一个操作,并且您想要提交所有工作单元或者什么都不提交 (这适用于本地和远程资源),则必须使用XA事务。 至于你的第一个问题:你应该使用CMT,因为它更容易,而BMT总是充当事务障碍:全局事务永远不会使用BMT传播到EJB。 至于你的第二个问题:我不知道有这样做的选择。 我建议将其转换为CMT MDB。 相关: 为什么具有bean管理事务的EJB bean充当“交易障碍” You are not forced to use an ...
  • IBM知识中心有一篇关于此的简短文章 。 没有简单的“一个比另一个好”的答案。 2之间的主要区别是它们提供的API。 有一个合理的论点,你应该根据你最喜欢的API选择使用哪一个。 JMS客户端的MQ类实现JMS 1.1规范和(针对版本8.0或更高版本)JMS 2.0规范。 大多数情况下,这意味着您可以遵循关于如何编写良好的JMS应用程序的非IBM文档。 Web上有很多关于JMS的文档,所以您可以从其他JMS用户的广泛支持中受益。 用于Java客户端的MQ类是用于编写使用IBM MQ的消息传递应用程序的专有I ...
  • 书籍:MQSeries编程模式 一些教程: http : //www.academictutorials.com/jms/jsm-mqseries.asp JMS / MQSeries示例: http : //www-304.ibm.com/jct01005c/isv/tech/sampmq.html#java 安装MQSeries时的一个重要问题http://www.simongbrown.com/blog/2003/11/27/setting_up_jms_with_websphere_mq.html ...
  • 我通过谷歌搜索MQJE001: Completion Code 2, Reason 2019找到了你的问题的答案MQJE001: Completion Code 2, Reason 2019 答案在IBM的支持网站上 。 原因代码2019通常在发生连接中断错误(原因代码2009)之后发生。 您将在SystemOut.log中看到原因代码为2019的原因代码为2009的JMSException。 原因代码2009表明与MQ队列管理器的连接不再有效,通常是由于网络或防火墙问题。 原因代码2009错误发生后,当连 ...
  • JMS API是消息传递API的JavaEE开放标准。 IBM MQ v8现在实现了最新的2.0版JMS标准(MQ 8.0.0.2也具有JMS2.0勘误表)。 WMQ Java类是用于提供消息传递的专有API; 它是基于经典MQ对象的OO,例如QueueManagers和Queues等。有一些功能,例如支持MQ多实例QM和它没有的异步回调。 对于任何新的应用程序,我建议你使用JMS ; 如果你遇到了你真正需要的不在JMS中的功能,请联系(RFE)。 至于XA; 您希望使用的交易协调员是什么? 通过JMS,您 ...
  • BOTHRESH必须大于或等于1 。 将BOTHRESH设置为0会禁用它。 参考IBM的Paul Titheridge 如何处理WebSphere Application Server处理有害消息 。 当WebSphere MQ是JMS提供程序时默认情况下,使用WebSphere MQ创建的队列将Backout阈值属性(在WebSphere MQ术语中称为BOTHRESH)设置为0.因此,WebSphere MQ的缺省行为永远不会退出有害消息。 BOTHRESH must be greater than o ...