保持JMS连接/会话/消费者总是打开一个坏习惯吗?
代码草案示例:
// app startup code
ConnectionFactory cf = (ConnectionFactory)jndiContext.lookup(CF_JNDI_NAME);
Connection connection = cf.createConnection(user,pass);
Session session = connection.createSession(true,Session.TRANSACTIONAL);
MessageConsumer consumer = session.createConsumer(new Queue(queueName));
consumer.setMessageListener(new MyListener());
connection.start();
connection.setExceptionListener(new MyExceptionHandler()); // handle connection error
// ... Message are processed on MyListener asynchronously ...
// app shutdown code
consumer.close();
session.close();
connection.close();
Run Code Online (Sandbox Code Playgroud)
有什么建议可以改善这种JMS使用模式吗?
我无法理解如何在本地使用ActiveMQ.
假设我有2台机器,需要交换一些消息.
在机器上我启动ActiveMQ代理:
> ~/bin/activemq
Run Code Online (Sandbox Code Playgroud)
并使用类似的东西:
javax.naming.Context ctx = new InitialContext();
TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("connectionFactory");
conn = factory.createTopicConnection();
TopicSession session = conn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
Topic topic = null;
try{
topic = (Topic)ctx.lookup("MyTopic");
System.out.println("MyTopic was found");
}catch(NameNotFoundException nnfe){
topic = session.createTopic("MyTopic");
System.out.println("MyTopic was created");
}
TextMessage textMessage = session.createTextMessage();
TopicPublisher publisher = session.createPublisher(topic);
conn.start();
textMessage.setText("My topic message number");
publisher.publish(textMessage);
System.out.println("sendMessage2topic");
Run Code Online (Sandbox Code Playgroud)
我在jndi.properties中的位置:
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
Run Code Online (Sandbox Code Playgroud)
但是我应该在另一台机器上创建什么来订阅这个主题?Shoul我在第二台机器上创建第二个本地ActiveMQ代理,以及如何订阅第一台机器上的远程主题???
我正在准备面试,这需要JMS和JMX,但我没有在这些方面工作.所以需要任何视频教程链接,这可以让我快速了解.谢谢.
是什么原因可以激励程序员在分布式Java应用程序中使用Java JMS(Java消息服务)API而不是java.net包的UDP套接字API,或者使用UDP套接字API代替JMS API?如果可能,请举例说明.
当我检查JBoss日志时,我发现了很多这些错误
2012-03-29 12:01:27,358 WARN @ [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.resources.arjunacore.norecoveryxa] [com.arjuna.ats.internal.jta.resources.arjunacore.norecoveryxa] Could not find new XAResource to use for recovering non-serializable XAResource < 131075, 32, 30, 1--53e2af7c:eff6:4ec11bf7:2e1da4-53e2af7c:eff6:4ec11bf7:2e263d >
2012-03-29 12:01:27,398 WARN @ [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.resources.arjunacore.norecoveryxa] [com.arjuna.ats.internal.jta.resources.arjunacore.norecoveryxa] Could not find new XAResource to use for recovering non-serializable XAResource < 131075, 31, 29, 1--53e2af7c:d397:4e8c1b0e:25b6d-53e2af7c:d397:4e8c1b0e:29d09 >
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试发送JMS消息时,我看到了这个错误:
2012-03-29 12:02:43,778 WARN @ [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.resources.arjunacore.opcerror] [com.arjuna.ats.internal.jta.resources.arjunacore.opcerror] XAResourceRecord.commit_one_phase caught: java.lang.IllegalMonitorStateException
2012-03-29 12:02:43,778 WARN @ [org.springframework.jms.listener.DefaultMessageListenerContainer] Setup of JMS message listener invoker failed for destination 'queue/request' - trying to recover. Cause: …Run Code Online (Sandbox Code Playgroud) 我使用node.js作为jms主题的客户端.有两个协议可用于在主题上建立连接.论文是Stomp和AMQP.我在http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol 和http://en.wikipedia.org/wiki/Streaming_Text_Oriented_Messaging_Protocol上阅读了有关它们的简要介绍.两者似乎都是线路级协议,即通过网络作为八位字节流发送的数据.我没有找到任何应该首选的具体原因.如果有人可以阐明它,那将会很有帮助.
另一点是协议引以为豪的是说它们是可互换的.可互操作的术语是否意味着如果有人想要取消特定的消息代理实现,请说apache active MQ而不是想要插入Websphere MQ,转换将是顺利的(前提是支持AMQP/STOMP或任何其他线路levl协议)?
在消耗来自队列的消息时,相对于队列深度n,应用JMS选择器的算法时间复杂度是多少?特别是,每次读取是否为线性(O(n))?它是依赖于实现的(在JMS提供程序上),是否取决于请求的字段?
(如果依赖于实现,我对Websphere MQ和Solace的行为特别感兴趣,但我欢迎处理任何特定JMS提供程序的答案,特别是如果您有描述复杂性的文档的链接!).
动机:每条消息都有两个属性:a invocationID和a batchName.批处理包含多个调用.客户希望以两种方式之一消费消息; 无论是通过invocationID还是通过batchName.在生成消息时,我不知道它们将被消耗的方法.
这可以通过选择器实现:
invocationID=42
Run Code Online (Sandbox Code Playgroud)
要么
batchName="reconciliation"
Run Code Online (Sandbox Code Playgroud)
...我可以通过使用相关ID而不是自定义属性来加快其中一个,但我担心另一个会保持缓慢.
我正在使用Windows 7OS.我apache-activemq-5.8.0.zip从这些链接下载并在C:\Users\Infratab Bangalore\Desktop\Queueing\apache-activemq-5.8.0目录中解压缩.
在Activemq初始化时,我Pre-Installation Requirements从这些链中读取概念.
我已经安装apache-maven-3.0.5在我的系统中.对于我的构造,我在我的系统中运行以下命令.
mvn -version
Run Code Online (Sandbox Code Playgroud)
我收到以下消息,所以Maven安装成功.
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 19:21:
28+0530)
Maven home: P:\Software\apache-maven-3.0.5
Java version: 1.7.0_21, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_21\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"
Run Code Online (Sandbox Code Playgroud)
我geronimo-spec-corba-1.0.jar从这些链接下载并设置classpth.

我Activemq以下面的方式开始初始化.
C:\Users\Infratab Bangalore\Desktop\Queueing\apache-activemq-5.8.0\bin>activemq
Run Code Online (Sandbox Code Playgroud)
我收到错误,所以我测试了是否61616(Activemq default port no) …
我想知道Java Web套接字和JMS(或ActiveMq)之间有什么区别?请让我知道或有任何来源与WebSocket和JMS的比较以及在哪里使用websocket而不是在哪里使用Activemq而不是websocket请.Activemq是JMS的一个实现.Activemq可能使用Web套接字.如果使用Web套接字来传输消息(包含任何类型的数据)而不是Activemq会怎么样?这可能取决于应用程序和要求的类型,如何一般,并让我轻松地决定使用什么,让我有你的想法(我想在两个Web应用程序之间发送消息,简单,快速和轻量级) .
投票给关闭的人:请考虑帮助,至少让一些人得到帮助,知识而不是避免它.
我希望看到已在ActiveMQ队列中排队的消息内容.我打开了web-console.(http:// localhost:8161/admin/queues.jsp)并点击了队列消息的message-id.它在"消息详细信息"窗口中给出了以下错误,而不是给出消息内容.
"javax.jms.JMSException:无法从内容构建正文.可序列化的类不可用于代理.原因:java.lang.ClassNotFoundException:"
这个异常的原因是什么?我需要做些什么来摆脱这个?