使用哪种协议发送 JMS 消息?
Which protocol to use for sending JMS messages?
我需要一些建议来实施发送消息的最佳协议(不是 http、tcp 等)。
- 我应该发送序列化对象吗? (POJO 的)
- 我应该发送与技术无关的 XML 消息吗?
- 有什么推荐的?
两者都可以,但最佳做法是什么。共享库不是我喜欢的,但是使用 XML 是否容易?有更好的选择吗?提前致谢!
我有一台服务器,连接了 1000 个客户端。服务器将 task 传递给客户端。客户端在执行不同的任务后返回信息。
我应该如何使用一些参数将任务发送到 JMS 客户端?
一个任务只不过是一个动作和一些参数。
- 示例:"action=measure; parameters: duration=100sec; samples=100" --> 在 100 秒内收集 100 个样本。
- 示例:"action=config; parameters: set of configuration parameters" --> 更改客户端配置
- 示例:"action=stop" --> 停止客户端(系统将在每日重启后重新启动)
一份报告只不过是数据。
- 示例:"list of 100 values from measurement"
- 示例:"the content of a log-file"
我看了很多文章,但找不到这个问题的答案。提前致谢。
这是我们当前的实现。
我们用 XSD 定义了一个协议,并让它生成 classes (POJO's)。
这允许我们 marshal/unmarshal 对象并将它们作为 XML 对象发送。
我们的XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<!-- Ping
The server will send a ping to a client and waits for a pong.
****************************************************************** -->
<xs:element name="Ping">
<xs:complexType>
<xs:sequence>
<xs:element name="client" type="xs:string"/>
<xs:element name="message" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Pong
The client will send a pong back to the server.
****************************************************************** -->
<xs:element name="Pong">
<xs:complexType>
<xs:sequence>
<xs:element name="client" type="xs:string"/>
<xs:element name="message" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Alive
The client will send an alive message when it starts up.
The time is local client time.
****************************************************************** -->
<xs:element name="Alive">
<xs:complexType>
<xs:sequence>
<xs:element name="client" type="xs:string"/>
<xs:element name="time" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- ... Many more message definitions ...
****************************************************************** -->
</xs:schema>
我们的测试class:
public class JaxbFacadeTest {
@Test
public void testPing() throws JAXBException, SAXException, UnsupportedEncodingException {
System.out.println("testPing");
Ping ping = new Ping();
ping.setClient("guid-client");
ping.setMessage("Ping Message");
String marshalToString = JaxbFacade.getInstance().marshalToString(ping);
System.out.println(marshalToString);
}
@Test
public void testPong() throws JAXBException, SAXException, UnsupportedEncodingException {
System.out.println("testPong");
Pong pong = new Pong();
pong.setClient("guid-client");
pong.setMessage("Ping Message");
String marshalToString = JaxbFacade.getInstance().marshalToString(pong);
System.out.println(marshalToString);
}
@Test
public void testAlive() throws JAXBException, SAXException, UnsupportedEncodingException {
System.out.println("testAlive");
Date now = new Date();
Alive alive = new Alive();
alive.setClient("guid-client");
alive.setTime(now.toString());
String marshalToString = JaxbFacade.getInstance().marshalToString(alive);
System.out.println(marshalToString);
}
//Many more
}
classes是用maven生成的:
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/xsd</directory>
<targetPath>com/test/package/client/jaxb</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>jaxb</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<generatePackage>com.test.package.client.jaxb</generatePackage>
<schemaDirectory>${project.basedir}/src/main/xsd</schemaDirectory>
</configuration>
</plugin>
</plugins>
</build>
我需要一些建议来实施发送消息的最佳协议(不是 http、tcp 等)。
- 我应该发送序列化对象吗? (POJO 的)
- 我应该发送与技术无关的 XML 消息吗?
- 有什么推荐的? 两者都可以,但最佳做法是什么。共享库不是我喜欢的,但是使用 XML 是否容易?有更好的选择吗?提前致谢!
我有一台服务器,连接了 1000 个客户端。服务器将 task 传递给客户端。客户端在执行不同的任务后返回信息。
我应该如何使用一些参数将任务发送到 JMS 客户端?
一个任务只不过是一个动作和一些参数。
- 示例:"action=measure; parameters: duration=100sec; samples=100" --> 在 100 秒内收集 100 个样本。
- 示例:"action=config; parameters: set of configuration parameters" --> 更改客户端配置
- 示例:"action=stop" --> 停止客户端(系统将在每日重启后重新启动)
一份报告只不过是数据。
- 示例:"list of 100 values from measurement"
- 示例:"the content of a log-file"
我看了很多文章,但找不到这个问题的答案。提前致谢。
这是我们当前的实现。
我们用 XSD 定义了一个协议,并让它生成 classes (POJO's)。 这允许我们 marshal/unmarshal 对象并将它们作为 XML 对象发送。
我们的XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<!-- Ping
The server will send a ping to a client and waits for a pong.
****************************************************************** -->
<xs:element name="Ping">
<xs:complexType>
<xs:sequence>
<xs:element name="client" type="xs:string"/>
<xs:element name="message" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Pong
The client will send a pong back to the server.
****************************************************************** -->
<xs:element name="Pong">
<xs:complexType>
<xs:sequence>
<xs:element name="client" type="xs:string"/>
<xs:element name="message" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Alive
The client will send an alive message when it starts up.
The time is local client time.
****************************************************************** -->
<xs:element name="Alive">
<xs:complexType>
<xs:sequence>
<xs:element name="client" type="xs:string"/>
<xs:element name="time" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- ... Many more message definitions ...
****************************************************************** -->
</xs:schema>
我们的测试class:
public class JaxbFacadeTest {
@Test
public void testPing() throws JAXBException, SAXException, UnsupportedEncodingException {
System.out.println("testPing");
Ping ping = new Ping();
ping.setClient("guid-client");
ping.setMessage("Ping Message");
String marshalToString = JaxbFacade.getInstance().marshalToString(ping);
System.out.println(marshalToString);
}
@Test
public void testPong() throws JAXBException, SAXException, UnsupportedEncodingException {
System.out.println("testPong");
Pong pong = new Pong();
pong.setClient("guid-client");
pong.setMessage("Ping Message");
String marshalToString = JaxbFacade.getInstance().marshalToString(pong);
System.out.println(marshalToString);
}
@Test
public void testAlive() throws JAXBException, SAXException, UnsupportedEncodingException {
System.out.println("testAlive");
Date now = new Date();
Alive alive = new Alive();
alive.setClient("guid-client");
alive.setTime(now.toString());
String marshalToString = JaxbFacade.getInstance().marshalToString(alive);
System.out.println(marshalToString);
}
//Many more
}
classes是用maven生成的:
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/xsd</directory>
<targetPath>com/test/package/client/jaxb</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>jaxb</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<generatePackage>com.test.package.client.jaxb</generatePackage>
<schemaDirectory>${project.basedir}/src/main/xsd</schemaDirectory>
</configuration>
</plugin>
</plugins>
</build>