有谁知道是否有javax.jms.QueueConnectionFactory针对WebSphere MQ 的实现以及从何处获取它?我用Google搜索并搜索了IBM网站但找不到任何内容.我不想通过JNDI从Websphere MQ检索连接或工厂,我需要自己的连接工厂.
我想编写一些代码来监视Websphere 7 MQ上的队列大小.这是我提出的代码
MQEnvironment.hostname = "10.21.1.19";
MQEnvironment.port = 1414;
MQEnvironment.channel = "SYSTEM.CDEF.SVRCONN";
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
MQQueueManager qMgr = new MQQueueManager("MYQMGR");
MQQueue destQueue = qMgr.accessQueue("PUBLISH", MQC.MQOO_INQUIRE);
System.out.println(destQueue.getCurrentDepth());
destQueue.close();
qMgr.disconnect();
Run Code Online (Sandbox Code Playgroud)
我怎么知道"频道"是什么?
我如何知道传递给MQQueueManager的队列管理器名称是什么?
或者我应该看看另一个API?
我需要它与WRS 7 SIB和MQ一起工作.
谢谢Jeff Porter
清除WebSphere MQ中的队列时,使用clear命令和mqget API调用之间的区别是什么?
我在Spring中有以下配置,它工作正常但性能太低(20条消息需要1分钟).你能否建议我改变以提高性能.
<bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="transportType"><value>1</value></property>
<property name="queueManager"><value></value></property>
<property name="hostName"><value></value></property>
<property name="port"><value></value></property>
<property name="channel"><value></value></property>
<property name="clientId"><value></value></property>
</bean>
<bean id="SenderJMSTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory"><ref bean="jmsConnectionFactory" /> </property>
<property name="pubSubDomain"><value>false</value></property>
<property name="defaultDestination"><ref bean="senderQueue" /></property>
</bean>
<bean id="senderQueue" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="TEST" />
<property name="baseQueueManagerName"><value>tree.queue.manager</value></property>
<property name="baseQueueName"><value>ORANGE.QUEUE</value></property>
</bean>
<bean id="jmsSender" class="org.tree.jms.spring.JMSSender">
<property name="jmsTemplate"><ref bean="SenderJMSTemplate"/></property>
</bean>
Run Code Online (Sandbox Code Playgroud)
我是从春天开始打电话的
JMSSender obj = (JMSSender) context.getBean("jmsSender");
Run Code Online (Sandbox Code Playgroud)
我的发件人计划是:
@Cacheable("message")
public void sendMesage() {
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session)throws JMSException {
message = (Message) session.createTextMessage(stringBuffer.toString());
return message;
}
});
} …Run Code Online (Sandbox Code Playgroud) 我需要在Windows机器上安装新的Websphere MQ Server副本.
但是,需要从另一个系统上的Websphere MQ Server迁移队列管理器和其他详细信息.
我从互联网上的挖掘中收集到的是,IBM提供了支持pac(MS03),它提供了功能.可执行文件saveqmgr.exe适用于Windows版本的MQ版本7.0和dmpmqcfg for MQ 7.1.
我的问题是:为了保护队列管理器的详细信息,应该运行什么命令?
此外,在文件中获取所需信息后,如何使用runmqsc命令恢复所有定义?
提前致谢!
您好,我使用
我使用的JMS连接到IBM WebSphere MQ时遇到一个大问题:
我命名为一个QueueManager,命名为test1一个队列,命名为test1q一个协商通道test1channel
StandaloneSender s = new StandaloneSender();
try{
s.send(“hello word”);
}catch (Exception e){
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
import javax.jms.Message;
import javax.jms.QueueConnection;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.NamingException;
public class StandaloneSender {
private P2PUtils utils;
private QueueConnection connection;
private QueueSession session;
private QueueSender sender;
public void send(String message) throws NamingException, JMSException, IOException {
StandaloneSender sender = new StandaloneSender();
sender.connect();
sender.sendMessage(message);
sender.disconnect();
}
public …Run Code Online (Sandbox Code Playgroud) 我想为测试新的QM安装设置一系列测试.他们中的大多数将处于"远程"设置.我希望能够向新QM发送消息并收到回复.有没有办法只使用正常配置(即不使用退出)进行"循环"?
我正在尝试使事务成为整个Spring集成流,流程从适配器开始到IBM MQ Queue,然后我们有一个带有ActiveMQ队列的复杂流程,我得到一个com.atomikos.icatch.HeurHazardException :当atomikos尝试注册资源时的启发式异常.
这是我的applicationContext.xml.
<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName" value="${ibm.mq.connection.url}" />
<property name="port" value="${ibm.mq.connection.port}" />
<property name="transportType" value="${ibm.mq.conection.type}" />
<property name="queueManager" value="${ibm.mq.conection.queuemanager}" />
<property name="channel" value="${ibm.mq.conection.channel}" />
</bean>
<bean id="mqConnectionFactoryCache"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="mqConnectionFactory" />
<property name="sessionCacheSize" value="10" />
<property name="cacheConsumers" value="true"></property>
</bean>
<bean id="mqInboundQueue" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="${ibm.mq.conection.queue}" />
</bean>
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
<!-- brokerURL -->
<property name="brokerURL" value="${active.mq.connection.url}" />
<property name="redeliveryPolicy" ref="amqRedeliveryPolicy"></property>
</bean>
<bean id="amqRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="5"></property>
<property name="redeliveryDelay" value="1000"></property>
</bean>
<bean id="atmConnectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean"
init-method="init" destroy-method="close"> …Run Code Online (Sandbox Code Playgroud) activemq-classic spring-integration atomikos spring-transactions ibm-mq
我已经构建了一个小型Java程序,它使用MQ客户机类与Websphere MQ服务器及其上的队列进行通信.我想要的是以规则的间隔(例如每10秒)查询某个队列的大小,错误深度.
我做了什么,示意图:
qm = new MQQManager()q = qm.accessQueue()depth = q.getCurrentDepth()depth)q.close()qm.close()这就像一个魅力!
出于懒惰,我编写了我的代码,每次都要经历上述序列的所有6个步骤.所以我最后每10秒钟重复这个循环.在大约半小时内,监控服务器的人告诉我,我打开了153个实例.很明显,仅仅close()在队列和QM上进行操作并不足以在我自己之后进行清理.
我将做一个明显的修复并坚持QM并为程序的生命周期排队.但有人可以告诉我为什么我以前的方法是泄漏资源,如果我选择遵循这条道路,我能做些什么呢?
更新(2017-01-25)
时间和接受
Roger提供了一些漂亮的代码和一些有关性能和未提交消息主题的有用解释.这很酷,但Eugene的回答恰好(并且最低限度)足以解决我的问题,而且他的速度要快一些.我根据Eugene的建议改变close()了我的小应用程序现在正在做我想要disconnect()的.对于谁应该获得复选标记我现在有点不知所措了.我向你们两个道歉!
我得到了我想要的东西,我想我已经完成了这个问题,但我应该补充一点,我很欣赏罗杰为这个问题的未来其他读者提供的有用信息的深思熟虑的答案.希望其他人会倾听他的意见而不是跟随我.
性能
说实话,我不会对表现有所了解.服务器比目前所做的要多得多,我的监控客户端(这个问题的主题)运行在通常为空的开发机器上.我希望它会在一两天内达到目的,然后我就把它扔掉.与此同时,如果一个连接每10秒导致一个性能问题,他们应该负载平衡到Raspberry Pi或其他什么.
未提交的消息
我认为这也是一个非问题.发送应用程序在几毫秒内以小批量约1-5条消息排队并立即提交.接收应用程序(我编写的客户端,可能有问题)持续监听队列,单独接收和确认(提交)每条消息.所以我有理由相信,永远不会有超过1条,可能还有5条未经确认的消息.与......的参数相比,这个数字是微不足道的.
我的实际问题,
这涉及到少数几百条消息,每天早上大约在同一时间处理5到20分钟的处理延迟.我怀疑我的接收客户端被一个"挂起"的网络IO操作所阻止,而不是MQS.我想要探索的一个步骤是证明MQS上确实有一个等待消息的队列,并且它没有被接收.我想看看那个队列什么时候开始建立起来,它在那里停留了多长时间以及一旦我的客户再次醒来它会多快消退.
这种连接每天可以看到2,000到10,000条消息,其中的峰值对应于下午和晚上的批处理过程,但延迟只发生在早上,通常实际上只有很小的量.我想查看队列大小的日志,以便更好地了解正在发生的事情.下一步,我可能需要在接收客户端中进行更多的检测.
环境
对于它的价值,服务器正在运行WSMQ 6,因此我的客户端使用阻塞和等待队列获取而不是我更喜欢使用的spiffy异步通知进程.我的接收客户端是在VM中在RHEL下运行的独立C应用程序.
我是IBM MQ的新手,但我查看了IBM的示例并编写了一个可以列出队列名称的Java工具.我正在使用PCFAgent:
PCFAgent agent = new PCFAgent(hostname, port, channelName);
PCFParameter[] parameters = { new MQCFST(CMQC.MQCA_Q_NAME, "*"),
new MQCFIN(CMQC.MQIA_Q_TYPE, CMQC.MQQT_LOCAL)};
MQMessage[] responses = agent.send(CMQCFC.MQCMD_INQUIRE_Q_NAMES, parameters);
MQCFH cfh = new MQCFH(responses[0]);
for (int i = 0; i < cfh.parameterCount; i++) {
System.out.println (PCFParameter.nextParameter (responses [0]));
}
Run Code Online (Sandbox Code Playgroud)
当MQ上没有用户名/密码授权时,这可以正常工作,但是当它到位时,我得到错误RC2035"MQRC_NOT_AUTHORIZED".
是否可以通过以某种方式指定用户名/密码进行身份验证,使用PCFAgent这样?
(或者,是否有另一种方法来验证和列出队列?)