小编San*_*eru的帖子

动态调用工厂中的正确实现

我有一个解析URL并提取一些数据的库.每个URL有一个类.要知道哪个类应该处理用户提供的URL,我有以下代码.

public class HostExtractorFactory {

private HostExtractorFactory() {
}

public static HostExtractor getHostExtractor(URL url)
        throws URLNotSupportedException {
    String host = url.getHost();

    switch (host) {
    case HostExtractorABC.HOST_NAME:
        return HostExtractorAbc.getInstance();
    case HostExtractorDEF.HOST_NAME:
        return HostExtractorDef.getInstance();
    case HostExtractorGHI.HOST_NAME:
        return HostExtractorGhi.getInstance();
    default:
        throw new URLNotSupportedException(
                "The url provided does not have a corresponding HostExtractor: ["
                        + host + "]");
    }
}
Run Code Online (Sandbox Code Playgroud)

}

问题是用户要求解析更多的URL,这意味着我的switch语句正在增长.每当有人提出解析器时,我都必须修改我的代码以包含它.

为了结束这个,我决定创建一个地图并将它暴露给它们,这样当他们的类被编写时,他们可以通过向工厂提供主机名和提取器来将自己注册到工厂.以下是实施此想法的工厂.

public class HostExtractorFactory {

private static final Map<String, HostExtractor> EXTRACTOR_MAPPING = new HashMap<>();

private HostExtractorFactory() {
}

public static HostExtractor getHostExtractor(URL …
Run Code Online (Sandbox Code Playgroud)

java switch-statement

6
推荐指数
1
解决办法
145
查看次数

JMSListener 选择器不工作

我有一个 JMS 生产者发送两种消息:业务逻辑和心跳消息。目前,两者都由同一个接收器处理,但我现在尝试通过使用选择器为每个接收器提供专用的类。我遇到的问题是,每当我将选择器添加到接收器时,它就会停止接收消息。这是我到目前为止所拥有的。为了简单起见,我只添加了心跳的代码:

要发送消息,我有这个:

private void sendHeartBeat() {
    this.buildTemplate().send(new HeartbeatMessageCreator(this.someId));
}

private JmsTemplate buildTemplate() {
    if (this.cachedJmsTemplate == null) {
        final ActiveMQTopic activeMQTopic = new ActiveMQTopic(this.topic);
        this.cachedJmsTemplate = new JmsTemplate(this.config.getCachedConnectionFactory());
        this.cachedJmsTemplate.setDefaultDestination(activeMQTopic);
        this.cachedJmsTemplate.setPubSubDomain(true);
    }
    return this.cachedJmsTemplate;
}
Run Code Online (Sandbox Code Playgroud)

心跳消息创建者:

class HeartbeatMessageCreator implements MessageCreator {
private final String someID;

HeartbeatMessageCreator(final String someID) {
    this.someID = someID;
}

@Override
public Message createMessage(final Session session) throws JMSException {
    final Serializable message = new ZHeartBeat(this.someID);
    final Message jmsMessage = session.createObjectMessage(message);
    jmsMessage.setJMSType(message.getClass().getName());
    jmsMessage.setStringProperty("InternalMessageType", "HeartBeat"); // <-- Setting …
Run Code Online (Sandbox Code Playgroud)

java jms spring-jms

2
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×2

jms ×1

spring-jms ×1

switch-statement ×1